Skip to content

Commit 2e0690b

Browse files
committed
add Database#run, Database#execute, Database#all and Database#get
1 parent 98645f5 commit 2e0690b

3 files changed

Lines changed: 159 additions & 2 deletions

File tree

lib/sqlite3.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,29 @@ Database.prototype.prepare = function(sql) {
3535
return new Statement(this, sql, params.pop());
3636
}
3737
};
38+
39+
// Database#run(sql, [bind1, bind2, ...], [callback])
40+
Database.prototype.run = function(sql) {
41+
var statement = new Statement(this, sql);
42+
statement.run.apply(statement, Array.prototype.slice.call(arguments, 1));
43+
return this;
44+
}
45+
46+
// Database#get(sql, [bind1, bind2, ...], [callback])
47+
Database.prototype.get = function(sql) {
48+
var statement = new Statement(this, sql);
49+
statement.get.apply(statement, Array.prototype.slice.call(arguments, 1));
50+
return this;
51+
}
52+
53+
// Database#all(sql, [bind1, bind2, ...], [callback])
54+
Database.prototype.all = function(sql) {
55+
var statement = new Statement(this, sql);
56+
statement.all.apply(statement, Array.prototype.slice.call(arguments, 1));
57+
return this;
58+
}
59+
60+
Database.prototype.execute = function() {
61+
console.warn('Database#execute() is deprecated. Use Database#all() instead.');
62+
return this.all.apply(this, arguments);
63+
};

src/database.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ class Database : public EventEmitter {
9191

9292
~Database() {
9393
assert(handle == NULL);
94-
fprintf(stderr, "Deleted Database\n");
9594
}
9695

9796
static Handle<Value> New(const Arguments& args);

test/prepare.test.js

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,6 @@ exports['test all() parameter binding'] = function(beforeExit) {
250250
});
251251
};
252252

253-
254253
exports['test all() without results'] = function(beforeExit) {
255254
var db = new sqlite3.Database('test/support/prepare.db', sqlite3.OPEN_READONLY);
256255

@@ -267,3 +266,136 @@ exports['test all() without results'] = function(beforeExit) {
267266
assert.ok(empty, "Didn't retrieve an empty result set");
268267
});
269268
};
269+
270+
exports['test high concurrency'] = function(beforeExit) {
271+
var db = new sqlite3.Database(':memory:');
272+
273+
function randomString() {
274+
var str = '';
275+
for (var i = Math.random() * 300; i > 0; i--) {
276+
str += String.fromCharCode(Math.floor(Math.random() * 256));
277+
}
278+
return str;
279+
};
280+
281+
// Generate random data.
282+
var data = [];
283+
var length = Math.floor(Math.random() * 1000) + 200;
284+
for (var i = 0; i < length; i++) {
285+
data.push([ randomString(), i, i * Math.random(), null ]);
286+
}
287+
288+
var inserted = false;
289+
var retrieved = 0;
290+
291+
Step(
292+
function() {
293+
db.prepare("CREATE TABLE foo (txt text, num int, flt float, blb blob)").run(this);
294+
},
295+
function(err) {
296+
if (err) throw err;
297+
var group = this.group();
298+
for (var i = 0; i < data.length; i++) {
299+
var stmt = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)");
300+
stmt.run(data[i][0], data[i][1], data[i][2], data[i][3], group());
301+
}
302+
},
303+
function(err, result) {
304+
if (err) throw err;
305+
assert.ok(result.length === length, 'Invalid length');
306+
inserted = true;
307+
308+
db.prepare("SELECT txt, num, flt, blb FROM foo")
309+
.all(function(err, rows) {
310+
if (err) throw err;
311+
312+
for (var i = 0; i < rows.length; i++) {
313+
assert.ok(data[rows[i][1]] !== true);
314+
315+
assert.equal(rows[i][0], data[rows[i][1]][0]);
316+
assert.equal(rows[i][1], data[rows[i][1]][1]);
317+
assert.equal(rows[i][2], data[rows[i][1]][2]);
318+
assert.equal(rows[i][3], data[rows[i][1]][3]);
319+
320+
// Mark the data row as already retrieved.
321+
data[rows[i][1]] = true;
322+
retrieved++;
323+
}
324+
});
325+
}
326+
);
327+
328+
beforeExit(function() {
329+
assert.ok(inserted);
330+
});
331+
};
332+
333+
exports['test Database#get()'] = function(beforeExit) {
334+
var db = new sqlite3.Database('test/support/prepare.db', sqlite3.OPEN_READONLY);
335+
336+
var retrieved = 0;
337+
338+
db.get("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10', function(err, row) {
339+
if (err) throw err;
340+
assert.equal(row[0], 'String 10');
341+
assert.equal(row[1], 10);
342+
assert.equal(row[2], 10 * Math.PI);
343+
assert.equal(row[3], null);
344+
retrieved++;
345+
});
346+
347+
beforeExit(function() {
348+
assert.equal(1, retrieved, "Didn't retrieve all rows");
349+
});
350+
};
351+
352+
exports['test Database#run() and Database#all()'] = function(beforeExit) {
353+
var db = new sqlite3.Database(':memory:');
354+
355+
var inserted = 0;
356+
var retrieved = 0;
357+
358+
// We insert and retrieve that many rows.
359+
var count = 1000;
360+
361+
Step(
362+
function() {
363+
db.run("CREATE TABLE foo (txt text, num int, flt float, blb blob)", this);
364+
},
365+
function(err) {
366+
if (err) throw err;
367+
var group = this.group();
368+
for (var i = 0; i < count; i++) {
369+
db.run("INSERT INTO foo VALUES(?, ?, ?, ?)",
370+
'String ' + i,
371+
i,
372+
i * Math.PI,
373+
// null (SQLite sets this implicitly)
374+
group()
375+
);
376+
}
377+
},
378+
function(err, rows) {
379+
if (err) throw err;
380+
inserted += rows.length;
381+
db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", this)
382+
},
383+
function(err, rows) {
384+
if (err) throw err;
385+
assert.equal(count, rows.length, "Couldn't retrieve all rows");
386+
387+
for (var i = 0; i < count; i++) {
388+
assert.equal(rows[i][0], 'String ' + i);
389+
assert.equal(rows[i][1], i);
390+
assert.equal(rows[i][2], i * Math.PI);
391+
assert.equal(rows[i][3], null);
392+
retrieved++;
393+
}
394+
}
395+
);
396+
397+
beforeExit(function() {
398+
assert.equal(count, inserted, "Didn't insert all rows");
399+
assert.equal(count, retrieved, "Didn't retrieve all rows");
400+
});
401+
};

0 commit comments

Comments
 (0)