pixl-server-storage 4.0.0 → 4.0.1

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 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
- var row = self.db.prepare(self.commands.head).get({ key: key });
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
- var row = self.db.prepare(self.commands.get).get({ key: key });
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
- var row = self.db.prepare(self.commands.get).get({ key: key });
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
- var info = self.db.prepare(self.commands.delete).run({ key: key });
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.0",
3
+ "version": "4.0.1",
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",
package/test/config.json CHANGED
@@ -76,6 +76,13 @@
76
76
  "enabled": true,
77
77
  "maxItems": 1000,
78
78
  "maxBytes": 10485760
79
+ },
80
+ "backups": {
81
+ "enabled": true,
82
+ "dir": "data/backups",
83
+ "filename": "backup-[yyyy]-[mm]-[dd]-[hh]-[mi]-[ss].db",
84
+ "compress": true,
85
+ "keep": 7
79
86
  }
80
87
  }
81
88
  }
@@ -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 sample_tickets = sample_data.Ticket;
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 fixtures = {
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 );
Binary file