Skip to content

Commit

Permalink
Adds db.getRowsModified with docs.
Browse files Browse the repository at this point in the history
Closes #128
  • Loading branch information
dinedal committed Mar 11, 2016
1 parent 68d7db6 commit 413e139
Show file tree
Hide file tree
Showing 10 changed files with 212 additions and 146 deletions.
23 changes: 16 additions & 7 deletions coffee/api.coffee
Expand Up @@ -331,12 +331,12 @@ class Database
stmt = new Statement pStmt, this
curresult = null
while stmt['step']()
if curresult is null
curresult =
'columns' : stmt['getColumnNames']()
'values' : []
results.push curresult
curresult['values'].push stmt['get']()
if curresult is null
curresult =
'columns' : stmt['getColumnNames']()
'values' : []
results.push curresult
curresult['values'].push stmt['get']()
stmt['free']()
Runtime.stackRestore stack
return results
Expand Down Expand Up @@ -368,7 +368,7 @@ class Database
params = undefined
stmt = @['prepare'] sql, params
while stmt['step']()
callback stmt['getAsObject']()
callback(stmt['getAsObject']())
stmt['free']()
if typeof done is 'function' then done()

Expand Down Expand Up @@ -427,6 +427,15 @@ class Database
errmsg = sqlite3_errmsg @db
throw new Error(errmsg)

### Returns the number of rows modified, inserted or deleted by the
most recently completed INSERT, UPDATE or DELETE statement on the
database Executing any other type of SQL statement does not modify
the value returned by this function.
@return [Number] the number of rows modified
###
'getRowsModified': -> sqlite3_changes(@db)

### Register a custom function with SQLite
@example Register a simple function
db.create_function("addOne", function(x) {return x+1;})
Expand Down
1 change: 1 addition & 0 deletions coffee/exports.coffee
Expand Up @@ -2,6 +2,7 @@ sqlite3_open = Module['cwrap'] 'sqlite3_open', 'number', ['string', 'number']
sqlite3_close_v2 = Module['cwrap'] 'sqlite3_close_v2', 'number', ['number']
sqlite3_exec = Module['cwrap'] 'sqlite3_exec', 'number', ['number', 'string', 'number', 'number', 'number']
sqlite3_free = Module['cwrap'] 'sqlite3_free', '', ['number']
sqlite3_changes = Module['cwrap'] 'sqlite3_changes', 'number', ['number']

# Prepared statements
## prepare
Expand Down
1 change: 1 addition & 0 deletions exported_functions
Expand Up @@ -5,6 +5,7 @@
"_sqlite3_exec",
"_sqlite3_free",
"_sqlite3_errmsg",
"_sqlite3_changes",
"_sqlite3_prepare_v2",
"_sqlite3_bind_text",
"_sqlite3_bind_blob",
Expand Down
37 changes: 30 additions & 7 deletions js/sql-debug.js
Expand Up @@ -263157,7 +263157,7 @@ var FUNCTION_TABLE_viiii = [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,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12,b12
,b12,b12,b12];

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 };
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 };
})
// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg, Module.asmLibraryArg, buffer);
Expand Down Expand Up @@ -263281,10 +263281,10 @@ assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it a
return real__sqlite3_value_text.apply(null, arguments);
};

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

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

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

var real__sqlite3_free = asm["_sqlite3_free"]; asm["_sqlite3_free"] = function() {
assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
Expand Down Expand Up @@ -263434,7 +263440,7 @@ var _sqlite3_value_double = Module["_sqlite3_value_double"] = asm["_sqlite3_valu
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
var _sqlite3_result_double = Module["_sqlite3_result_double"] = asm["_sqlite3_result_double"];
var _sqlite3_value_text = Module["_sqlite3_value_text"] = asm["_sqlite3_value_text"];
var _sqlite3_create_function_v2 = Module["_sqlite3_create_function_v2"] = asm["_sqlite3_create_function_v2"];
var _sqlite3_changes = Module["_sqlite3_changes"] = asm["_sqlite3_changes"];
var _sqlite3_column_blob = Module["_sqlite3_column_blob"] = asm["_sqlite3_column_blob"];
var _sqlite3_bind_parameter_index = Module["_sqlite3_bind_parameter_index"] = asm["_sqlite3_bind_parameter_index"];
var _sqlite3_value_type = Module["_sqlite3_value_type"] = asm["_sqlite3_value_type"];
Expand All @@ -263444,6 +263450,7 @@ var _i64Add = Module["_i64Add"] = asm["_i64Add"];
var _sqlite3_value_bytes = Module["_sqlite3_value_bytes"] = asm["_sqlite3_value_bytes"];
var _sqlite3_finalize = Module["_sqlite3_finalize"] = asm["_sqlite3_finalize"];
var _sqlite3_column_double = Module["_sqlite3_column_double"] = asm["_sqlite3_column_double"];
var _sqlite3_create_function_v2 = Module["_sqlite3_create_function_v2"] = asm["_sqlite3_create_function_v2"];
var _sqlite3_free = Module["_sqlite3_free"] = asm["_sqlite3_free"];
var _sqlite3_value_int = Module["_sqlite3_value_int"] = asm["_sqlite3_value_int"];
var _sqlite3_data_count = Module["_sqlite3_data_count"] = asm["_sqlite3_data_count"];
Expand Down Expand Up @@ -263704,7 +263711,7 @@ run();


// Generated by CoffeeScript 1.9.2
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;
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;

Runtime = Module['Runtime'];

Expand Down Expand Up @@ -264212,15 +264219,16 @@ Database = (function() {
*/

Database.prototype['each'] = function(sql, params, callback, done) {
var stmt;
var curresult, stmt;
if (typeof params === 'function') {
done = callback;
callback = params;
params = void 0;
}
stmt = this['prepare'](sql, params);
while (stmt['step']()) {
callback(stmt['getAsObject']());
curresult = stmt['getAsObject']();
callback(curresult);
}
stmt['free']();
if (typeof done === 'function') {
Expand Down Expand Up @@ -264315,6 +264323,19 @@ Database = (function() {
};


/* Returns the number of rows modified, inserted or deleted by the
most recently completed INSERT, UPDATE or DELETE statement on the
database Executing any other type of SQL statement does not modify
the value returned by this function.

@return [Number] the number of rows modified
*/

Database.prototype['getRowsModified'] = function() {
return sqlite3_changes(this.db);
};


/* Register a custom function with SQLite
@example Register a simple function
db.create_function("addOne", function(x) {return x+1;})
Expand Down Expand Up @@ -264389,6 +264410,8 @@ sqlite3_exec = Module['cwrap']('sqlite3_exec', 'number', ['number', 'string', 'n

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

sqlite3_changes = Module['cwrap']('sqlite3_changes', 'number', ['number']);

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

sqlite3_prepare_v2_sqlptr = Module['cwrap']('sqlite3_prepare_v2', 'number', ['number', 'number', 'number', 'number', 'number']);
Expand Down
44 changes: 22 additions & 22 deletions js/sql.js

Large diffs are not rendered by default.

44 changes: 22 additions & 22 deletions js/worker.sql.js

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions test/test_errors.js
Expand Up @@ -41,17 +41,17 @@ exports.test = function(sql, assert) {
/table .+ already exists/,
"Trying to create a table with a name that is already used should throw an error");

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

db.close();

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

if (module == require.main) {
var sql = require('../js/sql.js');
Expand Down
31 changes: 31 additions & 0 deletions test/test_issue128.js
@@ -0,0 +1,31 @@
exports.test = function(sql, assert) {
// Create a database
var db = new sql.Database();

db.run("CREATE TABLE test (data TEXT);");

db.exec("SELECT * FROM test;");
assert.deepEqual(db.getRowsModified(), 0, "getRowsModified returns 0 at first");

db.exec("INSERT INTO test VALUES ('Hello1');");
db.exec("INSERT INTO test VALUES ('Hello');");
db.exec("INSERT INTO test VALUES ('Hello');");
db.exec("INSERT INTO test VALUES ('World4');");
assert.deepEqual(db.getRowsModified(), 1, "getRowsModified works for inserts");

db.exec("UPDATE test SET data = 'World4' where data = 'Hello';");
assert.deepEqual(db.getRowsModified(), 2, "getRowsModified works for updates");

db.exec("DELETE FROM test;");
assert.deepEqual(db.getRowsModified(), 4, "getRowsModified works for deletes");

db.exec("SELECT * FROM test;");
assert.deepEqual(db.getRowsModified(), 4, "getRowsModified unmodified by queries");

};

if (module == require.main) {
var sql = require('../js/sql.js');
var assert = require('assert');
exports.test(sql, assert);
}
48 changes: 24 additions & 24 deletions test/test_issue73.js
@@ -1,9 +1,9 @@
exports.test = function(sql, assert) {
// Create a database
var db = new sql.Database();
// Create a database
var db = new sql.Database();

// Execute some sql
sqlstr = "CREATE TABLE COMPANY("+
// Execute some sql
sqlstr = "CREATE TABLE COMPANY("+
" ID INT PRIMARY KEY NOT NULL,"+
" NAME TEXT NOT NULL,"+
" AGE INT NOT NULL,"+
Expand All @@ -26,27 +26,27 @@ exports.test = function(sql, assert) {
" SELECT * FROM AUDIT;"+
" INSERT INTO COMPANY VALUES (42,'B',8,'',1600);"+
" SELECT EMP_ID FROM AUDIT ORDER BY EMP_ID";
var res = db.exec(sqlstr);
var expectedResult = [
{
columns : ['EMP_ID','ENTRY_DATE'],
values : [
[73, '2014-11-10']
]
},
{
columns : ['EMP_ID'],
values : [
[42],[73]
]
}
];
assert.deepEqual(res, expectedResult,
"db.exec with a statement that contains a ';'");
var res = db.exec(sqlstr);
var expectedResult = [
{
columns : ['EMP_ID','ENTRY_DATE'],
values : [
[73, '2014-11-10']
]
},
{
columns : ['EMP_ID'],
values : [
[42],[73]
]
}
];
assert.deepEqual(res, expectedResult,
"db.exec with a statement that contains a ';'");
};

if (module == require.main) {
var sql = require('../js/sql.js');
var assert = require('assert');
exports.test(sql, assert);
var sql = require('../js/sql.js');
var assert = require('assert');
exports.test(sql, assert);
}

0 comments on commit 413e139

Please sign in to comment.