pixl-server-storage 4.0.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/engines/SQLite.js +62 -53
- package/package.json +4 -4
- package/test/config.json +7 -0
- package/test/data/backups/backup-2026-02-15-18-10-21.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-10-33.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-10-45.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-10-58.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-11-10.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-11-23.db.gz +0 -0
- package/test/data/backups/backup-2026-02-15-18-11-35.db.gz +0 -0
- package/test/test-indexer.js +12 -2
- package/test/test.js +12 -0
- package/test/data/sqlite.db +0 -0
package/engines/SQLite.js
CHANGED
|
@@ -148,18 +148,19 @@ module.exports = Class.create({
|
|
|
148
148
|
process.nextTick(function() {
|
|
149
149
|
try {
|
|
150
150
|
self.db.prepare(self.commands.put).run({ key: key, value: value, now: now });
|
|
151
|
-
self.logDebug(9, "Store complete: " + key);
|
|
152
|
-
// possibly cache in LRU
|
|
153
|
-
if (self.cache && !is_binary) {
|
|
154
|
-
self.cache.set( key, value, { date: Tools.timeNow(true) } );
|
|
155
|
-
}
|
|
156
|
-
if (callback) callback(null);
|
|
157
151
|
}
|
|
158
152
|
catch (err) {
|
|
159
153
|
err.message = "Failed to store object: " + key + ": " + err;
|
|
160
154
|
self.logError('sqlite', '' + err);
|
|
161
155
|
if (callback) callback(err);
|
|
162
156
|
}
|
|
157
|
+
|
|
158
|
+
self.logDebug(9, "Store complete: " + key);
|
|
159
|
+
// possibly cache in LRU
|
|
160
|
+
if (self.cache && !is_binary) {
|
|
161
|
+
self.cache.set( key, value, { date: Tools.timeNow(true) } );
|
|
162
|
+
}
|
|
163
|
+
if (callback) callback(null);
|
|
163
164
|
});
|
|
164
165
|
},
|
|
165
166
|
|
|
@@ -200,20 +201,22 @@ module.exports = Class.create({
|
|
|
200
201
|
} // cache
|
|
201
202
|
|
|
202
203
|
process.nextTick(function() {
|
|
204
|
+
var row = null;
|
|
203
205
|
try {
|
|
204
|
-
|
|
205
|
-
if (!row) {
|
|
206
|
-
var err = new Error("Failed to head key: " + key + ": Not found");
|
|
207
|
-
err.code = "NoSuchKey";
|
|
208
|
-
return callback(err, null);
|
|
209
|
-
}
|
|
210
|
-
callback(null, { mod: row.modified, len: row['length(value)'] });
|
|
206
|
+
row = self.db.prepare(self.commands.head).get({ key: key });
|
|
211
207
|
}
|
|
212
208
|
catch (err) {
|
|
213
209
|
err.message = "Failed to head key: " + key + ": " + err;
|
|
214
210
|
self.logError('sqlite', '' + err);
|
|
215
211
|
callback(err);
|
|
216
212
|
}
|
|
213
|
+
|
|
214
|
+
if (!row) {
|
|
215
|
+
var err = new Error("Failed to head key: " + key + ": Not found");
|
|
216
|
+
err.code = "NoSuchKey";
|
|
217
|
+
return callback(err, null);
|
|
218
|
+
}
|
|
219
|
+
callback(null, { mod: row.modified, len: row['length(value)'] });
|
|
217
220
|
});
|
|
218
221
|
},
|
|
219
222
|
|
|
@@ -245,34 +248,36 @@ module.exports = Class.create({
|
|
|
245
248
|
this.logDebug(9, "Fetching SQLite Object: " + key);
|
|
246
249
|
|
|
247
250
|
process.nextTick(function() {
|
|
251
|
+
var row = null;
|
|
248
252
|
try {
|
|
249
|
-
|
|
250
|
-
if (!row) {
|
|
251
|
-
var err = new Error("Failed to fetch key: " + key + ": Not found");
|
|
252
|
-
err.code = "NoSuchKey";
|
|
253
|
-
return callback(err, null);
|
|
254
|
-
}
|
|
255
|
-
if (is_binary) {
|
|
256
|
-
self.logDebug(9, "Binary fetch complete: " + key, '' + row.value.length + ' bytes');
|
|
257
|
-
return callback(null, row.value);
|
|
258
|
-
}
|
|
259
|
-
if (self.cache) {
|
|
260
|
-
self.cache.set( key, row.value, { date: Tools.timeNow(true) } );
|
|
261
|
-
}
|
|
262
|
-
var json = null;
|
|
263
|
-
try { json = JSON.parse( row.value.toString() ); }
|
|
264
|
-
catch (err) {
|
|
265
|
-
self.logError('sqlite', "Failed to parse JSON record: " + key + ": " + err);
|
|
266
|
-
return callback(err, null);
|
|
267
|
-
}
|
|
268
|
-
self.logDebug(9, "JSON fetch complete: " + key, self.debugLevel(10) ? json : null);
|
|
269
|
-
callback(null, json);
|
|
253
|
+
row = self.db.prepare(self.commands.get).get({ key: key });
|
|
270
254
|
}
|
|
271
255
|
catch (err) {
|
|
272
256
|
err.message = "Failed to fetch key: " + key + ": " + err;
|
|
273
257
|
self.logError('sqlite', '' + err);
|
|
274
258
|
callback(err);
|
|
275
259
|
}
|
|
260
|
+
|
|
261
|
+
if (!row) {
|
|
262
|
+
var err = new Error("Failed to fetch key: " + key + ": Not found");
|
|
263
|
+
err.code = "NoSuchKey";
|
|
264
|
+
return callback(err, null);
|
|
265
|
+
}
|
|
266
|
+
if (is_binary) {
|
|
267
|
+
self.logDebug(9, "Binary fetch complete: " + key, '' + row.value.length + ' bytes');
|
|
268
|
+
return callback(null, row.value);
|
|
269
|
+
}
|
|
270
|
+
if (self.cache) {
|
|
271
|
+
self.cache.set( key, row.value, { date: Tools.timeNow(true) } );
|
|
272
|
+
}
|
|
273
|
+
var json = null;
|
|
274
|
+
try { json = JSON.parse( row.value.toString() ); }
|
|
275
|
+
catch (err) {
|
|
276
|
+
self.logError('sqlite', "Failed to parse JSON record: " + key + ": " + err);
|
|
277
|
+
return callback(err, null);
|
|
278
|
+
}
|
|
279
|
+
self.logDebug(9, "JSON fetch complete: " + key, self.debugLevel(10) ? json : null);
|
|
280
|
+
callback(null, json);
|
|
276
281
|
});
|
|
277
282
|
},
|
|
278
283
|
|
|
@@ -284,21 +289,23 @@ module.exports = Class.create({
|
|
|
284
289
|
this.logDebug(9, "Fetching SQLite Object: " + key);
|
|
285
290
|
|
|
286
291
|
process.nextTick(function() {
|
|
292
|
+
var row = null;
|
|
287
293
|
try {
|
|
288
|
-
|
|
289
|
-
if (!row) {
|
|
290
|
-
var err = new Error("Failed to fetch key: " + key + ": Not found");
|
|
291
|
-
err.code = "NoSuchKey";
|
|
292
|
-
return callback(err, null);
|
|
293
|
-
}
|
|
294
|
-
self.logDebug(9, "Binary fetch complete: " + key, '' + row.value.length + ' bytes');
|
|
295
|
-
callback(null, row.value);
|
|
294
|
+
row = self.db.prepare(self.commands.get).get({ key: key });
|
|
296
295
|
}
|
|
297
296
|
catch (err) {
|
|
298
297
|
err.message = "Failed to fetch key: " + key + ": " + err;
|
|
299
298
|
self.logError('sqlite', '' + err);
|
|
300
299
|
callback(err);
|
|
301
300
|
}
|
|
301
|
+
|
|
302
|
+
if (!row) {
|
|
303
|
+
var err = new Error("Failed to fetch key: " + key + ": Not found");
|
|
304
|
+
err.code = "NoSuchKey";
|
|
305
|
+
return callback(err, null);
|
|
306
|
+
}
|
|
307
|
+
self.logDebug(9, "Binary fetch complete: " + key, '' + row.value.length + ' bytes');
|
|
308
|
+
callback(null, row.value);
|
|
302
309
|
});
|
|
303
310
|
},
|
|
304
311
|
|
|
@@ -377,23 +384,25 @@ module.exports = Class.create({
|
|
|
377
384
|
this.logDebug(9, "Deleting SQLite Object: " + key);
|
|
378
385
|
|
|
379
386
|
process.nextTick(function() {
|
|
387
|
+
var info = null;
|
|
380
388
|
try {
|
|
381
|
-
|
|
382
|
-
if (!info.changes) {
|
|
383
|
-
var err = new Error("Failed to delete object: " + key + ": Not found");
|
|
384
|
-
err.code = "NoSuchKey";
|
|
385
|
-
return callback(err);
|
|
386
|
-
}
|
|
387
|
-
self.logDebug(9, "Delete complete: " + key);
|
|
388
|
-
if (self.cache && self.cache.has(key)) {
|
|
389
|
-
self.cache.delete(key);
|
|
390
|
-
}
|
|
391
|
-
callback();
|
|
389
|
+
info = self.db.prepare(self.commands.delete).run({ key: key });
|
|
392
390
|
}
|
|
393
391
|
catch (err) {
|
|
394
392
|
self.logError('sqlite', "Failed to delete object: " + key + ": " + err);
|
|
395
393
|
callback(err);
|
|
396
394
|
}
|
|
395
|
+
|
|
396
|
+
if (!info.changes) {
|
|
397
|
+
var err = new Error("Failed to delete object: " + key + ": Not found");
|
|
398
|
+
err.code = "NoSuchKey";
|
|
399
|
+
return callback(err);
|
|
400
|
+
}
|
|
401
|
+
self.logDebug(9, "Delete complete: " + key);
|
|
402
|
+
if (self.cache && self.cache.has(key)) {
|
|
403
|
+
self.cache.delete(key);
|
|
404
|
+
}
|
|
405
|
+
callback();
|
|
397
406
|
});
|
|
398
407
|
},
|
|
399
408
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pixl-server-storage",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
4
4
|
"description": "A key/value/list storage component for the pixl-server framework.",
|
|
5
5
|
"author": "Joseph Huckaby <jhuckaby@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/jhuckaby/pixl-server-storage",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"sqlite"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@aws-sdk/client-s3": "3.
|
|
26
|
-
"@aws-sdk/lib-storage": "3.
|
|
27
|
-
"@smithy/node-http-handler": "3.
|
|
25
|
+
"@aws-sdk/client-s3": "3.995.0",
|
|
26
|
+
"@aws-sdk/lib-storage": "3.995.0",
|
|
27
|
+
"@smithy/node-http-handler": "3.3.3",
|
|
28
28
|
"async": "2.6.4",
|
|
29
29
|
"fast-stream-to-buffer": "1.0.0",
|
|
30
30
|
"he": "1.1.1",
|
package/test/config.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/test-indexer.js
CHANGED
|
@@ -9,8 +9,11 @@ var cp = require('child_process');
|
|
|
9
9
|
var async = require('async');
|
|
10
10
|
var Tools = require('pixl-tools');
|
|
11
11
|
|
|
12
|
+
var sample_tickets = null;
|
|
13
|
+
var fixtures = null;
|
|
14
|
+
|
|
12
15
|
var sample_data = require('./sample-data.json');
|
|
13
|
-
var
|
|
16
|
+
var orig_sample_tickets = sample_data.Ticket;
|
|
14
17
|
|
|
15
18
|
var index_config = {
|
|
16
19
|
base_path: "/index/ontrack",
|
|
@@ -50,7 +53,7 @@ var index_config = {
|
|
|
50
53
|
remove_words: ["the","of","and","a","to","in","is","you","that","it","he","was","for","on","are","as","with","his","they","I","at","be","this","have","from","or","one","had","by","word","but","not","what","all","were","we","when","your","can","said","there","use","an","each","which","she","do","how","their","if","will","up","other","about","out","many","then","them","these","so","some","her","would","make","like","him","into","time","has","look","two","more","write","go","see","number","no","way","could","people","my","than","first","water","been","call","who","oil","its","now","find","long","down","day","did","get","come","made","may","part"]
|
|
51
54
|
};
|
|
52
55
|
|
|
53
|
-
var
|
|
56
|
+
var orig_fixtures = {
|
|
54
57
|
searchRecordsExact2: {
|
|
55
58
|
'title:"Released to Preproduction"': { "2653": 1, "2654": 1, "2659": 1, "2662": 1, "2665": 1 },
|
|
56
59
|
'status:open title:"Released to Preproduction"': { "2653": 1, "2654": 1 },
|
|
@@ -317,6 +320,13 @@ var fixtures = {
|
|
|
317
320
|
|
|
318
321
|
module.exports = {
|
|
319
322
|
tests: [
|
|
323
|
+
|
|
324
|
+
function resetFixtures(test) {
|
|
325
|
+
fixtures = Tools.copyHash( orig_fixtures, true );
|
|
326
|
+
sample_tickets = Tools.copyHash( orig_sample_tickets, true );
|
|
327
|
+
test.ok( true );
|
|
328
|
+
test.done();
|
|
329
|
+
},
|
|
320
330
|
|
|
321
331
|
// insert record
|
|
322
332
|
|
package/test/test.js
CHANGED
|
@@ -51,6 +51,7 @@ module.exports = {
|
|
|
51
51
|
|
|
52
52
|
// override Filesystem base dir to go somewhere more sane
|
|
53
53
|
if (storage_config.Filesystem) storage_config.Filesystem.base_dir = base_data_dir;
|
|
54
|
+
if (storage_config.SQLite) storage_config.SQLite.base_dir = base_data_dir;
|
|
54
55
|
});
|
|
55
56
|
|
|
56
57
|
// delete old unit test log
|
|
@@ -58,6 +59,7 @@ module.exports = {
|
|
|
58
59
|
// startup mock server
|
|
59
60
|
server.startup( function() {
|
|
60
61
|
// startup complete
|
|
62
|
+
server.logger.debug(9, "BASE DIR: " + base_data_dir);
|
|
61
63
|
|
|
62
64
|
// write log in sync mode, for troubleshooting
|
|
63
65
|
server.logger.set('sync', true);
|
|
@@ -90,6 +92,16 @@ module.exports = {
|
|
|
90
92
|
// finally add indexer tests
|
|
91
93
|
self.tests = self.tests.concat( indexerTests.tests );
|
|
92
94
|
|
|
95
|
+
// log memory usage at end
|
|
96
|
+
self.tests.push( function(test) {
|
|
97
|
+
if (global.gc) { global.gc(); global.gc(); }
|
|
98
|
+
test.ok( true );
|
|
99
|
+
setTimeout( function() {
|
|
100
|
+
self.storage.logDebug(9, "MEMORY USAGE: " + Tools.getTextFromBytes( process.memoryUsage.rss() ), process.memoryUsage() );
|
|
101
|
+
test.done();
|
|
102
|
+
}, 1 );
|
|
103
|
+
} );
|
|
104
|
+
|
|
93
105
|
// startup complete
|
|
94
106
|
// delay this by 1ms so the log is in the correct order (pre-start is async)
|
|
95
107
|
setTimeout( function() { callback(); }, 1 );
|
package/test/data/sqlite.db
DELETED
|
Binary file
|