From cf6f86cb2f4cbf346e5919c63c69cf37c1df256a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 4 Jun 2024 17:24:11 +0100 Subject: [PATCH] Updating migrations to correctly cover all the required elements. --- .../backend-core/src/db/couch/DatabaseImpl.ts | 3 +- .../20231229122514_update_link_documents.ts | 32 ----------- .../20240604153647_update_link_documents.ts | 57 +++++++++++++++++++ .../server/src/sdk/app/tables/internal/sqs.ts | 13 ++++- packages/types/src/documents/app/sqlite.ts | 5 +- packages/types/src/sdk/db.ts | 10 ++++ 6 files changed, 84 insertions(+), 36 deletions(-) delete mode 100644 packages/server/src/appMigrations/migrations/20231229122514_update_link_documents.ts create mode 100644 packages/server/src/appMigrations/migrations/20240604153647_update_link_documents.ts diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 8194d1aabf..1fa1e50e7e 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -8,6 +8,7 @@ import { DatabaseOpts, DatabasePutOpts, DatabaseQueryOpts, + DBError, Document, isDocument, RowResponse, @@ -41,7 +42,7 @@ function buildNano(couchInfo: { url: string; cookie: string }) { type DBCall = () => Promise -class CouchDBError extends Error { +class CouchDBError extends Error implements DBError { status: number statusCode: number reason: string diff --git a/packages/server/src/appMigrations/migrations/20231229122514_update_link_documents.ts b/packages/server/src/appMigrations/migrations/20231229122514_update_link_documents.ts deleted file mode 100644 index adaa0653c4..0000000000 --- a/packages/server/src/appMigrations/migrations/20231229122514_update_link_documents.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { context } from "@budibase/backend-core" -import { allLinkDocs } from "../../db/utils" -import LinkDocumentImpl from "../../db/linkedRows/LinkDocument" - -const migration = async () => { - const linkDocs = await allLinkDocs() - - const docsToUpdate = [] - for (const linkDoc of linkDocs) { - if (linkDoc.tableId) { - // It already had the required data - continue - } - - linkDoc.tableId = new LinkDocumentImpl( - linkDoc.doc1.tableId, - linkDoc.doc1.fieldName, - linkDoc.doc1.rowId, - linkDoc.doc2.tableId, - linkDoc.doc2.fieldName, - linkDoc.doc2.rowId - ).tableId - docsToUpdate.push(linkDoc) - } - - if (docsToUpdate.length) { - const db = context.getAppDB() - await db.bulkDocs(docsToUpdate) - } -} - -export default migration diff --git a/packages/server/src/appMigrations/migrations/20240604153647_update_link_documents.ts b/packages/server/src/appMigrations/migrations/20240604153647_update_link_documents.ts new file mode 100644 index 0000000000..475e7c721c --- /dev/null +++ b/packages/server/src/appMigrations/migrations/20240604153647_update_link_documents.ts @@ -0,0 +1,57 @@ +import { context } from "@budibase/backend-core" +import { allLinkDocs } from "../../db/utils" +import LinkDocumentImpl from "../../db/linkedRows/LinkDocument" +import sdk from "../../sdk" +import env from "../../environment" +import { DBError } from "@budibase/types" + +const migration = async () => { + const linkDocs = await allLinkDocs() + + const docsToUpdate = [] + for (const linkDoc of linkDocs) { + if (linkDoc.tableId) { + // It already had the required data + continue + } + + // it already has the junction table ID - no need to migrate + if (!linkDoc.tableId) { + linkDoc.tableId = new LinkDocumentImpl( + linkDoc.doc1.tableId, + linkDoc.doc1.fieldName, + linkDoc.doc1.rowId, + linkDoc.doc2.tableId, + linkDoc.doc2.fieldName, + linkDoc.doc2.rowId + ).tableId + docsToUpdate.push(linkDoc) + } + } + + const db = context.getAppDB() + if (docsToUpdate.length) { + await db.bulkDocs(docsToUpdate) + } + + // at the end make sure design doc is ready + await sdk.tables.sqs.syncDefinition() + // only do initial search if environment is using SQS already + if (env.SQS_SEARCH_ENABLE) { + const tables = await sdk.tables.getAllInternalTables() + // do these one by one - running in parallel could cause problems + for (let table of tables) { + try { + await db.sql(`select * from ${table._id} limit 1`) + } catch (err) { + if (typeof err === "object") { + const dbErr = err as DBError + throw new Error(`Failed to run initial SQS search - ${dbErr.message}`) + } + throw err + } + } + } +} + +export default migration diff --git a/packages/server/src/sdk/app/tables/internal/sqs.ts b/packages/server/src/sdk/app/tables/internal/sqs.ts index eb57d1f3b8..b0c6f28be7 100644 --- a/packages/server/src/sdk/app/tables/internal/sqs.ts +++ b/packages/server/src/sdk/app/tables/internal/sqs.ts @@ -107,8 +107,17 @@ async function buildBaseDefinition(): Promise { export async function syncDefinition(): Promise { const db = context.getAppDB() - const definition = await buildBaseDefinition() - await db.put(definition) + let rev: string | undefined + try { + const existing = await db.get(SQLITE_DESIGN_DOC_ID) + rev = existing._rev + } finally { + const definition = await buildBaseDefinition() + if (rev) { + definition._rev = rev + } + await db.put(definition) + } } export async function addTable(table: Table) { diff --git a/packages/types/src/documents/app/sqlite.ts b/packages/types/src/documents/app/sqlite.ts index 5636fef15b..516669bd59 100644 --- a/packages/types/src/documents/app/sqlite.ts +++ b/packages/types/src/documents/app/sqlite.ts @@ -30,4 +30,7 @@ export interface SQLiteDefinition { } } -export type PreSaveSQLiteDefinition = Omit +export interface PreSaveSQLiteDefinition + extends Omit { + _rev?: string +} diff --git a/packages/types/src/sdk/db.ts b/packages/types/src/sdk/db.ts index 7ad740ad05..63c37195b7 100644 --- a/packages/types/src/sdk/db.ts +++ b/packages/types/src/sdk/db.ts @@ -165,3 +165,13 @@ export interface Database { deleteIndex(...args: any[]): Promise getIndexes(...args: any[]): Promise } + +export interface DBError extends Error { + status: number + statusCode: number + reason: string + name: string + errid: string + error: string + description: string +}