UNPKG

accessdb-parser

Version:

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

112 lines 4.62 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.categorizePages = exports.parseType = exports.DataType = void 0; var uuid_1 = __importDefault(require("uuid")); // @ts-ignore var text_decoding_1 = require("text-decoding"); var DataType; (function (DataType) { DataType[DataType["Boolean"] = 1] = "Boolean"; DataType[DataType["Int8"] = 2] = "Int8"; DataType[DataType["Int16"] = 3] = "Int16"; DataType[DataType["Int32"] = 4] = "Int32"; DataType[DataType["Money"] = 5] = "Money"; DataType[DataType["Float32"] = 6] = "Float32"; DataType[DataType["Float64"] = 7] = "Float64"; DataType[DataType["DateTime"] = 8] = "DateTime"; DataType[DataType["Binary"] = 9] = "Binary"; DataType[DataType["Text"] = 10] = "Text"; DataType[DataType["OLE"] = 11] = "OLE"; DataType[DataType["Memo"] = 12] = "Memo"; DataType[DataType["GUID"] = 15] = "GUID"; DataType[DataType["Bit96Bytes17"] = 16] = "Bit96Bytes17"; DataType[DataType["Complex"] = 18] = "Complex"; })(DataType = exports.DataType || (exports.DataType = {})); var TABLE_PAGE_MAGIC = Buffer.from([0x02, 0x01]); var DATA_PAGE_MAGIC = Buffer.from([0x01, 0x01]); exports.parseType = function (dataType, buffer, length, version) { if (version === void 0) { version = 3; } var parsed = ""; var buf; switch (dataType) { case DataType.Int8: parsed = buffer.readInt8(0); break; case DataType.Int16: parsed = buffer.readInt16LE(0); break; case DataType.Int32: case DataType.Complex: parsed = buffer.readInt32LE(0); break; case DataType.Float32: parsed = buffer.readFloatLE(0); break; case DataType.Float64: parsed = buffer.readDoubleLE(0); break; case DataType.Money: parsed = buffer.readUInt32LE(0) + buffer.readUInt32LE(4) * Math.pow(0x10, 8); break; case DataType.DateTime: var daysPassed = Math.floor(buffer.readDoubleLE(0)); var date = new Date("1899/12/30"); date.setHours(12, 0, 0, 0); date.setDate(date.getDate() + daysPassed); var day = date.getDate(); var month = date.getMonth() + 1; var year = date.getFullYear(); parsed = "" + (day < 10 ? "0" : "") + day + "/" + (month < 10 ? "0" : "") + month + "/" + year; break; case DataType.Binary: parsed = buffer.slice(0, length).toString("utf8"); // Maybe break; case DataType.GUID: parsed = uuid_1.default.stringify(buffer.slice(0, 16)); break; case DataType.Bit96Bytes17: parsed = buffer.slice(0, 17).toString("utf8"); // Maybe break; case DataType.Text: if (version > 3) { var first = Buffer.compare(buffer.slice(0, 2), Buffer.from([0xFE, 0xFF])) === 0; var second = Buffer.compare(buffer.slice(0, 2), Buffer.from([0xFF, 0xFE])) === 0; if (first || second) { parsed = new text_decoding_1.TextDecoder("utf-8") .decode(buffer.slice(2)); } else { parsed = new text_decoding_1.TextDecoder("utf-16le") .decode(buffer); } } else { parsed = buffer.toString("utf8"); } break; } return parsed; }; exports.categorizePages = function (dbData, pageSize) { if (dbData.length % pageSize) throw new Error("DB is not full or pageSize is wrong. pageSize: " + pageSize + " dbData.length: " + dbData.length); var pages = {}; for (var i = 0; i < dbData.length; i += pageSize) pages[i] = dbData.slice(i, i + pageSize); var dataPages = {}; var tableDefs = {}; for (var _i = 0, _a = Object.keys(pages); _i < _a.length; _i++) { var page = _a[_i]; var comp1 = Buffer.compare(DATA_PAGE_MAGIC, pages[page].slice(0, DATA_PAGE_MAGIC.length)) === 0; var comp2 = Buffer.compare(TABLE_PAGE_MAGIC, pages[page].slice(0, TABLE_PAGE_MAGIC.length)) === 0; if (comp1) dataPages[page] = pages[page]; else if (comp2) tableDefs[page] = pages[page]; } return [tableDefs, dataPages, pages]; }; //# sourceMappingURL=utils.js.map