Merge pull request #14144 from Budibase/fix/sqs-no-table-column

Re-sync SQS definitions consistently
This commit is contained in:
Michael Drury 2024-07-11 17:25:35 +01:00 committed by GitHub
commit 03bc545c3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 9 additions and 11 deletions

View File

@ -45,13 +45,10 @@ import {
getTableIDList, getTableIDList,
} from "./filters" } from "./filters"
import { dataFilters } from "@budibase/shared-core" import { dataFilters } from "@budibase/shared-core"
import { DEFAULT_TABLE_IDS } from "../../../../constants"
const builder = new sql.Sql(SqlClient.SQL_LITE) const builder = new sql.Sql(SqlClient.SQL_LITE)
const MISSING_COLUMN_REGEX = new RegExp(`no such column: .+`) const MISSING_COLUMN_REGEX = new RegExp(`no such column: .+`)
const USER_COLUMN_PREFIX_REGEX = new RegExp( const MISSING_TABLE_REGX = new RegExp(`no such table: .+`)
`no such column: .+${USER_COLUMN_PREFIX}`
)
function buildInternalFieldList( function buildInternalFieldList(
table: Table, table: Table,
@ -240,10 +237,10 @@ async function runSqlQuery(
function resyncDefinitionsRequired(status: number, message: string) { function resyncDefinitionsRequired(status: number, message: string) {
// pre data_ prefix on column names, need to resync // pre data_ prefix on column names, need to resync
return ( return (
(status === 400 && message?.match(USER_COLUMN_PREFIX_REGEX)) || // there are tables missing - try a resync
// default tables aren't included in definition (status === 400 && message.match(MISSING_TABLE_REGX)) ||
(status === 400 && // there are columns missing - try a resync
DEFAULT_TABLE_IDS.find(tableId => message?.includes(tableId))) || (status === 400 && message.match(MISSING_COLUMN_REGEX)) ||
// no design document found, needs a full sync // no design document found, needs a full sync
(status === 404 && message?.includes(SQLITE_DESIGN_DOC_ID)) (status === 404 && message?.includes(SQLITE_DESIGN_DOC_ID))
) )
@ -251,7 +248,8 @@ function resyncDefinitionsRequired(status: number, message: string) {
export async function search( export async function search(
options: RowSearchParams, options: RowSearchParams,
table: Table table: Table,
opts?: { retrying?: boolean }
): Promise<SearchResponse<Row>> { ): Promise<SearchResponse<Row>> {
let { paginate, query, ...params } = options let { paginate, query, ...params } = options
@ -376,9 +374,9 @@ export async function search(
return response return response
} catch (err: any) { } catch (err: any) {
const msg = typeof err === "string" ? err : err.message const msg = typeof err === "string" ? err : err.message
if (resyncDefinitionsRequired(err.status, msg)) { if (!opts?.retrying && resyncDefinitionsRequired(err.status, msg)) {
await sdk.tables.sqs.syncDefinition() await sdk.tables.sqs.syncDefinition()
return search(options, table) return search(options, table, { retrying: true })
} }
// previously the internal table didn't error when a column didn't exist in search // previously the internal table didn't error when a column didn't exist in search
if (err.status === 400 && msg?.match(MISSING_COLUMN_REGEX)) { if (err.status === 400 && msg?.match(MISSING_COLUMN_REGEX)) {