concept BigDB { S name; } concept BigEntry { new Ref db; S globalID; long fileNr, headerStart, start, length; S text() { ret bigDB_getText(this); } toString { ret "BigEntry " + globalID; } } sbool bigDB_inited; svoid bigDB() { lock dbLock(); if (bigDB_inited) ret; bigDB_inited = true; dbIndexing(BigEntry, 'globalID); uniq(BigDB, name := ""); } static BigEntry bigDB_newStringEntry(S text) { lock dbLock(); long fileNr = bigDB_fileNrToAppendTo(); S globalID = aGlobalID(); File file = bigDB_file(fileNr); long length = fileSize(file); long l = lUtf8(text); S header = globalID + " " + l + "\n"; long start = length + lUtf8(header); appendToTextFile(file, header + text + "\n"); ret cnew(BigEntry, db := uniq(BigDB, name := ""), +globalID, +fileNr, headerStart := length, +start, length := l); } static long bigDB_fileNrToAppendTo() { ret 1; } static File bigDB_file(BigDB db, long nr) { ret getProgramFile("db." + urlencode(appendIfNempty(unnull(db.name), ".")) + nr); } static S bigDB_getText(BigEntry entry) { File f = db_file(entry.db, entry.fileNr); ret fromUtf8(loadBinaryFilePart(f, entry.start, entry.start+entry.length)); }