UNPKG

accessdb-parser

Version:

A pure javascript Microsoft AccessDB files (.mdb, .accdb) parser

267 lines 8.92 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRelativeObjectMetadataStruct = exports.parseDataPageHeader = exports.parseTableData = exports.parseTableHead = exports.TDEF_HEADER = exports.MEMO = exports.ACCESSHEADER = void 0; var binary_parser_1 = require("binary-parser"); // @ts-ignore var text_decoding_1 = require("text-decoding"); binary_parser_1.Parser.prototype.array = (function (oldArray) { return function (varName, options) { if (options.length === 0) return this.setNextParser("array", varName, options); return oldArray.call(this, varName, options); }; })(binary_parser_1.Parser.prototype.array); exports.ACCESSHEADER = new binary_parser_1.Parser() .seek(4) .string("jetString", { zeroTerminated: true, }) .uint32le("jetVersion") .seek(126); exports.MEMO = new binary_parser_1.Parser() .uint32le("memoLength") .uint32le("recordPointer") .uint32le("memoUnknown") .saveOffset("memoEnd"); var VERSION_3_FLAGS = new binary_parser_1.Parser() .bit1("hyperlink") .bit1("autoGUID") .bit1("unk1") .bit1("replication") .bit1("unk2") .bit1("autonumber") .bit1("canBeNull") .bit1("fixedLength"); var VERSION_4_FLAGS = new binary_parser_1.Parser() .bit1("hyperlink") .bit1("autoGUID") .bit1("unk1") .bit1("replication") .bit1("unk2") .bit1("autonumber") .bit1("canBeNull") .bit1("fixedLength") .bit1("unk3") .bit1("unk4") .bit1("unk5") .bit1("modernPackageType") .bit1("unk6") .bit1("unk7") .bit1("unk8") .bit1("compressedUnicode"); exports.TDEF_HEADER = new binary_parser_1.Parser() .seek(2) .uint16le("peekVersion") .seek(-2) .uint16le("tdefVer") .uint32le("nextPagePtr") .saveOffset("headerEnd"); exports.parseTableHead = function (buffer, version) { if (version === void 0) { version = 3; } return new binary_parser_1.Parser() .nest("TDEF_header", { type: exports.TDEF_HEADER }) .uint32le("tableDefinitionLength") // Conditional .uint32le("ver4Unknown") .seek(version > 3 ? 0 : -4) .uint32le("numberOfRows") .uint32le("autonumber") // Conditional .uint32le("autonumberIncrement") .seek(version > 3 ? 0 : -4) // Conditional .uint32le("complexAutonumber") .seek(version > 3 ? 0 : -4) // Conditional .uint32le("ver4Unknown1") .seek(version > 3 ? 0 : -4) // Conditional .uint32le("ver4Unknown2") .seek(version > 3 ? 0 : -4) .uint8("tableTypeFlags") .uint16le("nextColumnID") .uint16le("variableColumns") .uint16le("columnCount") .uint32le("indexCount") .uint32le("realIndexCount") .uint32le("rowPageMap") .uint32le("freeSpacePageMap") .saveOffset("tDefHeaderEnd") .parse(buffer); }; exports.parseTableData = function (buffer, realIndexCount, columnCount, version) { if (version === void 0) { version = 3; } var REAL_INDEX = new binary_parser_1.Parser() .uint32le("unk1") .uint32le("indexRowCount") .seek(version > 3 ? 0 : -4) // Conditional .uint32le("ver4AlwaysZero"); var VARIOUS_TEXT_V3 = new binary_parser_1.Parser() .uint16le("LCID") .uint16le("codePage") .uint16le("variousText3Unknown"); var VARIOUS_TEXT_V4 = new binary_parser_1.Parser() .uint16le("collation") .uint8("variousText4Unknown") .uint8("collationVersionNumber"); var VARIOUS_TEXT = version === 3 ? VARIOUS_TEXT_V3 : VARIOUS_TEXT_V4; var VARIOUS_DEC_V3 = new binary_parser_1.Parser() .uint16le("variousDec3Unknown") .uint8("maxNumberOfDigits") .uint8("numberOfDecimal") .uint16le("variousDec3Unknown2"); var VARIOUS_DEC_V4 = new binary_parser_1.Parser() .uint8("maxNumOfDigits") .uint8("numOfDecimalDigits") .uint16le("variousDec4Unknown"); var VARIOUS_DEC = version === 3 ? VARIOUS_DEC_V3 : VARIOUS_DEC_V4; var COLUMN = new binary_parser_1.Parser() .uint8("type") // Conditional .uint32le("ver4Unknown3") .seek(version > 3 ? 0 : -4) .uint16le("columnID") .uint16le("variableColumnNumber") .uint16le("columnIndex") .choice("various", { tag: "type", choices: { 1: VARIOUS_DEC, 2: VARIOUS_DEC, 3: VARIOUS_DEC, 4: VARIOUS_DEC, 5: VARIOUS_DEC, 6: VARIOUS_DEC, 7: VARIOUS_DEC, 8: VARIOUS_DEC, 9: VARIOUS_TEXT, 10: VARIOUS_TEXT, 11: VARIOUS_TEXT, 12: VARIOUS_TEXT, }, defaultChoice: new binary_parser_1.Parser().seek(version === 3 ? 6 : 4), }) .choice("columnFlags", { tag: new Function("return " + (version === 3 ? 1 : 0)), choices: { 1: VERSION_3_FLAGS, 0: VERSION_4_FLAGS, }, }) // Conditional .uint32le("ver4Unknown4") .seek(version > 3 ? 0 : -4) .uint16le("fixedOffset") .uint16le("length"); var COLUMN_NAMES_V3 = new binary_parser_1.Parser() .uint8("colNamesLen") .string("colNameStr", { length: "colNamesLen", encoding: "utf8", stripNull: true, }); var COLUMN_NAMES_V4 = new binary_parser_1.Parser() .uint16le("colNamesLen") .buffer("colNameStr", { length: "colNamesLen", }); // .string("colNameStr", { // length: "colNamesLen", // encoding: "utf16", // stripNull: true, // }); var COLUMN_NAMES = version === 3 ? COLUMN_NAMES_V3 : COLUMN_NAMES_V4; var res = new binary_parser_1.Parser() .array("readIndex", { length: realIndexCount, type: REAL_INDEX, }) .array("column", { length: columnCount, type: COLUMN, }) .array("columnNames", { length: columnCount, type: COLUMN_NAMES, }) .parse(buffer); if (version !== 3) { for (var _i = 0, _a = res.columnNames; _i < _a.length; _i++) { var columnName = _a[_i]; var buffer_1 = columnName.colNameStr; columnName.colNameStr = new text_decoding_1.TextDecoder("utf-16le") .decode(buffer_1); } } return res; }; exports.parseDataPageHeader = function (buffer, version) { if (version === void 0) { version = 3; } return new binary_parser_1.Parser() .seek(2) .uint16le("dataFreeSpace") .uint32le("owner") .seek(version > 3 ? 0 : -4) // Conditional .uint32le("ver4UnknownData") .uint16le("recordCount") .array("recordOffsets", { length: "recordCount", type: "uint16le", }) .parse(buffer); }; exports.parseRelativeObjectMetadataStruct = function (buffer, variableJumpTablesCNT, version) { if (variableJumpTablesCNT === void 0) { variableJumpTablesCNT = 0; } if (version === void 0) { version = 3; } if (version === 3) { return new binary_parser_1.Parser() .uint8("variableLengthFieldCount") .array("variableLengthJumpTable", { length: variableJumpTablesCNT, type: "uint8", }) .array("variableLengthFieldOffsets", { length: function () { return this.variableLengthFieldCount; }, type: "uint8", }) .uint8("varLenCount") .saveOffset("relativeMetadataEnd") .parse(buffer); } else { var part1 = new binary_parser_1.Parser() .uint16le("variableLengthFieldCount") .array("variableLengthJumpTable", { length: variableJumpTablesCNT, type: "uint8", }) .saveOffset("part2StartOffset") .parse(buffer); var part2 = new binary_parser_1.Parser() .array("variableLengthFieldOffsets", { length: (part1.variableLengthFieldCount & 0xFF) >>> 0, type: "uint16le", }) .uint16le("varLenCount") .saveOffset("relativeMetadataEnd") .parse(buffer.slice(part1.part2StartOffset)); var result = __assign(__assign({}, part1), part2); return result; } }; //# sourceMappingURL=parsing-primitives.js.map