Skip to content

Commit b8bb915

Browse files
committed
Merge pull request sql-js#144 from dinedal/add_get_rows_modified
Adds `db.getRowsModified` with docs.
2 parents 68d7db6 + 413e139 commit b8bb915

File tree

10 files changed

+212
-146
lines changed

10 files changed

+212
-146
lines changed

coffee/api.coffee

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -331,12 +331,12 @@ class Database
331331
stmt = new Statement pStmt, this
332332
curresult = null
333333
while stmt['step']()
334-
if curresult is null
335-
curresult =
336-
'columns' : stmt['getColumnNames']()
337-
'values' : []
338-
results.push curresult
339-
curresult['values'].push stmt['get']()
334+
if curresult is null
335+
curresult =
336+
'columns' : stmt['getColumnNames']()
337+
'values' : []
338+
results.push curresult
339+
curresult['values'].push stmt['get']()
340340
stmt['free']()
341341
Runtime.stackRestore stack
342342
return results
@@ -368,7 +368,7 @@ class Database
368368
params = undefined
369369
stmt = @['prepare'] sql, params
370370
while stmt['step']()
371-
callback stmt['getAsObject']()
371+
callback(stmt['getAsObject']())
372372
stmt['free']()
373373
if typeof done is 'function' then done()
374374

@@ -427,6 +427,15 @@ class Database
427427
errmsg = sqlite3_errmsg @db
428428
throw new Error(errmsg)
429429

430+
### Returns the number of rows modified, inserted or deleted by the
431+
most recently completed INSERT, UPDATE or DELETE statement on the
432+
database Executing any other type of SQL statement does not modify
433+
the value returned by this function.
434+
435+
@return [Number] the number of rows modified
436+
###
437+
'getRowsModified': -> sqlite3_changes(@db)
438+
430439
### Register a custom function with SQLite
431440
@example Register a simple function
432441
db.create_function("addOne", function(x) {return x+1;})

coffee/exports.coffee

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ sqlite3_open = Module['cwrap'] 'sqlite3_open', 'number', ['string', 'number']
22
sqlite3_close_v2 = Module['cwrap'] 'sqlite3_close_v2', 'number', ['number']
33
sqlite3_exec = Module['cwrap'] 'sqlite3_exec', 'number', ['number', 'string', 'number', 'number', 'number']
44
sqlite3_free = Module['cwrap'] 'sqlite3_free', '', ['number']
5+
sqlite3_changes = Module['cwrap'] 'sqlite3_changes', 'number', ['number']
56

67
# Prepared statements
78
## prepare

exported_functions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"_sqlite3_exec",
66
"_sqlite3_free",
77
"_sqlite3_errmsg",
8+
"_sqlite3_changes",
89
"_sqlite3_prepare_v2",
910
"_sqlite3_bind_text",
1011
"_sqlite3_bind_blob",

js/sql-debug.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -263157,7 +263157,7 @@ var FUNCTION_TABLE_viiii = [b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,
263157263157
,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12
263158263158
,b12,b12,b12];
263159263159

263160-
return { _sqlite3_value_blob: _sqlite3_value_blob, _sqlite3_column_name: _sqlite3_column_name, _sqlite3_reset: _sqlite3_reset, _sqlite3_column_type: _sqlite3_column_type, _sqlite3_exec: _sqlite3_exec, _sqlite3_result_null: _sqlite3_result_null, _sqlite3_step: _sqlite3_step, _bitshift64Lshr: _bitshift64Lshr, _sqlite3_prepare_v2: _sqlite3_prepare_v2, _sqlite3_close_v2: _sqlite3_close_v2, _sqlite3_open: _sqlite3_open, _bitshift64Shl: _bitshift64Shl, _sqlite3_result_text: _sqlite3_result_text, _fflush: _fflush, _sqlite3_column_bytes: _sqlite3_column_bytes, _sqlite3_bind_int: _sqlite3_bind_int, _sqlite3_bind_blob: _sqlite3_bind_blob, _memset: _memset, _sqlite3_value_double: _sqlite3_value_double, _memcpy: _memcpy, _sqlite3_result_double: _sqlite3_result_double, _sqlite3_value_text: _sqlite3_value_text, _sqlite3_create_function_v2: _sqlite3_create_function_v2, _sqlite3_column_blob: _sqlite3_column_blob, _sqlite3_bind_parameter_index: _sqlite3_bind_parameter_index, _sqlite3_value_type: _sqlite3_value_type, _i64Subtract: _i64Subtract, _sqlite3_column_text: _sqlite3_column_text, _i64Add: _i64Add, _sqlite3_value_bytes: _sqlite3_value_bytes, _sqlite3_finalize: _sqlite3_finalize, _sqlite3_column_double: _sqlite3_column_double, _sqlite3_free: _sqlite3_free, _sqlite3_value_int: _sqlite3_value_int, _sqlite3_data_count: _sqlite3_data_count, _sqlite3_bind_text: _sqlite3_bind_text, _sqlite3_bind_double: _sqlite3_bind_double, ___errno_location: ___errno_location, _RegisterExtensionFunctions: _RegisterExtensionFunctions, _free: _free, _memmove: _memmove, _sqlite3_errmsg: _sqlite3_errmsg, _sqlite3_clear_bindings: _sqlite3_clear_bindings, _malloc: _malloc, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, establishStackSpace: establishStackSpace, setThrew: setThrew, setTempRet0: setTempRet0, getTempRet0: getTempRet0, dynCall_iiii: dynCall_iiii, dynCall_i: dynCall_i, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_iiiiiii: dynCall_iiiiiii, dynCall_ii: dynCall_ii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_iiiii: dynCall_iiiii, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_iiiiii: dynCall_iiiiii, dynCall_viiii: dynCall_viiii };
263160+
return { _sqlite3_value_blob: _sqlite3_value_blob, _sqlite3_column_name: _sqlite3_column_name, _sqlite3_reset: _sqlite3_reset, _sqlite3_column_type: _sqlite3_column_type, _sqlite3_exec: _sqlite3_exec, _sqlite3_result_null: _sqlite3_result_null, _sqlite3_step: _sqlite3_step, _bitshift64Lshr: _bitshift64Lshr, _sqlite3_prepare_v2: _sqlite3_prepare_v2, _sqlite3_close_v2: _sqlite3_close_v2, _sqlite3_open: _sqlite3_open, _bitshift64Shl: _bitshift64Shl, _sqlite3_result_text: _sqlite3_result_text, _fflush: _fflush, _sqlite3_column_bytes: _sqlite3_column_bytes, _sqlite3_bind_int: _sqlite3_bind_int, _sqlite3_bind_blob: _sqlite3_bind_blob, _memset: _memset, _sqlite3_value_double: _sqlite3_value_double, _memcpy: _memcpy, _sqlite3_result_double: _sqlite3_result_double, _sqlite3_value_text: _sqlite3_value_text, _sqlite3_changes: _sqlite3_changes, _sqlite3_column_blob: _sqlite3_column_blob, _sqlite3_bind_parameter_index: _sqlite3_bind_parameter_index, _sqlite3_value_type: _sqlite3_value_type, _i64Subtract: _i64Subtract, _sqlite3_column_text: _sqlite3_column_text, _i64Add: _i64Add, _sqlite3_value_bytes: _sqlite3_value_bytes, _sqlite3_finalize: _sqlite3_finalize, _sqlite3_column_double: _sqlite3_column_double, _sqlite3_create_function_v2: _sqlite3_create_function_v2, _sqlite3_free: _sqlite3_free, _sqlite3_value_int: _sqlite3_value_int, _sqlite3_data_count: _sqlite3_data_count, _sqlite3_bind_text: _sqlite3_bind_text, _sqlite3_bind_double: _sqlite3_bind_double, ___errno_location: ___errno_location, _RegisterExtensionFunctions: _RegisterExtensionFunctions, _free: _free, _memmove: _memmove, _sqlite3_errmsg: _sqlite3_errmsg, _sqlite3_clear_bindings: _sqlite3_clear_bindings, _malloc: _malloc, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, establishStackSpace: establishStackSpace, setThrew: setThrew, setTempRet0: setTempRet0, getTempRet0: getTempRet0, dynCall_iiii: dynCall_iiii, dynCall_i: dynCall_i, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_iiiiiii: dynCall_iiiiiii, dynCall_ii: dynCall_ii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_iiiii: dynCall_iiiii, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_iiiiii: dynCall_iiiiii, dynCall_viiii: dynCall_viiii };
263161263161
})
263162263162
// EMSCRIPTEN_END_ASM
263163263163
(Module.asmGlobalArg, Module.asmLibraryArg, buffer);
@@ -263281,10 +263281,10 @@ assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it a
263281263281
return real__sqlite3_value_text.apply(null, arguments);
263282263282
};
263283263283

263284-
var real__sqlite3_create_function_v2 = asm["_sqlite3_create_function_v2"]; asm["_sqlite3_create_function_v2"] = function() {
263284+
var real__sqlite3_changes = asm["_sqlite3_changes"]; asm["_sqlite3_changes"] = function() {
263285263285
assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
263286263286
assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
263287-
return real__sqlite3_create_function_v2.apply(null, arguments);
263287+
return real__sqlite3_changes.apply(null, arguments);
263288263288
};
263289263289

263290263290
var real__sqlite3_column_blob = asm["_sqlite3_column_blob"]; asm["_sqlite3_column_blob"] = function() {
@@ -263341,6 +263341,12 @@ assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it a
263341263341
return real__sqlite3_column_double.apply(null, arguments);
263342263342
};
263343263343

263344+
var real__sqlite3_create_function_v2 = asm["_sqlite3_create_function_v2"]; asm["_sqlite3_create_function_v2"] = function() {
263345+
assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
263346+
assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
263347+
return real__sqlite3_create_function_v2.apply(null, arguments);
263348+
};
263349+
263344263350
var real__sqlite3_free = asm["_sqlite3_free"]; asm["_sqlite3_free"] = function() {
263345263351
assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
263346263352
assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
@@ -263434,7 +263440,7 @@ var _sqlite3_value_double = Module["_sqlite3_value_double"] = asm["_sqlite3_valu
263434263440
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
263435263441
var _sqlite3_result_double = Module["_sqlite3_result_double"] = asm["_sqlite3_result_double"];
263436263442
var _sqlite3_value_text = Module["_sqlite3_value_text"] = asm["_sqlite3_value_text"];
263437-
var _sqlite3_create_function_v2 = Module["_sqlite3_create_function_v2"] = asm["_sqlite3_create_function_v2"];
263443+
var _sqlite3_changes = Module["_sqlite3_changes"] = asm["_sqlite3_changes"];
263438263444
var _sqlite3_column_blob = Module["_sqlite3_column_blob"] = asm["_sqlite3_column_blob"];
263439263445
var _sqlite3_bind_parameter_index = Module["_sqlite3_bind_parameter_index"] = asm["_sqlite3_bind_parameter_index"];
263440263446
var _sqlite3_value_type = Module["_sqlite3_value_type"] = asm["_sqlite3_value_type"];
@@ -263444,6 +263450,7 @@ var _i64Add = Module["_i64Add"] = asm["_i64Add"];
263444263450
var _sqlite3_value_bytes = Module["_sqlite3_value_bytes"] = asm["_sqlite3_value_bytes"];
263445263451
var _sqlite3_finalize = Module["_sqlite3_finalize"] = asm["_sqlite3_finalize"];
263446263452
var _sqlite3_column_double = Module["_sqlite3_column_double"] = asm["_sqlite3_column_double"];
263453+
var _sqlite3_create_function_v2 = Module["_sqlite3_create_function_v2"] = asm["_sqlite3_create_function_v2"];
263447263454
var _sqlite3_free = Module["_sqlite3_free"] = asm["_sqlite3_free"];
263448263455
var _sqlite3_value_int = Module["_sqlite3_value_int"] = asm["_sqlite3_value_int"];
263449263456
var _sqlite3_data_count = Module["_sqlite3_data_count"] = asm["_sqlite3_data_count"];
@@ -263704,7 +263711,7 @@ run();
263704263711

263705263712

263706263713
// Generated by CoffeeScript 1.9.2
263707-
var Database, NULL, RegisterExtensionFunctions, Runtime, SQLite, Statement, apiTemp, i, sqlite3_bind_blob, sqlite3_bind_double, sqlite3_bind_int, sqlite3_bind_parameter_index, sqlite3_bind_text, sqlite3_clear_bindings, sqlite3_close_v2, sqlite3_column_blob, sqlite3_column_bytes, sqlite3_column_double, sqlite3_column_name, sqlite3_column_text, sqlite3_column_type, sqlite3_create_function_v2, sqlite3_data_count, sqlite3_errmsg, sqlite3_exec, sqlite3_finalize, sqlite3_free, sqlite3_open, sqlite3_prepare_v2, sqlite3_prepare_v2_sqlptr, sqlite3_reset, sqlite3_result_double, sqlite3_result_null, sqlite3_result_text, sqlite3_step, sqlite3_value_blob, sqlite3_value_bytes, sqlite3_value_double, sqlite3_value_int, sqlite3_value_text, sqlite3_value_type;
263714+
var Database, NULL, RegisterExtensionFunctions, Runtime, SQLite, Statement, apiTemp, i, sqlite3_bind_blob, sqlite3_bind_double, sqlite3_bind_int, sqlite3_bind_parameter_index, sqlite3_bind_text, sqlite3_changes, sqlite3_clear_bindings, sqlite3_close_v2, sqlite3_column_blob, sqlite3_column_bytes, sqlite3_column_double, sqlite3_column_name, sqlite3_column_text, sqlite3_column_type, sqlite3_create_function_v2, sqlite3_data_count, sqlite3_errmsg, sqlite3_exec, sqlite3_finalize, sqlite3_free, sqlite3_open, sqlite3_prepare_v2, sqlite3_prepare_v2_sqlptr, sqlite3_reset, sqlite3_result_double, sqlite3_result_null, sqlite3_result_text, sqlite3_step, sqlite3_value_blob, sqlite3_value_bytes, sqlite3_value_double, sqlite3_value_int, sqlite3_value_text, sqlite3_value_type;
263708263715

263709263716
Runtime = Module['Runtime'];
263710263717

@@ -264212,15 +264219,16 @@ Database = (function() {
264212264219
*/
264213264220

264214264221
Database.prototype['each'] = function(sql, params, callback, done) {
264215-
var stmt;
264222+
var curresult, stmt;
264216264223
if (typeof params === 'function') {
264217264224
done = callback;
264218264225
callback = params;
264219264226
params = void 0;
264220264227
}
264221264228
stmt = this['prepare'](sql, params);
264222264229
while (stmt['step']()) {
264223-
callback(stmt['getAsObject']());
264230+
curresult = stmt['getAsObject']();
264231+
callback(curresult);
264224264232
}
264225264233
stmt['free']();
264226264234
if (typeof done === 'function') {
@@ -264315,6 +264323,19 @@ Database = (function() {
264315264323
};
264316264324

264317264325

264326+
/* Returns the number of rows modified, inserted or deleted by the
264327+
most recently completed INSERT, UPDATE or DELETE statement on the
264328+
database Executing any other type of SQL statement does not modify
264329+
the value returned by this function.
264330+
264331+
@return [Number] the number of rows modified
264332+
*/
264333+
264334+
Database.prototype['getRowsModified'] = function() {
264335+
return sqlite3_changes(this.db);
264336+
};
264337+
264338+
264318264339
/* Register a custom function with SQLite
264319264340
@example Register a simple function
264320264341
db.create_function("addOne", function(x) {return x+1;})
@@ -264389,6 +264410,8 @@ sqlite3_exec = Module['cwrap']('sqlite3_exec', 'number', ['number', 'string', 'n
264389264410

264390264411
sqlite3_free = Module['cwrap']('sqlite3_free', '', ['number']);
264391264412

264413+
sqlite3_changes = Module['cwrap']('sqlite3_changes', 'number', ['number']);
264414+
264392264415
sqlite3_prepare_v2 = Module['cwrap']('sqlite3_prepare_v2', 'number', ['number', 'string', 'number', 'number', 'number']);
264393264416

264394264417
sqlite3_prepare_v2_sqlptr = Module['cwrap']('sqlite3_prepare_v2', 'number', ['number', 'number', 'number', 'number', 'number']);

js/sql.js

Lines changed: 22 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/worker.sql.js

Lines changed: 22 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/test_errors.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,17 @@ exports.test = function(sql, assert) {
4141
/table .+ already exists/,
4242
"Trying to create a table with a name that is already used should throw an error");
4343

44-
stmt.run([2])
44+
stmt.run([2]);
4545
assert.deepEqual(db.exec("SELECT a,b FROM test WHERE a=2"),
46-
[{columns:['a', 'b'],values:[[2, null]]}]
47-
, "Previous errors should not have spoiled the statement");
46+
[{columns:['a', 'b'],values:[[2, null]]}],
47+
"Previous errors should not have spoiled the statement");
4848

4949
db.close();
5050

5151
assert.throws(function(){
5252
stmt.run([3]);
5353
}, "Statements should'nt be able to execute after the database is closed");
54-
}
54+
};
5555

5656
if (module == require.main) {
5757
var sql = require('../js/sql.js');

test/test_issue128.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
exports.test = function(sql, assert) {
2+
// Create a database
3+
var db = new sql.Database();
4+
5+
db.run("CREATE TABLE test (data TEXT);");
6+
7+
db.exec("SELECT * FROM test;");
8+
assert.deepEqual(db.getRowsModified(), 0, "getRowsModified returns 0 at first");
9+
10+
db.exec("INSERT INTO test VALUES ('Hello1');");
11+
db.exec("INSERT INTO test VALUES ('Hello');");
12+
db.exec("INSERT INTO test VALUES ('Hello');");
13+
db.exec("INSERT INTO test VALUES ('World4');");
14+
assert.deepEqual(db.getRowsModified(), 1, "getRowsModified works for inserts");
15+
16+
db.exec("UPDATE test SET data = 'World4' where data = 'Hello';");
17+
assert.deepEqual(db.getRowsModified(), 2, "getRowsModified works for updates");
18+
19+
db.exec("DELETE FROM test;");
20+
assert.deepEqual(db.getRowsModified(), 4, "getRowsModified works for deletes");
21+
22+
db.exec("SELECT * FROM test;");
23+
assert.deepEqual(db.getRowsModified(), 4, "getRowsModified unmodified by queries");
24+
25+
};
26+
27+
if (module == require.main) {
28+
var sql = require('../js/sql.js');
29+
var assert = require('assert');
30+
exports.test(sql, assert);
31+
}

test/test_issue73.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
exports.test = function(sql, assert) {
2-
// Create a database
3-
var db = new sql.Database();
2+
// Create a database
3+
var db = new sql.Database();
44

5-
// Execute some sql
6-
sqlstr = "CREATE TABLE COMPANY("+
5+
// Execute some sql
6+
sqlstr = "CREATE TABLE COMPANY("+
77
" ID INT PRIMARY KEY NOT NULL,"+
88
" NAME TEXT NOT NULL,"+
99
" AGE INT NOT NULL,"+
@@ -26,27 +26,27 @@ exports.test = function(sql, assert) {
2626
" SELECT * FROM AUDIT;"+
2727
" INSERT INTO COMPANY VALUES (42,'B',8,'',1600);"+
2828
" SELECT EMP_ID FROM AUDIT ORDER BY EMP_ID";
29-
var res = db.exec(sqlstr);
30-
var expectedResult = [
31-
{
32-
columns : ['EMP_ID','ENTRY_DATE'],
33-
values : [
34-
[73, '2014-11-10']
35-
]
36-
},
37-
{
38-
columns : ['EMP_ID'],
39-
values : [
40-
[42],[73]
41-
]
42-
}
43-
];
44-
assert.deepEqual(res, expectedResult,
45-
"db.exec with a statement that contains a ';'");
29+
var res = db.exec(sqlstr);
30+
var expectedResult = [
31+
{
32+
columns : ['EMP_ID','ENTRY_DATE'],
33+
values : [
34+
[73, '2014-11-10']
35+
]
36+
},
37+
{
38+
columns : ['EMP_ID'],
39+
values : [
40+
[42],[73]
41+
]
42+
}
43+
];
44+
assert.deepEqual(res, expectedResult,
45+
"db.exec with a statement that contains a ';'");
4646
};
4747

4848
if (module == require.main) {
49-
var sql = require('../js/sql.js');
50-
var assert = require('assert');
51-
exports.test(sql, assert);
49+
var sql = require('../js/sql.js');
50+
var assert = require('assert');
51+
exports.test(sql, assert);
5252
}

0 commit comments

Comments
 (0)