UNPKG

mdb-reader

Version:

JavaScript library to read data from Access databases

52 lines (51 loc) 1.79 kB
import { Database } from "../Database.js"; const TYPES = { THIS_PAGE: 0x80, OTHER_PAGE: 0x40, OTHER_PAGES: 0x00, }; /** * @see https://github.com/brianb/mdbtools/blob/d6f5745d949f37db969d5f424e69b54f0da60b9b/src/libmdb/data.c#L626-L688 * @see https://github.com/spannm/jackcess/blob/4c433a4ae4969ff5658556806a35ccb13cc35313/src/main/java/io/github/spannm/jackcess/impl/LongValueColumnImpl.java#L130-L209 */ export function readOLE(buffer, _col, database) { const length = buffer.readUIntLE(0, 3); const type = buffer.readUInt8(3); switch (type) { case TYPES.THIS_PAGE: { // 0-2: Length // 3: Type // 4-7: lval_dp // 8-11: unknown // 12: data // inline return buffer.slice(12, 12 + length); } case TYPES.OTHER_PAGE: { // single page const pageRow = buffer.readUInt32LE(4); const rowBuffer = database.findPageRow(pageRow); return rowBuffer.slice(0, length); } case TYPES.OTHER_PAGES: { // multi page let pageRow = buffer.readInt32LE(4); const result = Buffer.alloc(length); let offset = 0; do { const rowBuffer = database.findPageRow(pageRow); if (rowBuffer.length <= 4) { break; } pageRow = rowBuffer.readUInt32LE(0); const newChunk = rowBuffer.subarray(4); newChunk.copy(result, offset); offset += newChunk.length; } while (pageRow !== 0); return result.subarray(0, length); } default: { throw new Error(`Unknown OLE type ${type}`); } } }