node-firebird 2.3.1 → 2.3.3

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.
Files changed (55) hide show
  1. package/README.md +218 -31
  2. package/lib/index.d.ts +22 -0
  3. package/lib/pool.js +97 -10
  4. package/lib/srp.js +12 -1
  5. package/lib/wire/connection.js +40 -7
  6. package/lib/wire/socket.js +13 -1
  7. package/lib/wire/xsqlvar.js +69 -6
  8. package/package.json +1 -1
  9. package/poc/README.md +160 -0
  10. package/poc/helpers.js +59 -0
  11. package/poc/node_modules/.package-lock.json +14 -0
  12. package/poc/node_modules/node-firebird/.eslintrc.json +12 -0
  13. package/poc/node_modules/node-firebird/.github/workflows/codeql.yml +76 -0
  14. package/poc/node_modules/node-firebird/.github/workflows/node.js.yml +95 -0
  15. package/poc/node_modules/node-firebird/BIGINT_MIGRATION.md +374 -0
  16. package/poc/node_modules/node-firebird/CI_DEBUGGING_GUIDE.md +148 -0
  17. package/poc/node_modules/node-firebird/ENCRYPTION_CALLBACK.md +152 -0
  18. package/poc/node_modules/node-firebird/FIREBIRD_LOG_FEATURE.md +145 -0
  19. package/poc/node_modules/node-firebird/LICENSE +373 -0
  20. package/poc/node_modules/node-firebird/MINIMAL_CHANGES_SUMMARY.md +136 -0
  21. package/poc/node_modules/node-firebird/PR_SUMMARY.md +96 -0
  22. package/poc/node_modules/node-firebird/README.md +794 -0
  23. package/poc/node_modules/node-firebird/ROADMAP.md +223 -0
  24. package/poc/node_modules/node-firebird/SRP_PROTOCOL.md +482 -0
  25. package/poc/node_modules/node-firebird/lib/callback.js +38 -0
  26. package/poc/node_modules/node-firebird/lib/firebird.msg +0 -0
  27. package/poc/node_modules/node-firebird/lib/firebird.msg.json +1371 -0
  28. package/poc/node_modules/node-firebird/lib/gdscodes.d.ts +1524 -0
  29. package/poc/node_modules/node-firebird/lib/gdscodes.js +1531 -0
  30. package/poc/node_modules/node-firebird/lib/ieee754-decimal.js +500 -0
  31. package/poc/node_modules/node-firebird/lib/index.d.ts +316 -0
  32. package/poc/node_modules/node-firebird/lib/index.js +128 -0
  33. package/poc/node_modules/node-firebird/lib/messages.js +162 -0
  34. package/poc/node_modules/node-firebird/lib/pool.js +108 -0
  35. package/poc/node_modules/node-firebird/lib/srp.js +299 -0
  36. package/poc/node_modules/node-firebird/lib/unix-crypt.js +343 -0
  37. package/poc/node_modules/node-firebird/lib/utils.js +164 -0
  38. package/poc/node_modules/node-firebird/lib/wire/connection.js +2510 -0
  39. package/poc/node_modules/node-firebird/lib/wire/const.js +807 -0
  40. package/poc/node_modules/node-firebird/lib/wire/database.js +378 -0
  41. package/poc/node_modules/node-firebird/lib/wire/eventConnection.js +118 -0
  42. package/poc/node_modules/node-firebird/lib/wire/fbEventManager.js +326 -0
  43. package/poc/node_modules/node-firebird/lib/wire/serialize.js +588 -0
  44. package/poc/node_modules/node-firebird/lib/wire/service.js +1058 -0
  45. package/poc/node_modules/node-firebird/lib/wire/socket.js +175 -0
  46. package/poc/node_modules/node-firebird/lib/wire/statement.js +48 -0
  47. package/poc/node_modules/node-firebird/lib/wire/transaction.js +206 -0
  48. package/poc/node_modules/node-firebird/lib/wire/xsqlvar.js +703 -0
  49. package/poc/node_modules/node-firebird/package.json +38 -0
  50. package/poc/node_modules/node-firebird/vitest.config.js +24 -0
  51. package/poc/package-lock.json +21 -0
  52. package/poc/package.json +12 -0
  53. package/poc/reproduce-fixed.js +150 -0
  54. package/poc/reproduce.js +133 -0
  55. package/vitest.config.js +4 -1
@@ -0,0 +1,1058 @@
1
+ const Events = require('events');
2
+ const stream = require('stream');
3
+ const Const = require('./const');
4
+ const {BlrReader} = require('./serialize');
5
+ const {doError} = require('../callback');
6
+
7
+ /***************************************
8
+ *
9
+ * Helper Functions and Constants
10
+ *
11
+ ***************************************/
12
+
13
+ function isEmpty(obj){
14
+ for(var p in obj) return false;
15
+ return true;
16
+ }
17
+
18
+ const SHUTDOWN_KIND = {
19
+ 0: Const.isc_spb_prp_shutdown_db,
20
+ 1: Const.isc_spb_prp_deny_new_transactions,
21
+ 2: Const.isc_spb_prp_deny_new_attachments
22
+ };
23
+ const SHUTDOWNEX_KIND = {
24
+ 0: Const.isc_spb_prp_force_shutdown,
25
+ 1: Const.isc_spb_prp_transactions_shutdown,
26
+ 2: Const.isc_spb_prp_attachments_shutdown
27
+ };
28
+ const SHUTDOWNEX_MODE = {
29
+ //0: isc_spb_prp_sm_normal,
30
+ 1: Const.isc_spb_prp_sm_multi,
31
+ 2: Const.isc_spb_prp_sm_single,
32
+ 3: Const.isc_spb_prp_sm_full
33
+ };
34
+ const ShutdownMode = { NORMAL: 0, MULTI: 1, SINGLE: 2, FULL: 3 };
35
+ const ShutdownKind = { FORCED: 0, DENY_TRANSACTION: 1, DENY_ATTACHMENT: 2 };
36
+
37
+ /***************************************
38
+ *
39
+ * Service Manager
40
+ *
41
+ ***************************************/
42
+
43
+ class ServiceManager extends Events.EventEmitter {
44
+ constructor(connection) {
45
+ super();
46
+ this.connection = connection;
47
+ connection.svc = this;
48
+ }
49
+
50
+ _createOutputStream(optread, buffersize, callback) {
51
+ var self = this;
52
+ optread = optread || 'byline';
53
+ var t = new stream.Readable({ objectMode: optread === 'byline' }); // chunk by line
54
+ t.__proto__._read = function () {
55
+ var selfread = this;
56
+ var fct = optread === 'byline' ? self.readline : self.readeof;
57
+ fct.call(self, { buffersize: buffersize }, function (err, data) {
58
+ if (err) {
59
+ selfread.push(err.message, Const.DEFAULT_ENCODING);
60
+ return;
61
+ }
62
+ if (data.line && data.line.length)
63
+ selfread.push(data.line, Const.DEFAULT_ENCODING);
64
+ else
65
+ selfread.push(null);
66
+ });
67
+ }
68
+
69
+ callback(null, t);
70
+ }
71
+
72
+ _infosmapping = {
73
+ "50"/*isc_info_svc_svr_db_info*/ : "dbinfo",
74
+ "51"/*isc_info_svc_get_license*/ : "licenses",
75
+ "52"/*isc_info_svc_get_license_mask*/ : "licenseoptions",
76
+ "53"/*isc_info_svc_get_config*/ : "fbconfig",
77
+ "54"/*isc_info_svc_version*/ : "svcversion",
78
+ "55"/*isc_info_svc_server_version*/ : "fbversion",
79
+ "56"/*isc_info_svc_implementation*/ : "fbimplementation",
80
+ "57"/*isc_info_svc_capabilities*/ : "fbcapatibilities",
81
+ "58"/*isc_info_svc_user_dbpath*/ : "pathsecuritydb",
82
+ "59"/*isc_info_svc_get_env*/ : "fbenv",
83
+ "60"/*isc_info_svc_get_env_lock*/ : "fbenvlock",
84
+ "61"/*isc_info_svc_get_env_msg*/ : "fbenvmsg",
85
+ "62"/*isc_info_svc_line*/ : "",
86
+ "63"/*isc_info_svc_to_eof*/ : "",
87
+ "64"/*isc_info_svc_timeout*/ : "",
88
+ "65"/*isc_info_svc_get_licensed_users*/ : "",
89
+ "66"/*isc_info_svc_limbo_trans*/ : "limbotrans",
90
+ "67"/*isc_info_svc_running*/ : "",
91
+ "68"/*isc_info_svc_get_users*/ : "fbusers",
92
+ "78"/*isc_info_svc_stdin*/ : ""
93
+ };
94
+
95
+ _processcapabilities(blr, res) {
96
+ var capArray = [
97
+ "WAL_SUPPORT",
98
+ "MULTI_CLIENT_SUPPORT",
99
+ "REMOTE_HOP_SUPPORT",
100
+ "NO_SVR_STATS_SUPPORT",
101
+ "NO_DB_STATS_SUPPORT",
102
+ "LOCAL_ENGINE_SUPPORT",
103
+ "NO_FORCED_WRITE_SUPPORT",
104
+ "NO_SHUTDOWN_SUPPORT",
105
+ "NO_SERVER_SHUTDOWN_SUPPORT",
106
+ "SERVER_CONFIG_SUPPORT",
107
+ "QUOTED_FILENAME_SUPPORT"
108
+ ];
109
+ var dbcapa = res[this._infosmapping[57]] = [];
110
+ var caps = blr.readInt32();
111
+
112
+ for (var i = 0; i < capArray.length; ++i)
113
+ if (caps & (1 << i))
114
+ dbcapa.push(capArray[i]);
115
+ }
116
+
117
+ _processdbinfo(blr, res) {
118
+ var tinfo = blr.readByteCode();
119
+ var dbinfo = res[this._infosmapping[50]] = {};
120
+
121
+ dbinfo.database = [];
122
+ for (; tinfo != Const.isc_info_flag_end; tinfo = blr.readByteCode()) {
123
+ switch (tinfo) {
124
+ case Const.isc_spb_dbname:
125
+ dbinfo.database.push(blr.readString());
126
+ break;
127
+ case Const.isc_spb_num_att:
128
+ dbinfo.nbattachment = blr.readInt32();
129
+ break;
130
+ case Const.isc_spb_num_db:
131
+ dbinfo.nbdatabase = blr.readInt32();
132
+ break;
133
+ }
134
+ }
135
+ }
136
+
137
+ _processquery(buffer, callback) {
138
+ if (!Buffer.isBuffer(buffer)) {
139
+ doError(new Error('Malformed service-manager response: missing BLR buffer'), callback);
140
+ return;
141
+ }
142
+
143
+ try {
144
+ var br = new BlrReader(buffer);
145
+ var tinfo = br.readByteCode();
146
+ var res = {};
147
+ res.result = 0;
148
+ for (; tinfo !== Const.isc_info_end; tinfo = br.readByteCode()) {
149
+ switch (tinfo) {
150
+ case Const.isc_info_svc_server_version:
151
+ case Const.isc_info_svc_implementation:
152
+ case Const.isc_info_svc_user_dbpath:
153
+ case Const.isc_info_svc_get_env:
154
+ case Const.isc_info_svc_get_env_lock:
155
+ case Const.isc_info_svc_get_env_msg:
156
+ res[this._infosmapping[tinfo]] = br.readString();
157
+ break;
158
+ case Const.isc_info_svc_version:
159
+ res[this._infosmapping[tinfo]] = br.readInt32();
160
+ break;
161
+ case Const.isc_info_svc_svr_db_info:
162
+ this._processdbinfo(br, res);
163
+ break;
164
+ case Const.isc_info_svc_limbo_trans:
165
+ // not implemented
166
+ for (; tinfo !== isc_info_flag_end; tinfo = br.readByteCode())
167
+ break;
168
+ case Const.isc_info_svc_get_users:
169
+ br.pos += 2
170
+ res[this._infosmapping[tinfo]] = [];
171
+ break;
172
+ case Const.isc_spb_sec_username:
173
+ var tuser = res[this._infosmapping[68]];
174
+ tuser.push({});
175
+ tuser[tuser.length - 1].username = br.readString();
176
+ break;
177
+ case Const.isc_spb_sec_firstname:
178
+ var tuser = res[this._infosmapping[68]];
179
+ var user = tuser[tuser.length-1];
180
+ user.firstname = br.readString();
181
+ break;
182
+ case Const.isc_spb_sec_middlename:
183
+ var tuser = res[this._infosmapping[68]];
184
+ var user = tuser[tuser.length-1];
185
+ user.middlename = br.readString();
186
+ break;
187
+ case Const.isc_spb_sec_lastname:
188
+ var tuser = res[this._infosmapping[68]];
189
+ var user = tuser[tuser.length-1];
190
+ user.lastname = br.readString();
191
+ break;
192
+ case Const.isc_spb_sec_groupid:
193
+ var tuser = res[this._infosmapping[68]];
194
+ var user = tuser[tuser.length-1];
195
+ user.groupid = br.readInt32();
196
+ break;
197
+ case Const.isc_spb_sec_userid:
198
+ var tuser = res[this._infosmapping[68]];
199
+ var user = tuser[tuser.length-1];
200
+ user.userid = br.readInt32();
201
+
202
+ break;
203
+ case Const.isc_spb_sec_admin:
204
+ var tuser = res[this._infosmapping[68]];
205
+ var user = tuser[tuser.length-1];
206
+ user.admin = br.readInt32();
207
+ break;
208
+
209
+ case Const.isc_info_svc_line:
210
+ res.line = br.readString();
211
+ break;
212
+
213
+ case Const.isc_info_svc_to_eof:
214
+ res.line = br.readString();
215
+ break;
216
+
217
+ case Const.isc_info_truncated:
218
+ res.result = 1; // too much data for the result buffer increase size of it (buffersize parameter))
219
+ break;
220
+
221
+ case Const.isc_info_data_not_ready:
222
+ res.result = 2;
223
+ break;
224
+
225
+ case Const.isc_info_svc_timeout:
226
+ res.result = 3;
227
+ break;
228
+
229
+ case Const.isc_info_svc_stdin:
230
+
231
+ break;
232
+
233
+ case Const.isc_info_svc_capabilities:
234
+ this._processcapabilities(br, res);
235
+ break;
236
+ }
237
+ }
238
+ callback(null, res);
239
+ } catch (err) {
240
+ doError(new Error('Malformed service-manager response: ' + err.message), callback);
241
+ }
242
+ }
243
+
244
+ detach(callback, force) {
245
+ var self = this;
246
+
247
+ if (!force && self.connection._pending.length > 0) {
248
+ self.connection._detachAuto = true;
249
+ self.connection._detachCallback = callback;
250
+ return self;
251
+ }
252
+
253
+ self.connection.svcdetach(function (err, obj) {
254
+
255
+ self.connection.disconnect();
256
+ self.emit('detach', false);
257
+
258
+ if (callback)
259
+ callback(err, obj);
260
+
261
+ }, force);
262
+
263
+ return self;
264
+ }
265
+
266
+ backup(options, callback) {
267
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
268
+ var verbose = options.verbose || false;
269
+ // format of bckfile {filename:'name', sizefile:''} sizefile is length of part in bytes
270
+ var bckfiles = options.backupfiles || options.files || null;
271
+ // for convenience
272
+ if (bckfiles) bckfiles = bckfiles.constructor !== Array?[{ filename: bckfiles, sizefile: '0' }]:bckfiles;
273
+ var factor = options.factor || 0; //If backing up to a physical tape device, this switch lets you specify the tape's blocking factor
274
+ var ignorechecksums = options.ignorechecksums || false;
275
+ var ignorelimbo = options.ignorelimbo || false;
276
+ var metadataonly = options.metadataonly || false;
277
+ var nogarbagecollect = options.nogarbasecollect || false;
278
+ var olddescriptions = options.olddescriptions || false;
279
+ var nontransportable = options.nontransportable || false;
280
+ var convert = options.convert || false;
281
+ var expand = options.expand || false;
282
+ var notriggers = options.notriggers || false;
283
+
284
+ if (dbpath == null || dbpath.length === 0) {
285
+ doError(new Error('No database specified'), callback);
286
+ return;
287
+ }
288
+
289
+ if (bckfiles == null || bckfiles.length === 0) {
290
+ doError(new Error('No backup path specified'), callback);
291
+ return;
292
+ }
293
+
294
+ var blr = this.connection._blr;
295
+ blr.pos = 0;
296
+ blr.addByte(Const.isc_action_svc_backup);
297
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
298
+ for (var i = 0; i < bckfiles.length; i++) {
299
+ blr.addString2(Const.isc_spb_bkp_file, bckfiles[i].filename, Const.DEFAULT_ENCODING);
300
+ if (i !== bckfiles.length - 1) // not the end, so we need to write the size of this part (gsplit)
301
+ blr.addString2(Const.isc_spb_bkp_length, bckfiles[i].sizefile, Const.DEFAULT_ENCODING);
302
+ }
303
+ if (factor)
304
+ blr.addByteInt32(Const.isc_spb_bkp_factor, factor);
305
+
306
+ var opts = 0;
307
+ if (ignorechecksums) opts = opts | Const.isc_spb_bkp_ignore_checksums;
308
+ if (ignorelimbo) opts = opts | Const.isc_spb_bkp_ignore_limbo;
309
+ if (metadataonly) opts = opts | Const.isc_spb_bkp_metadata_only;
310
+ if (nogarbagecollect) opts = opts | Const.isc_spb_bkp_no_garbage_collect;
311
+ if (olddescriptions) opts = opts | Const.isc_spb_bkp_old_descriptions;
312
+ if (nontransportable) opts = opts | Const.isc_spb_bkp_non_transportable;
313
+ if (convert) opts = opts | Const.isc_spb_bkp_convert;
314
+ if (expand) opts = opts | Const.isc_spb_bkp_expand;
315
+ if (notriggers) opts = opts | Const.isc_spb_bkp_no_triggers;
316
+ if (opts)
317
+ blr.addByteInt32(Const.isc_spb_options, opts);
318
+ if (verbose)
319
+ blr.addByte(Const.isc_spb_verbose);
320
+ var self = this;
321
+ this.connection.svcstart(blr, function (err, data) {
322
+ if (err) {
323
+ doError(new Error(err), callback);
324
+ return;
325
+ }
326
+ self._createOutputStream(options.optread, options.buffersize, callback);
327
+ });
328
+ }
329
+
330
+ nbackup(options, callback) {
331
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
332
+ var bckfile = options.backupfile || options.file || null;
333
+ var level = options.level || 0; // nb day for incremental
334
+ var notriggers = options.notriggers || false;
335
+ var direct = options.direct || 'on'; // on or off direct write I/O
336
+
337
+ if (dbpath == null || dbpath.length === 0) {
338
+ doError(new Error('No database specified'), callback);
339
+ return;
340
+ }
341
+
342
+ if (bckfile == null || bckfile.length === 0) {
343
+ doError(new Error('No backup path specified'), callback);
344
+ return;
345
+ }
346
+
347
+ var blr = this.connection._blr;
348
+ blr.pos = 0;
349
+ blr.addByte(Const.isc_action_svc_nbak);
350
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
351
+ blr.addString2(Const.isc_spb_nbk_file, bckfile, Const.DEFAULT_ENCODING);
352
+ blr.addByteInt32(Const.isc_spb_nbk_level, level);
353
+ blr.addString2(Const.isc_spb_nbk_direct, direct, Const.DEFAULT_ENCODING);
354
+ var opts = 0;
355
+ if (notriggers) opts = opts | Const.isc_spb_nbk_no_triggers;
356
+ blr.addByteInt32(Const.isc_spb_options, opts);
357
+ var self = this;
358
+ this.connection.svcstart(blr, function (err, data) {
359
+ if (err) {
360
+ doError(new Error(err), callback);
361
+ return;
362
+ }
363
+ self._createOutputStream(options.optread, options.buffersize, callback);
364
+ });
365
+ }
366
+
367
+ restore(options, callback) {
368
+ var bckfiles = options.backupfiles || options.files || null; // format bckfiles ['file1', 'file2', 'file3']
369
+ // for convenience
370
+ if (bckfiles) bckfiles = bckfiles.constructor !== Array?[bckfiles]:bckfiles;
371
+ var dbfile = options.database || this.connection.options.filename || this.connection.options.database;;
372
+ var verbose = options.verbose || false;
373
+ var cachebuffers = options.cachebuffers || 2048; // gbak -buffers
374
+ var pagesize = options.pagesize || 4096; // gbak -page_size
375
+ var readonly = options.readonly || false; // gbak -mode
376
+ var deactivateindexes = options.deactivateindexes || false;
377
+ var noshadow = options.noshadow || false;
378
+ var novalidity = options.novalidity || false;
379
+ var individualcommit = options.individualcommit || true; // otherwise no data
380
+ var replace = options.replace || false;
381
+ var create = options.create || true;
382
+ var useallspace = options.useallspace || false;
383
+ var metadataonly = options.metadataonly || false;
384
+ var fixfssdata = options.fixfssdata || null;
385
+ var fixfssmetadata = options.fixfssmetadata || null;
386
+
387
+ if (bckfiles == null || bckfiles.length === 0) {
388
+ doError(new Error('No backup file specified'), callback);
389
+ return;
390
+ }
391
+
392
+ if (dbfile == null || dbfile.length === 0) {
393
+ doError(new Error('No database path specified'), callback);
394
+ return;
395
+ }
396
+
397
+ var blr = this.connection._blr;
398
+ blr.pos = 0;
399
+ blr.addByte(Const.isc_action_svc_restore);
400
+ for (var i = 0; i < bckfiles.length; i++) {
401
+ blr.addString2(Const.isc_spb_bkp_file, bckfiles[i], Const.DEFAULT_ENCODING);
402
+ }
403
+ blr.addString2(Const.isc_spb_dbname, dbfile, Const.DEFAULT_ENCODING);
404
+ blr.addByte(Const.isc_spb_res_buffers);
405
+ blr.addInt32(cachebuffers);
406
+ blr.addByte(Const.isc_spb_res_page_size);
407
+ blr.addInt32(pagesize);
408
+ blr.addByte(Const.isc_spb_res_access_mode);
409
+ if (readonly)
410
+ blr.addByte(Const.isc_spb_prp_am_readonly);
411
+ else
412
+ blr.addByte(Const.isc_spb_prp_am_readwrite);
413
+ if (fixfssdata) blr.addString2(Const.isc_spb_res_fix_fss_data, fixfssdata, Const.DEFAULT_ENCODING);
414
+ if (fixfssmetadata) blr.addString2(Const.isc_spb_res_fix_fss_metadata, fixfssmetadata, Const.DEFAULT_ENCODING);
415
+ var opts = 0;
416
+ if (deactivateindexes) opts = opts | Const.isc_spb_res_deactivate_idx;
417
+ if (noshadow) opts = opts | Const.isc_spb_res_no_shadow;
418
+ if (novalidity) opts = opts | Const.isc_spb_res_no_validity;
419
+ if (individualcommit) opts = opts | Const.isc_spb_res_one_at_a_time;
420
+ if (replace) opts = opts | Const.isc_spb_res_replace;
421
+ if (create) opts = opts | Const.isc_spb_res_create;
422
+ if (useallspace) opts = opts | Const.isc_spb_res_use_all_space;
423
+ if (metadataonly) opts = opts | Const.isc_spb_res_fix_fss_metadata;
424
+ if (opts)
425
+ blr.addByteInt32(Const.isc_spb_options, opts);
426
+ if (verbose)
427
+ blr.addByte(Const.isc_spb_verbose);
428
+ var self = this;
429
+ this.connection.svcstart(blr, function (err, data) {
430
+ if (err) {
431
+ doError(new Error(err), callback);
432
+ return;
433
+ }
434
+ self._createOutputStream(options.optread, options.buffersize, callback);
435
+ });
436
+ }
437
+
438
+ nrestore(options, callback) {
439
+ var bckfiles = options.backupfiles || options.files || null; // format bckfiles ['file1', 'file2', 'file3']
440
+ // for convenience
441
+ if (bckfiles) bckfiles = bckfiles.constructor !== Array?[bckfiles]:bckfiles;
442
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
443
+
444
+ if (bckfiles == null || bckfiles.length === 0) {
445
+ doError(new Error('No backup file specified'), callback);
446
+ return;
447
+ }
448
+
449
+ if (dbpath == null || bckfiles.length === 0) {
450
+ doError(new Error('No database path specified'), callback);
451
+ return;
452
+ }
453
+ var blr = this.connection._blr;
454
+ blr.pos = 0;
455
+ blr.addByte(Const.isc_action_svc_nrest);
456
+ for (var i = 0; i < bckfiles.length; i++) {
457
+ blr.addString2(Const.isc_spb_nbk_file, bckfiles[i], Const.DEFAULT_ENCODING);
458
+ }
459
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
460
+ var self = this;
461
+ this.connection.svcstart(blr, function (err, data) {
462
+ if (err) {
463
+ doError(new Error(err), callback);
464
+ return;
465
+ }
466
+ self._createOutputStream(options.optread, options.buffersize, callback);
467
+ });
468
+ }
469
+
470
+ _fixpropertie(options, callback) {
471
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
472
+ var dialect = options.dialect || null;
473
+ var sweep = options.sweepinterval || null;
474
+ var pagebuffers = options.nbpagebuffers || null;
475
+ var online = options.bringonline || false;
476
+ var shutdown = options.shutdown != null ? options.shutdown : null; // 0 Forced, 1 deny transaction, 2 deny attachment
477
+ var shutdowndelay = options.shutdowndelay || 0;
478
+ var shutdownmode = options.shutdownmode; // 0 normal 1 multi 2 single 3 full
479
+ var shadow = options.activateshadow || false;
480
+ var forcewrite = options.forcewrite;
481
+ var reservespace = options.reservespace;
482
+ var accessmode = options.accessmode; // 0 readonly 1 readwrite
483
+
484
+ if (dbpath == null || dbpath.length === 0) {
485
+ doError(new Error('No database specified'), callback);
486
+ return;
487
+ }
488
+
489
+ var blr = this.connection._blr;
490
+ blr.pos = 0;
491
+ blr.addByte(Const.isc_action_svc_properties);
492
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
493
+ if (dialect) blr.addByteInt32(Const.isc_spb_prp_set_sql_dialect, dialect);
494
+ if (sweep) blr.addByteInt32(Const.isc_spb_prp_sweep_interval, sweep);
495
+ if (pagebuffers) blr.addByteInt32(Const.isc_spb_prp_page_buffers, pagebuffers);
496
+ if (shutdown != null) {
497
+ if (shutdownmode != null) {
498
+ if (SHUTDOWNEX_KIND[shutdown] === undefined) {
499
+ doError(new Error('Invalid shutdown kind'), callback);
500
+ return;
501
+ }
502
+ if (SHUTDOWNEX_MODE[shutdownmode] === undefined) {
503
+ doError(new Error('Invalid shutdown mode'), callback);
504
+ return;
505
+ }
506
+
507
+ // New shutdown with mode
508
+ blr.addBytes([Const.isc_spb_prp_shutdown_mode, SHUTDOWNEX_MODE[shutdownmode]]);
509
+ blr.addByteInt32(SHUTDOWNEX_KIND[shutdown], shutdowndelay);
510
+ } else {
511
+ // Old shutdown
512
+ blr.addByteInt32(SHUTDOWN_KIND[shutdown], shutdowndelay);
513
+ }
514
+ }
515
+ if (forcewrite) blr.addBytes([Const.isc_spb_prp_write_mode, Const.isc_spb_prp_wm_sync]);
516
+ if (forcewrite === false) blr.addBytes([Const.isc_spb_prp_write_mode, Const.isc_spb_prp_wm_async]);
517
+ if (accessmode === 1) blr.addBytes([Const.isc_spb_prp_access_mode, Const.isc_spb_prp_am_readwrite]);
518
+ if (accessmode === 0) blr.addBytes([Const.isc_spb_prp_access_mode, Const.isc_spb_prp_am_readonly]);
519
+ if (reservespace) blr.addBytes([Const.isc_spb_prp_reserve_space, Const.isc_spb_prp_res]);
520
+ if (reservespace != null && !reservespace) blr.addBytes([Const.isc_spb_prp_reserve_space, Const.isc_spb_prp_res_use_full]);
521
+ var opts = 0;
522
+ if (shadow) opts = opts | Const.isc_spb_prp_activate;
523
+ if (online) opts = opts | Const.isc_spb_prp_db_online;
524
+ if (opts)
525
+ blr.addByteInt32(Const.isc_spb_options, opts);
526
+ var self = this;
527
+ this.connection.svcstart(blr, function (err, data) {
528
+ if (err) {
529
+ doError(new Error(err), callback);
530
+ return;
531
+ }
532
+ self._createOutputStream(options.optread, options.buffersize, callback);
533
+ });
534
+ }
535
+
536
+ setDialect(db, dialect, callback) {
537
+ this._fixpropertie({ database: db, dialect: dialect }, callback);
538
+ }
539
+
540
+ setSweepinterval(db, sweepinterval, callback) {
541
+ this._fixpropertie({ database: db, sweepinterval: sweepinterval }, callback);
542
+ }
543
+
544
+ setCachebuffer(db, nbpages, callback) {
545
+ this._fixpropertie({ database: db, nbpagebuffers: nbpages }, callback);
546
+ }
547
+
548
+ BringOnline(db, callback) {
549
+ this._fixpropertie({ database: db, bringonline: true }, callback);
550
+ }
551
+
552
+ Shutdown(db, kind, delay, mode, callback) {
553
+ // mode parameter is for server version >= 2.0
554
+ if (mode instanceof Function) {
555
+ callback = mode;
556
+ mode = undefined;
557
+ }
558
+
559
+ this._fixpropertie({ database: db, shutdown: kind, shutdowndelay: delay, shutdownmode: mode }, callback);
560
+ }
561
+
562
+ setShadow(db, val, callback) {
563
+ this._fixpropertie({ database: db, activateshadow : val }, callback);
564
+ }
565
+
566
+ setForcewrite(db, val, callback) {
567
+ this._fixpropertie({ database: db, forcewrite : val }, callback);
568
+ }
569
+
570
+ setReservespace(db, val, callback) {
571
+ this._fixpropertie({ database: db, reservespace : val }, callback);
572
+ }
573
+
574
+ setReadonlyMode(db, callback) {
575
+ this._fixpropertie({ database: db, accessmode : 0 }, callback);
576
+ }
577
+
578
+ setReadwriteMode(db, callback) {
579
+ this._fixpropertie({ database: db, accessmode : 1 }, callback);
580
+ }
581
+
582
+ validate(options, callback) {
583
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
584
+ var checkdb = options.checkdb || false;
585
+ var ignorechecksums = options.ignorechecksums || false;
586
+ var killshadows = options.killshadows || false;
587
+ var mend = options.mend || false;
588
+ var validate = options.validate || false;
589
+ var full = options.full || false;
590
+ var sweep = options.sweep || false;
591
+ var listlimbo = options.listlimbo || false;
592
+ var icu = options.icu || false;
593
+
594
+ if (dbpath == null || dbpath.length === 0) {
595
+ doError(new Error('No database specified'), callback);
596
+ return;
597
+ }
598
+
599
+ var blr = this.connection._blr;
600
+ blr.pos = 0;
601
+ blr.addByte(Const.isc_action_svc_repair);
602
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
603
+ var opts = 0;
604
+ if (checkdb) opts = opts | Const.isc_spb_rpr_check_db;
605
+ if (ignorechecksums) opts = opts | Const.isc_spb_rpr_ignore_checksum;
606
+ if (killshadows) opts = opts | Const.isc_spb_rpr_kill_shadows;
607
+ if (mend) opts = opts | Const.isc_spb_rpr_mend_db;
608
+ if (validate) opts = opts | Const.isc_spb_rpr_validate_db;
609
+ if (full) opts = opts | Const.isc_spb_rpr_full;
610
+ if (sweep) opts = opts | Const.isc_spb_rpr_sweep_db;
611
+ if (listlimbo) opts = opts | Const.isc_spb_rpr_list_limbo_trans;
612
+ if (icu) opts = opts | Const.isc_spb_rpr_icu;
613
+ blr.addByteInt32(Const.isc_spb_options, opts);
614
+ var self = this;
615
+ this.connection.svcstart(blr, function (err, data) {
616
+ if (err) {
617
+ doError(new Error(err), callback);
618
+ return;
619
+ }
620
+ self._createOutputStream(options.optread, options.buffersize, callback);
621
+ });
622
+ }
623
+
624
+ commit(db, transactid, callback) {
625
+ var dbpath = db || this.connection.options.filename || this.connection.options.database;
626
+ if (dbpath == null || dbpath.length === 0) {
627
+ doError(new Error('No database specified'), callback);
628
+ return;
629
+ }
630
+
631
+ var blr = this.connection._blr;
632
+ blr.pos = 0;
633
+ blr.addByte(Const.isc_action_svc_repair);
634
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
635
+ blr.addByteInt32(Const.isc_spb_rpr_commit_trans, transactid);
636
+ var self = this;
637
+ this.connection.svcstart(blr, function (err, data) {
638
+ if (err) {
639
+ doError(new Error(err), callback);
640
+ return;
641
+ }
642
+ self._createOutputStream(null, null, callback);
643
+ });
644
+ }
645
+
646
+ rollback(db, transactid, callback) {
647
+ var dbpath = db || this.connection.options.filename || this.connection.options.database;
648
+ if (dbpath == null || dbpath.length === 0) {
649
+ doError(new Error('No database specified'), callback);
650
+ return;
651
+ }
652
+
653
+ var blr = this.connection._blr;
654
+ blr.pos = 0;
655
+ blr.addByte(Const.isc_action_svc_repair);
656
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
657
+ blr.addByteInt32(Const.isc_spb_rpr_rollback_trans, transactid);
658
+ var self = this;
659
+ this.connection.svcstart(blr, function (err, data) {
660
+ if (err) {
661
+ doError(new Error(err), callback);
662
+ return;
663
+ }
664
+ self._createOutputStream(null, null, callback);
665
+ });
666
+ }
667
+
668
+ recover(db, transactid, callback) {
669
+ var dbpath = db || this.connection.options.filename || this.connection.options.database;
670
+ if (dbpath == null || dbpath.length === 0) {
671
+ doError(new Error('No database specified'), callback);
672
+ return;
673
+ }
674
+
675
+ var blr = this.connection._blr;
676
+ blr.pos = 0;
677
+ blr.addByte(Const.isc_action_svc_repair);
678
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
679
+ blr.addByteInt32(Const.isc_spb_rpr_recover_two_phase, transactid);
680
+ var self = this;
681
+ this.connection.svcstart(blr, function (err, data) {
682
+ if (err) {
683
+ doError(new Error(err), callback);
684
+ return;
685
+ }
686
+ self._createOutputStream(null, null, callback);
687
+ });
688
+ }
689
+
690
+ getStats(options, callback) {
691
+ var dbpath = options.database || this.connection.options.filename || this.connection.options.database;
692
+ var record = options.record || false;
693
+ var nocreation = options.nocreation || false;
694
+ var tables = options.tables || false;
695
+ var pages = options.pages || false;
696
+ var header = options.header || false;
697
+ var indexes = options.indexes || false;
698
+ var tablesystem = options.tablesystem || false;
699
+ var encryption = options.encryption || false;
700
+ var objects = options.objects || null; // space-separated list of object index,table,systemtable
701
+ if (dbpath == null || dbpath.length === 0) {
702
+ doError(new Error('No database specified'), callback);
703
+ return;
704
+ }
705
+
706
+ var blr = this.connection._blr;
707
+ blr.pos = 0;
708
+ blr.addByte(Const.isc_action_svc_db_stats);
709
+ blr.addString2(Const.isc_spb_dbname, dbpath, Const.DEFAULT_ENCODING);
710
+ var opts = 0;
711
+ if (record) opts = opts | Const.isc_spb_sts_record_versions;
712
+ if (nocreation) opts = opts | Const.isc_spb_sts_nocreation;
713
+ if (tables) opts = opts | Const.isc_spb_sts_table;
714
+ if (pages) opts = opts | Const.isc_spb_sts_data_pages;
715
+ if (header) opts = opts | Const.isc_spb_sts_hdr_pages;
716
+ if (indexes) opts = opts | Const.isc_spb_sts_idx_pages;
717
+ if (tablesystem) opts = opts | Const.isc_spb_sts_sys_relations;
718
+ if (encryption) opts = opts | Const.isc_spb_sts_encryption;
719
+ if (opts)
720
+ blr.addByteInt32(Const.isc_spb_options, opts);
721
+ if (objects) blr.addString2(Const.isc_spb_command_line, objects, Const.DEFAULT_ENCODING);
722
+ var self = this;
723
+ this.connection.svcstart(blr, function (err, data) {
724
+ if (err) {
725
+ doError(new Error(err), callback);
726
+ return;
727
+ }
728
+ self._createOutputStream(options.optread, options.buffersize, callback);
729
+ });
730
+
731
+ }
732
+
733
+ getLog(options, callback) {
734
+ var self = this;
735
+ var blr = this.connection._blr;
736
+ var optread = options.optread || 'byline';
737
+ blr.pos = 0;
738
+ blr.addByte(Const.isc_action_svc_get_fb_log);
739
+ this.connection.svcstart(blr, function (err, data) {
740
+ if (err) {
741
+ doError(new Error(err), callback);
742
+ return;
743
+ }
744
+ self._createOutputStream(optread, options.buffersize, callback);
745
+ });
746
+ }
747
+
748
+ getUsers(username, callback) {
749
+ var self = this;
750
+ var blr = this.connection._blr;
751
+ blr.pos = 0;
752
+ blr.addByte(Const.isc_action_svc_display_user);
753
+ if (username) blr.addString2(Const.isc_spb_sec_username, username, Const.DEFAULT_ENCODING);
754
+ this.connection.svcstart(blr, function (err, data) {
755
+ if (err) {
756
+ doError(new Error(err), callback);
757
+ return;
758
+ }
759
+ self.readusers({}, callback);
760
+ });
761
+ }
762
+
763
+ addUser(username, password, options, callback) {
764
+ var rolename = options.rolename || null;
765
+ var groupname = options.groupname || null;
766
+ var firsname = options.firstname || null;
767
+ var middlename = options.middlename || null;
768
+ var lastname = options.lastname || null;
769
+ var userid = options.userid || null;
770
+ var groupid = options.groupid || null;
771
+ var admin = options.admin || null;
772
+
773
+ var blr = this.connection._blr;
774
+ blr.pos = 0;
775
+ blr.addByte(Const.isc_action_svc_add_user);
776
+ blr.addString2(Const.isc_spb_sec_username, username, Const.DEFAULT_ENCODING);
777
+ blr.addString2(Const.isc_spb_sec_password, password, Const.DEFAULT_ENCODING);
778
+ if (rolename) blr.addString2(Const.isc_dpb_sql_role_name, rolename, Const.DEFAULT_ENCODING);
779
+ if (groupname) blr.addString2(Const.isc_spb_sec_groupname, groupname, Const.DEFAULT_ENCODING);
780
+ if (firsname) blr.addString2(Const.isc_spb_sec_firstname, firsname, Const.DEFAULT_ENCODING);
781
+ if (middlename) blr.addString2(Const.isc_spb_sec_middlename, middlename, Const.DEFAULT_ENCODING);
782
+ if (lastname) blr.addString2(Const.isc_spb_sec_lastname, lastname, Const.DEFAULT_ENCODING);
783
+ if (userid != null) blr.addByteInt32(Const.isc_spb_sec_userid, userid);
784
+ if (groupid != null) blr.addByteInt32(Const.isc_spb_sec_groupid, groupid);
785
+ if (admin != null) blr.addByteInt32(Const.isc_spb_sec_admin, admin);
786
+
787
+ var self = this;
788
+ this.connection.svcstart(blr, function (err, data) {
789
+ if (err) {
790
+ doError(new Error(err), callback);
791
+ return;
792
+ }
793
+ self._createOutputStream(options.optread, options.buffersize, callback);
794
+ });
795
+ }
796
+
797
+ editUser(username, options, callback) {
798
+ var rolename = options.rolename || null;
799
+ var groupname = options.groupname || null;
800
+ var firsname = options.firstname || null;
801
+ var middlename = options.middlename || null;
802
+ var lastname = options.lastname || null;
803
+ var userid = options.userid || null;
804
+ var groupid = options.groupid || null;
805
+ var admin = options.admin || null;
806
+ var password = options.password || null;
807
+ var blr = this.connection._blr;
808
+ blr.pos = 0;
809
+ blr.addByte(Const.isc_action_svc_modify_user);
810
+ blr.addString2(Const.isc_spb_sec_username, username, Const.DEFAULT_ENCODING);
811
+ if (password) blr.addString2(Const.isc_spb_sec_password, password, Const.DEFAULT_ENCODING);
812
+ if (rolename) blr.addString2(Const.isc_dpb_sql_role_name, rolename, Const.DEFAULT_ENCODING);
813
+ if (groupname) blr.addString2(Const.isc_spb_sec_groupname, groupname, Const.DEFAULT_ENCODING);
814
+ if (firsname) blr.addString2(Const.isc_spb_sec_firstname, firsname, Const.DEFAULT_ENCODING);
815
+ if (middlename) blr.addString2(Const.isc_spb_sec_middlename, middlename, Const.DEFAULT_ENCODING);
816
+ if (lastname) blr.addString2(Const.isc_spb_sec_lastname, lastname, Const.DEFAULT_ENCODING);
817
+ if (userid != null) blr.addByteInt32(Const.isc_spb_sec_userid, userid);
818
+ if (groupid != null) blr.addByteInt32(Const.isc_spb_sec_groupid, groupid);
819
+ if (admin != null) blr.addByteInt32(Const.isc_spb_sec_admin, admin);
820
+
821
+ var self = this;
822
+ this.connection.svcstart(blr, function (err, data) {
823
+ if (err) {
824
+ doError(new Error(err), callback);
825
+ return;
826
+ }
827
+ self._createOutputStream(options.optread, options.buffersize, callback);
828
+ });
829
+ }
830
+
831
+ removeUser(username, rolename, callback) {
832
+ var blr = this.connection._blr;
833
+ blr.pos = 0;
834
+ blr.addByte(Const.isc_action_svc_delete_user);
835
+ blr.addString2(Const.isc_spb_sec_username, username, Const.DEFAULT_ENCODING);
836
+ if (rolename) blr.addString2(Const.isc_dpb_sql_role_name, rolename, Const.DEFAULT_ENCODING);
837
+
838
+ var self = this, options = {};
839
+ this.connection.svcstart(blr, function (err, data) {
840
+ if (err) {
841
+ doError(new Error(err), callback);
842
+ return;
843
+ }
844
+ self._createOutputStream(options.optread, options.buffersize, callback);
845
+ });
846
+ }
847
+
848
+ getFbserverInfos(infos, options, callback) {
849
+ var buffersize = options.buffersize || 2048;
850
+ var timeout = options.timeout || 1;
851
+ var opts = {
852
+ "dbinfo" : Const.isc_info_svc_svr_db_info,
853
+ "fbconfig" : Const.isc_info_svc_get_config,
854
+ "svcversion" : Const.isc_info_svc_version,
855
+ "fbversion" : Const.isc_info_svc_server_version,
856
+ "fbimplementation" : Const.isc_info_svc_implementation,
857
+ "fbcapatibilities" : Const.isc_info_svc_capabilities,
858
+ "pathsecuritydb" : Const.isc_info_svc_user_dbpath,
859
+ "fbenv" : Const.isc_info_svc_get_env,
860
+ "fbenvlock" : Const.isc_info_svc_get_env_lock,
861
+ "fbenvmsg" : Const.isc_info_svc_get_env_msg
862
+ };
863
+ // if infos is empty all options are asked to the service
864
+
865
+ var tops = [], empty = isEmpty(infos);
866
+ for (let popts in opts)
867
+ if (empty || infos[popts])
868
+ tops.push(opts[popts]);
869
+
870
+ var self = this;
871
+ this.connection.svcquery(tops, buffersize, timeout, function (err, data) {
872
+ if (err || !data.buffer) {
873
+ doError(new Error(err||'Bad query return'), callback);
874
+ return;
875
+ }
876
+ self._processquery(data.buffer, callback);
877
+ });
878
+ }
879
+
880
+ startTrace(options, callback) {
881
+ var self = this;
882
+ var blr = this.connection._blr;
883
+ var configfile = options.configfile || '';
884
+ var tracename = options.tracename || '';
885
+
886
+ if (configfile.length === 0) {
887
+ doError(new Error('No config filename specified'), callback);
888
+ return;
889
+ }
890
+ if (tracename.length === 0) {
891
+ doError(new Error('No tracename specified'), callback);
892
+ return;
893
+ }
894
+
895
+ blr.pos = 0;
896
+ blr.addByte(Const.isc_action_svc_trace_start);
897
+ blr.addString2(Const.isc_spb_trc_cfg, configfile, Const.DEFAULT_ENCODING);
898
+ blr.addString2(Const.isc_spb_trc_name, tracename, Const.DEFAULT_ENCODING);
899
+ this.connection.svcstart(blr, function (err, data) {
900
+ if (err) {
901
+ doError(new Error(err), callback);
902
+ return;
903
+ }
904
+ self._createOutputStream(options.optread, options.buffersize, callback);
905
+ });
906
+ }
907
+
908
+ suspendTrace(options, callback) {
909
+ var self = this;
910
+ var blr = this.connection._blr;
911
+ var traceid = options.traceid || null;
912
+
913
+ if (traceid == null) {
914
+ doError(new Error('No traceid specified'), callback);
915
+ return;
916
+ }
917
+
918
+ blr.pos = 0;
919
+ blr.addByte(Const.isc_action_svc_trace_suspend);
920
+ blr.addByteInt32(Const.isc_spb_trc_id, traceid);
921
+ this.connection.svcstart(blr, function (err, data) {
922
+ if (err) {
923
+ doError(new Error(err), callback);
924
+ return;
925
+ }
926
+ self._createOutputStream(options.optread, options.buffersize, callback);
927
+ });
928
+ }
929
+
930
+ resumeTrace(options, callback) {
931
+ var self = this;
932
+ var blr = this.connection._blr;
933
+ var traceid = options.traceid || null;
934
+
935
+ if (traceid == null) {
936
+ doError(new Error('No traceid specified'), callback);
937
+ return;
938
+ }
939
+
940
+ blr.pos = 0;
941
+ blr.addByte(Const.isc_action_svc_trace_resume);
942
+ blr.addByteInt32(Const.isc_spb_trc_id, traceid);
943
+ this.connection.svcstart(blr, function (err, data) {
944
+ if (err) {
945
+ doError(new Error(err), callback);
946
+ return;
947
+ }
948
+ self._createOutputStream(options.optread, options.buffersize, callback);
949
+ });
950
+ }
951
+
952
+ stopTrace(options, callback) {
953
+ var self = this;
954
+ var blr = this.connection._blr;
955
+ var traceid = options.traceid || null;
956
+
957
+ if (traceid == null) {
958
+ doError(new Error('No traceid specified'), callback);
959
+ return;
960
+ }
961
+
962
+ blr.pos = 0;
963
+ blr.addByte(Const.isc_action_svc_trace_stop);
964
+ blr.addByteInt32(Const.isc_spb_trc_id, traceid);
965
+ this.connection.svcstart(blr, function (err, data) {
966
+ if (err) {
967
+ doError(new Error(err), callback);
968
+ return;
969
+ }
970
+ self._createOutputStream(options.optread, options.buffersize, callback);
971
+ });
972
+ }
973
+
974
+ getTraceList(options, callback) {
975
+ var self = this;
976
+ var blr = this.connection._blr;
977
+ blr.pos = 0;
978
+ blr.addByte(Const.isc_action_svc_trace_list);
979
+ this.connection.svcstart(blr, function (err, data) {
980
+ if (err) {
981
+ doError(new Error(err), callback);
982
+ return;
983
+ }
984
+ self._createOutputStream(options.optread, options.buffersize, callback);
985
+ });
986
+ }
987
+
988
+ readline(options, callback) {
989
+ var buffersize = options.buffersize || 2048;
990
+ var timeout = options.timeout || 60;
991
+ var self = this;
992
+ this.connection.svcquery([Const.isc_info_svc_line], buffersize, timeout, function (err, data) {
993
+ if (err || !data.buffer) {
994
+ doError(new Error(err||'Bad query return'), callback);
995
+ return;
996
+ }
997
+ self._processquery(data.buffer, callback);
998
+ });
999
+ }
1000
+
1001
+ readeof(options, callback) {
1002
+ var buffersize = options.buffersize || (8 * 1024);
1003
+ var timeout = options.timeout || 60;
1004
+ var self = this;
1005
+ this.connection.svcquery([Const.isc_info_svc_to_eof], buffersize, timeout, function (err, data) {
1006
+ if (err || !data.buffer) {
1007
+ doError(new Error(err||'Bad query return'), callback);
1008
+ return;
1009
+ }
1010
+ self._processquery(data.buffer, callback);
1011
+ });
1012
+ }
1013
+
1014
+ hasRunningAction(options, callback) {
1015
+ var buffersize = options.buffersize || 2048;
1016
+ var timeout = options.timeout || 60;
1017
+ var self = this;
1018
+ this.connection.svcquery([Const.isc_info_svc_running], buffersize, timeout, function (err, data) {
1019
+ if (err || !data.buffer) {
1020
+ doError(new Error(err||'Bad query return'), callback);
1021
+ return;
1022
+ }
1023
+ self._processquery(data.buffer, callback);
1024
+ });
1025
+ }
1026
+
1027
+ readusers(options, callback) {
1028
+ var buffersize = options.buffersize || 2048;
1029
+ var timeout = options.timeout || 60;
1030
+ var self = this;
1031
+ this.connection.svcquery([Const.isc_info_svc_get_users], buffersize, timeout, function (err, data) {
1032
+ if (err || !data.buffer) {
1033
+ doError(new Error(err||'Bad query return'), callback);
1034
+ return;
1035
+ }
1036
+ self._processquery(data.buffer, callback);
1037
+ });
1038
+ }
1039
+
1040
+ readlimbo(options, callback) {
1041
+ var buffersize = options.buffersize || 2048;
1042
+ var timeout = options.timeout || 60;
1043
+ var self = this;
1044
+ this.connection.svcquery([Const.isc_info_svc_limbo_trans], buffersize, timeout, function (err, data) {
1045
+ if (err || !data.buffer) {
1046
+ doError(new Error(err||'Bad query return'), callback);
1047
+ return;
1048
+ }
1049
+ self._processquery(data.buffer, callback);
1050
+ });
1051
+ }
1052
+
1053
+ }
1054
+
1055
+ ServiceManager.ShutdownMode = ShutdownMode;
1056
+ ServiceManager.ShutdownKind = ShutdownKind;
1057
+
1058
+ module.exports = ServiceManager;