Skip to content

Commit b6e9a80

Browse files
committed
chore: add basic SQL support (sqlExec, sqlQuery, listTables)
1 parent 2d7b82d commit b6e9a80

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

src/client.ts

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class ImmudbClient {
8888
return new Promise((resolve) => resolve(ImmudbClient.instance));
8989
} catch (err) {
9090
await ImmudbClient.instance.shutdown();
91+
9192
return new Promise((_, reject) => reject(err));
9293
}
9394
}
@@ -1650,6 +1651,174 @@ class ImmudbClient {
16501651
console.error(err);
16511652
}
16521653
}
1654+
1655+
async SQLExec ({ sql, paramsList, nowait }: Parameters.SQLExec): Promise<schemaTypes.SQLExecResult.AsObject | undefined > {
1656+
try {
1657+
const req = new schemaTypes.SQLExecRequest();
1658+
1659+
const sqlParamsList = paramsList.map(({ name, value = null }) => {
1660+
const param = new schemaTypes.NamedParam();
1661+
1662+
param.setName(name)
1663+
1664+
if (value !== null) {
1665+
const sqlValue = new schemaTypes.SQLValue();
1666+
const { pb_null, n, s, b, bs } = value;
1667+
1668+
sqlValue.setNull(pb_null);
1669+
sqlValue.setN(n);
1670+
sqlValue.setS(s);
1671+
sqlValue.setB(b);
1672+
sqlValue.setBs(bs);
1673+
1674+
param.setValue(sqlValue)
1675+
}
1676+
1677+
return param;
1678+
});
1679+
1680+
req.setParamsList(sqlParamsList);
1681+
req.setSql(sql);
1682+
req.setNowait(nowait);
1683+
1684+
return new Promise((resolve, reject) => this.client.sQLExec(req, this._metadata, (err, res) => {
1685+
if (err) {
1686+
console.error('SQLExec error', err)
1687+
1688+
reject(err)
1689+
} else {
1690+
const ctxsList = res
1691+
.getCtxsList()
1692+
.map(txMetadata => ({
1693+
id: txMetadata.getId(),
1694+
prevalh: util.getAlh(txMetadata),
1695+
ts: txMetadata.getTs(),
1696+
nentries: txMetadata.getNentries(),
1697+
eh: txMetadata.getEh(),
1698+
bltxid: txMetadata.getBltxid(),
1699+
blroot: txMetadata.getBlroot(),
1700+
}))
1701+
const dtxsList = res
1702+
.getCtxsList()
1703+
.map(txMetadata => ({
1704+
id: txMetadata.getId(),
1705+
prevalh: util.getAlh(txMetadata),
1706+
ts: txMetadata.getTs(),
1707+
nentries: txMetadata.getNentries(),
1708+
eh: txMetadata.getEh(),
1709+
bltxid: txMetadata.getBltxid(),
1710+
blroot: txMetadata.getBlroot(),
1711+
}))
1712+
1713+
resolve({
1714+
ctxsList,
1715+
dtxsList,
1716+
})
1717+
}
1718+
}))
1719+
} catch(err) {
1720+
console.error(err);
1721+
}
1722+
}
1723+
1724+
async SQLQuery ({ sql, paramsList, reusesnapshot }: Parameters.SQLQuery): Promise<schemaTypes.SQLQueryResult.AsObject | undefined> {
1725+
try {
1726+
const req = new schemaTypes.SQLQueryRequest();
1727+
1728+
const sqlParamsList = paramsList.map(({ name, value = null }) => {
1729+
const param = new schemaTypes.NamedParam();
1730+
1731+
param.setName(name)
1732+
1733+
if (value !== null) {
1734+
const sqlValue = new schemaTypes.SQLValue();
1735+
const { pb_null, n, s, b, bs } = value;
1736+
1737+
sqlValue.setNull(pb_null);
1738+
sqlValue.setN(n);
1739+
sqlValue.setS(s);
1740+
sqlValue.setB(b);
1741+
sqlValue.setBs(bs);
1742+
1743+
param.setValue(sqlValue)
1744+
}
1745+
1746+
return param;
1747+
});
1748+
1749+
req.setSql(sql);
1750+
req.setParamsList(sqlParamsList);
1751+
req.setReusesnapshot(reusesnapshot);
1752+
1753+
return new Promise((resolve, reject) => this.client.sQLQuery(req, this._metadata, (err, res) => {
1754+
if (err) {
1755+
console.error('SQLQuery error', err)
1756+
1757+
reject(err)
1758+
} else {
1759+
const columnsList = res
1760+
.getColumnsList()
1761+
.map(column => column.toObject());
1762+
const rowsList = res
1763+
.getRowsList()
1764+
.map(row => {
1765+
const valuesList = row
1766+
.getValuesList()
1767+
.map(value => value.toObject());
1768+
1769+
return {
1770+
columnsList: row.getColumnsList(),
1771+
valuesList
1772+
}
1773+
});
1774+
1775+
resolve({
1776+
columnsList,
1777+
rowsList,
1778+
})
1779+
}
1780+
}))
1781+
} catch(err) {
1782+
console.error(err);
1783+
}
1784+
}
1785+
1786+
async listTables (): Promise<schemaTypes.SQLQueryResult.AsObject | undefined> {
1787+
try {
1788+
const req = new empty.Empty()
1789+
1790+
return new Promise((resolve, reject) => this.client.listTables(req, this._metadata, (err, res) => {
1791+
if (err) {
1792+
console.error('listTables error', err);
1793+
1794+
reject(err);
1795+
} else {
1796+
const columnsList = res
1797+
.getColumnsList()
1798+
.map(column => column.toObject());
1799+
const rowsList = res
1800+
.getRowsList()
1801+
.map(row => {
1802+
const valuesList = row
1803+
.getValuesList()
1804+
.map(value => value.toObject());
1805+
1806+
return {
1807+
columnsList: row.getColumnsList(),
1808+
valuesList
1809+
}
1810+
});
1811+
1812+
resolve({
1813+
columnsList,
1814+
rowsList,
1815+
})
1816+
}
1817+
}))
1818+
} catch(err) {
1819+
console.error(err);
1820+
}
1821+
}
16531822
}
16541823

16551824
export default ImmudbClient;

types/parameters.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ export namespace Parameters {
9191
export type VerifiedZAddAt = ZAddAt
9292
export type VerifiedSetReference = SetReference
9393
export type VerifiedSetReferenceAt = SetReferenceAt
94+
export type SQLExec = schemaTypes.SQLExecRequest.AsObject
95+
export type SQLQuery = schemaTypes.SQLQueryRequest.AsObject
9496
}
9597

9698

0 commit comments

Comments
 (0)