mdb-reader
Version:
JavaScript library to read data from Access databases
44 lines (43 loc) • 2.07 kB
JavaScript
import { Database } from "../../Database.js";
import { getComplexColumnsData } from "./complexColumnsData.js";
import { getMSysObjectsTable } from "../../systemTables.js";
import { maskTableId } from "../../util.js";
/**
* Resolves (complexTypeId, tableDefinitionPage) to the flat table that stores
* attachment rows for that complex column.
* Throws if the system table is missing or no matching row is found.
*/
export function resolveFlatTableForComplexColumn(database, column) {
const msysObjectsData = getMSysObjectsTable(database).getData({
columns: ["Id", "Name"],
});
const complexColsData = getComplexColumnsData(database);
const tableDefPageMasked = maskTableId(column.complex.tableDefinitionPage);
for (const row of complexColsData) {
const rowFlatTableId = row.FlatTableID;
if (!rowFlatTableId) {
continue;
}
const rowConceptualTableId = row.ConceptualTableID;
const tableMatch = typeof rowConceptualTableId === "number" && rowConceptualTableId === tableDefPageMasked;
if (!tableMatch) {
continue;
}
const complexTypeIdMatch = typeof row.ComplexTypeObjectID === "number" && row.ComplexTypeObjectID === column.complex.typeId;
const complexIdMatch = typeof row.ComplexID === "number" && row.ComplexID === column.complex.typeId;
const columnNameMatch = typeof row.ColumnName === "string" && row.ColumnName.toLowerCase() === column.name.toLowerCase();
if (!complexTypeIdMatch && !complexIdMatch && !columnNameMatch) {
continue;
}
const flatTableId = maskTableId(rowFlatTableId);
const flatTableRow = msysObjectsData.find((r) => maskTableId(r.Id) === flatTableId);
if (!flatTableRow) {
throw new Error(`Flat table not found for complex column ${column.name}`);
}
return {
tableName: flatTableRow.Name,
firstPage: flatTableId,
};
}
throw new Error(`Flat table not found for complex column ${column.name}`);
}