Updating migrations to correctly cover all the required elements.
This commit is contained in:
parent
c509da1f22
commit
cf6f86cb2f
|
@ -8,6 +8,7 @@ import {
|
||||||
DatabaseOpts,
|
DatabaseOpts,
|
||||||
DatabasePutOpts,
|
DatabasePutOpts,
|
||||||
DatabaseQueryOpts,
|
DatabaseQueryOpts,
|
||||||
|
DBError,
|
||||||
Document,
|
Document,
|
||||||
isDocument,
|
isDocument,
|
||||||
RowResponse,
|
RowResponse,
|
||||||
|
@ -41,7 +42,7 @@ function buildNano(couchInfo: { url: string; cookie: string }) {
|
||||||
|
|
||||||
type DBCall<T> = () => Promise<T>
|
type DBCall<T> = () => Promise<T>
|
||||||
|
|
||||||
class CouchDBError extends Error {
|
class CouchDBError extends Error implements DBError {
|
||||||
status: number
|
status: number
|
||||||
statusCode: number
|
statusCode: number
|
||||||
reason: string
|
reason: string
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
@ -107,9 +107,18 @@ async function buildBaseDefinition(): Promise<PreSaveSQLiteDefinition> {
|
||||||
|
|
||||||
export async function syncDefinition(): Promise<void> {
|
export async function syncDefinition(): Promise<void> {
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
|
let rev: string | undefined
|
||||||
|
try {
|
||||||
|
const existing = await db.get(SQLITE_DESIGN_DOC_ID)
|
||||||
|
rev = existing._rev
|
||||||
|
} finally {
|
||||||
const definition = await buildBaseDefinition()
|
const definition = await buildBaseDefinition()
|
||||||
|
if (rev) {
|
||||||
|
definition._rev = rev
|
||||||
|
}
|
||||||
await db.put(definition)
|
await db.put(definition)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function addTable(table: Table) {
|
export async function addTable(table: Table) {
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
|
|
|
@ -30,4 +30,7 @@ export interface SQLiteDefinition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type PreSaveSQLiteDefinition = Omit<SQLiteDefinition, "_rev">
|
export interface PreSaveSQLiteDefinition
|
||||||
|
extends Omit<SQLiteDefinition, "_rev"> {
|
||||||
|
_rev?: string
|
||||||
|
}
|
||||||
|
|
|
@ -165,3 +165,13 @@ export interface Database {
|
||||||
deleteIndex(...args: any[]): Promise<any>
|
deleteIndex(...args: any[]): Promise<any>
|
||||||
getIndexes(...args: any[]): Promise<any>
|
getIndexes(...args: any[]): Promise<any>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DBError extends Error {
|
||||||
|
status: number
|
||||||
|
statusCode: number
|
||||||
|
reason: string
|
||||||
|
name: string
|
||||||
|
errid: string
|
||||||
|
error: string
|
||||||
|
description: string
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue