@@ -29,21 +29,37 @@ callbackTemp = Runtime.addFunction (notUsed, argc, argv, colNames) ->
29
29
30
30
class Statement
31
31
constructor : (@stmt ) ->
32
+ @pos = 1 # Index of the leftmost parameter is 1
32
33
step : ->
34
+ @pos = 1
33
35
ret = sqlite3_step @stmt
34
36
if ret is SQLite .ROW then return true
35
37
else if ret is SQLite .DONE then return false
36
38
else throw ' SQLite error: ' + handleErrors ret
37
- getNumber : (pos ) ->
38
- return sqlite3_column_double @stmt , pos
39
- getString : (pos ) ->
40
- return sqlite3_column_text @stmt , pos
39
+ getNumber : (pos = @pos ++ ) -> sqlite3_column_double @stmt , pos
40
+ getString : (pos = @pos ++ ) -> sqlite3_column_text @stmt , pos
41
41
get : -> # Get all fields
42
42
for field in [0 ... sqlite3_data_count (@stmt )]
43
43
type = sqlite3_column_type @stmt , field
44
44
if type in [SQLite .INTEGER , SQLite .FLOAT ] then @ getNumber field
45
45
else if type in [SQLite .TEXT , SQLite .BLOB ] then @ getString field
46
46
else null
47
+ bindString : (string , pos = @pos ++ ) ->
48
+ ret = sqlite3_bind_text @stmt , pos, string, - 1 , NULL
49
+ err = handleErrors ret
50
+ if err isnt null then throw ' SQLite error : ' + err
51
+ bindNumber : (num , pos = @pos ++ ) ->
52
+ ret = sqlite3_bind_double @stmt , pos, num
53
+ err = handleErrors ret
54
+ if err isnt null then throw ' SQLite error : ' + err
55
+ bindValue : (val , pos = @pos ++ ) ->
56
+ switch typeof val
57
+ when " string" then @ bindString val, pos
58
+ when " number" then @ bindNumber val, pos
59
+ # Not binding a parameter is the same as binding it to NULL
60
+ bind : (values ) ->
61
+ @ bindValue v,i+ 1 for v,i in values # Index of the leftmost parameter is 1
62
+ null
47
63
48
64
class Database
49
65
# Open a new database:
@@ -96,9 +112,21 @@ sqlite3_open = Module.cwrap 'sqlite3_open', 'number', ['string', 'number']
96
112
sqlite3_close = Module .cwrap ' sqlite3_close' , ' number' , [' number' ];
97
113
sqlite3_exec = Module .cwrap ' sqlite3_exec' , ' number' , [' number' , ' string' , ' number' , ' number' , ' number' ]
98
114
sqlite3_free = Module .cwrap ' sqlite3_free' , ' ' , [' number' ]
115
+
116
+ # Prepared statements
117
+ # # prepare
99
118
sqlite3_prepare_v2 = Module .cwrap ' sqlite3_prepare_v2' , ' number' , [' number' , ' string' , ' number' , ' number' , ' number' ]
100
- sqlite3_step = Module .cwrap ' sqlite3_step' , ' number' , [' number' ] # int sqlite3_step(sqlite3_stmt*)
101
- sqlite3_data_count = Module .cwrap ' sqlite3_data_count' , ' number' , [' number' ] # int sqlite3_data_count(sqlite3_stmt *pStmt);
119
+ # # Bind parameters
120
+ # int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
121
+ sqlite3_bind_text = Module .cwrap ' sqlite3_bind_text' , ' number' , [' number' , ' number' , ' string' , ' number' , ' number' ]
122
+ # int sqlite3_bind_double(sqlite3_stmt*, int, double);
123
+ sqlite3_bind_double = Module .cwrap ' sqlite3_bind_double' , ' number' , [' number' , ' number' , ' number' ]
124
+
125
+ # # Get values
126
+ # int sqlite3_step(sqlite3_stmt*)
127
+ sqlite3_step = Module .cwrap ' sqlite3_step' , ' number' , [' number' ]
128
+ # int sqlite3_data_count(sqlite3_stmt *pStmt);
129
+ sqlite3_data_count = Module .cwrap ' sqlite3_data_count' , ' number' , [' number' ]
102
130
sqlite3_column_double = Module .cwrap ' sqlite3_column_double' , ' number' , [' number' , ' number' ]
103
131
sqlite3_column_text = Module .cwrap ' sqlite3_column_text' , ' string' , [' number' , ' number' ]
104
132
sqlite3_column_type = Module .cwrap ' sqlite3_column_type' , ' number' , [' number' , ' number' ]
0 commit comments