Adding implementation to DB for purge and cleanup APIs of SQS, to make sure the DB is cleared of any unused tables or rows.

This commit is contained in:
mike12345567 2024-04-19 18:03:38 +01:00
parent a2893ec2cc
commit 8189952f0b
4 changed files with 75 additions and 12 deletions

View File

@ -249,25 +249,53 @@ export class DatabaseImpl implements Database {
}) })
} }
async _sqlQuery<T>(
url: string,
method: "POST" | "GET",
body?: any
): Promise<T> {
const args: { url: string; method: string; cookie: string; body?: any } = {
url: `${this.couchInfo.sqlUrl}/${url}`,
method,
cookie: this.couchInfo.cookie,
}
if (body) {
args.body = body
}
const response = await directCouchUrlCall(body)
if (response.status > 300) {
throw new Error(await response.text())
}
return (await response.json()) as T
}
async sql<T extends Document>( async sql<T extends Document>(
sql: string, sql: string,
parameters?: SqlQueryBinding parameters?: SqlQueryBinding
): Promise<T[]> { ): 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({ return await this._sqlQuery<T[]>(url, "POST", {
url: `${this.couchInfo.sqlUrl}/${url}`, query: sql,
method: "POST", args: parameters,
cookie: this.couchInfo.cookie,
body: {
query: sql,
args: parameters,
},
}) })
if (response.status > 300) { }
throw new Error(await response.text())
// checks design document is accurate (cleans up tables)
async sqlCleanup(): Promise<void> {
const dbName = this.name
const url = `/${dbName}/_cleanup`
return await this._sqlQuery<void>(url, "POST")
}
// removes a document from sqlite
async sqlPurge(docIds: string[] | string): Promise<void> {
if (!Array.isArray(docIds)) {
docIds = [docIds]
} }
return (await response.json()) as T[] const dbName = this.name
const url = `/${dbName}/_purge`
return await this._sqlQuery<void>(url, "POST", { docs: docIds })
} }
async query<T extends Document>( async query<T extends Document>(

View File

@ -160,4 +160,18 @@ export class DDInstrumentedDatabase implements Database {
return this.db.sql(sql, parameters) return this.db.sql(sql, parameters)
}) })
} }
sqlPurge(docIds: string[] | string): Promise<void> {
return tracer.trace("db.sqlPurge", span => {
span?.addTags({ db_name: this.name })
return this.db.sqlPurge(docIds)
})
}
sqlCleanup(): Promise<void> {
return tracer.trace("db.sqlCleanup", span => {
span?.addTags({ db_name: this.name })
return this.db.sqlCleanup()
})
}
} }

View File

@ -118,7 +118,7 @@ export async function addTableToSqlite(table: Table) {
const db = context.getAppDB() const db = context.getAppDB()
let definition: SQLiteDefinition let definition: SQLiteDefinition
try { try {
definition = await db.get(SQLITE_DESIGN_DOC_ID) definition = await db.get<SQLiteDefinition>(SQLITE_DESIGN_DOC_ID)
} catch (err) { } catch (err) {
definition = await buildBaseDefinition() definition = await buildBaseDefinition()
} }
@ -128,3 +128,22 @@ export async function addTableToSqlite(table: Table) {
} }
await db.put(definition) await db.put(definition)
} }
export async function removeTableFromSqlite(table: Table) {
const db = context.getAppDB()
try {
const definition = await db.get<SQLiteDefinition>(SQLITE_DESIGN_DOC_ID)
if (definition.sql?.tables?.[table._id!]) {
delete definition.sql.tables[table._id!]
await db.put(definition)
// make sure SQS is cleaned up, tables removed
await db.sqlCleanup()
}
} catch (err: any) {
if (err?.status === 404) {
return
} else {
throw err
}
}
}

View File

@ -148,6 +148,8 @@ export interface Database {
sql: string, sql: string,
parameters?: SqlQueryBinding parameters?: SqlQueryBinding
): Promise<T[]> ): Promise<T[]>
sqlPurge(docIds: string[] | string): Promise<void>
sqlCleanup(): Promise<void>
allDocs<T extends Document | RowValue>( allDocs<T extends Document | RowValue>(
params: DatabaseQueryOpts params: DatabaseQueryOpts
): Promise<AllDocsResponse<T>> ): Promise<AllDocsResponse<T>>