Skip to content

Commit e28cd44

Browse files
committed
Merge pull request #188 from larsmans/optimize
Optimize queries
2 parents 07f9c9c + 4dfb2ec commit e28cd44

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

sqlite3.go

+23-19
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,23 @@ _sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) {
4747
#include <stdio.h>
4848
#include <stdint.h>
4949
50-
static long
51-
_sqlite3_last_insert_rowid(sqlite3* db) {
52-
return (long) sqlite3_last_insert_rowid(db);
50+
static int
51+
_sqlite3_exec(sqlite3* db, const char* pcmd, long* rowid, long* changes)
52+
{
53+
int rv = sqlite3_exec(db, pcmd, 0, 0, 0);
54+
*rowid = (long) sqlite3_last_insert_rowid(db);
55+
*changes = (long) sqlite3_changes(db);
56+
return rv;
5357
}
5458
55-
static long
56-
_sqlite3_changes(sqlite3* db) {
57-
return (long) sqlite3_changes(db);
59+
static int
60+
_sqlite3_step(sqlite3_stmt* stmt, long* rowid, long* changes)
61+
{
62+
int rv = sqlite3_step(stmt);
63+
sqlite3* db = sqlite3_db_handle(stmt);
64+
*rowid = (long) sqlite3_last_insert_rowid(db);
65+
*changes = (long) sqlite3_changes(db);
66+
return rv;
5867
}
5968
6069
*/
@@ -232,14 +241,13 @@ func (c *SQLiteConn) Query(query string, args []driver.Value) (driver.Rows, erro
232241
func (c *SQLiteConn) exec(cmd string) (driver.Result, error) {
233242
pcmd := C.CString(cmd)
234243
defer C.free(unsafe.Pointer(pcmd))
235-
rv := C.sqlite3_exec(c.db, pcmd, nil, nil, nil)
244+
245+
var rowid, changes C.long
246+
rv := C._sqlite3_exec(c.db, pcmd, &rowid, &changes)
236247
if rv != C.SQLITE_OK {
237248
return nil, c.lastError()
238249
}
239-
return &SQLiteResult{
240-
int64(C._sqlite3_last_insert_rowid(c.db)),
241-
int64(C._sqlite3_changes(c.db)),
242-
}, nil
250+
return &SQLiteResult{int64(rowid), int64(changes)}, nil
243251
}
244252

245253
// Begin transaction.
@@ -379,7 +387,7 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
379387
return nil, c.lastError()
380388
}
381389
var t string
382-
if tail != nil && C.strlen(tail) > 0 {
390+
if tail != nil && *tail != '\000' {
383391
t = strings.TrimSpace(C.GoString(tail))
384392
}
385393
nv := int(C.sqlite3_bind_parameter_count(s))
@@ -509,19 +517,15 @@ func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) {
509517
C.sqlite3_clear_bindings(s.s)
510518
return nil, err
511519
}
512-
rv := C.sqlite3_step(s.s)
520+
var rowid, changes C.long
521+
rv := C._sqlite3_step(s.s, &rowid, &changes)
513522
if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE {
514523
err := s.c.lastError()
515524
C.sqlite3_reset(s.s)
516525
C.sqlite3_clear_bindings(s.s)
517526
return nil, err
518527
}
519-
520-
res := &SQLiteResult{
521-
int64(C._sqlite3_last_insert_rowid(s.c.db)),
522-
int64(C._sqlite3_changes(s.c.db)),
523-
}
524-
return res, nil
528+
return &SQLiteResult{int64(rowid), int64(changes)}, nil
525529
}
526530

527531
// Close the rows.

0 commit comments

Comments
 (0)