1
0
Fork 0
mirror of synced 2024-07-05 14:31:17 +12:00

Adding support for SQS prepared statement API.

This commit is contained in:
mike12345567 2024-04-10 17:36:57 +01:00
parent f7f7ee1a70
commit 20da8bb816
4 changed files with 24 additions and 8 deletions

View file

@ -12,6 +12,7 @@ import {
isDocument, isDocument,
RowResponse, RowResponse,
RowValue, RowValue,
SqlQueryBinding,
} from "@budibase/types" } from "@budibase/types"
import { getCouchInfo } from "./connections" import { getCouchInfo } from "./connections"
import { directCouchUrlCall } from "./utils" import { directCouchUrlCall } from "./utils"
@ -248,14 +249,20 @@ export class DatabaseImpl implements Database {
}) })
} }
async sql<T extends Document>(sql: string): Promise<T[]> { async sql<T extends Document>(
sql: string,
parameters?: SqlQueryBinding
): Promise<T[]> {
const dbName = this.name const dbName = this.name
const url = `/${dbName}/${SQLITE_DESIGN_DOC_ID}` const url = `/${dbName}/${SQLITE_DESIGN_DOC_ID}`
const response = await directCouchUrlCall({ const response = await directCouchUrlCall({
url: `${this.couchInfo.sqlUrl}/${url}`, url: `${this.couchInfo.sqlUrl}/${url}`,
method: "POST", method: "POST",
cookie: this.couchInfo.cookie, cookie: this.couchInfo.cookie,
body: sql, body: {
query: sql,
args: parameters,
},
}) })
if (response.status > 300) { if (response.status > 300) {
throw new Error(await response.text()) throw new Error(await response.text())

View file

@ -13,6 +13,7 @@ import {
DatabaseQueryOpts, DatabaseQueryOpts,
Document, Document,
RowValue, RowValue,
SqlQueryBinding,
} from "@budibase/types" } from "@budibase/types"
import tracer from "dd-trace" import tracer from "dd-trace"
import { Writable } from "stream" import { Writable } from "stream"
@ -150,10 +151,13 @@ export class DDInstrumentedDatabase implements Database {
}) })
} }
sql<T extends Document>(sql: string): Promise<T[]> { sql<T extends Document>(
sql: string,
parameters?: SqlQueryBinding
): Promise<T[]> {
return tracer.trace("db.sql", span => { return tracer.trace("db.sql", span => {
span?.addTags({ db_name: this.name }) span?.addTags({ db_name: this.name })
return this.db.sql(sql) return this.db.sql(sql, parameters)
}) })
} }
} }

View file

@ -11,6 +11,7 @@ import {
SortOrder, SortOrder,
SortType, SortType,
Table, Table,
SqlQuery,
} from "@budibase/types" } from "@budibase/types"
import SqlQueryBuilder from "../../../../integrations/base/sql" import SqlQueryBuilder from "../../../../integrations/base/sql"
import { SqlClient } from "../../../../integrations/utils" import { SqlClient } from "../../../../integrations/utils"
@ -156,21 +157,21 @@ export async function search(
try { try {
const query = builder._query(request, { const query = builder._query(request, {
disableReturning: true, disableReturning: true,
disableBindings: true,
}) })
if (Array.isArray(query)) { if (Array.isArray(query)) {
throw new Error("SQS cannot currently handle multiple queries") throw new Error("SQS cannot currently handle multiple queries")
} }
let sql = query.sql let sql = query.sql,
bindings = query.bindings
// quick hack for docIds // quick hack for docIds
sql = sql.replace(/`doc1`.`rowId`/g, "`doc1.rowId`") sql = sql.replace(/`doc1`.`rowId`/g, "`doc1.rowId`")
sql = sql.replace(/`doc2`.`rowId`/g, "`doc2.rowId`") sql = sql.replace(/`doc2`.`rowId`/g, "`doc2.rowId`")
const db = context.getAppDB() const db = context.getAppDB()
const rows = await db.sql<Row>(sql) const rows = await db.sql<Row>(sql, bindings)
return { return {
rows: await sqlOutputProcessing( rows: await sqlOutputProcessing(

View file

@ -4,6 +4,7 @@ import {
AnyDocument, AnyDocument,
Document, Document,
RowValue, RowValue,
SqlQueryBinding,
ViewTemplateOpts, ViewTemplateOpts,
} from "../" } from "../"
import { Writable } from "stream" import { Writable } from "stream"
@ -143,7 +144,10 @@ export interface Database {
opts?: DatabasePutOpts opts?: DatabasePutOpts
): Promise<Nano.DocumentInsertResponse> ): Promise<Nano.DocumentInsertResponse>
bulkDocs(documents: AnyDocument[]): Promise<Nano.DocumentBulkResponse[]> bulkDocs(documents: AnyDocument[]): Promise<Nano.DocumentBulkResponse[]>
sql<T extends Document>(sql: string): Promise<T[]> sql<T extends Document>(
sql: string,
parameters?: SqlQueryBinding
): Promise<T[]>
allDocs<T extends Document | RowValue>( allDocs<T extends Document | RowValue>(
params: DatabaseQueryOpts params: DatabaseQueryOpts
): Promise<AllDocsResponse<T>> ): Promise<AllDocsResponse<T>>