aboutsummaryrefslogtreecommitdiff
path: root/sqlite3.go
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2015-03-24 08:48:55 +0900
committermattn <mattn.jp@gmail.com>2015-03-24 08:48:55 +0900
commite28cd440fabdd39b9520344bc26829f61db40ece (patch)
tree727620b5650a551f7afb60efc1b647f959ef8360 /sqlite3.go
parentImplement number-named parameters. Close #187 (diff)
parentChange strlen(s) > 0 => *s != '\000'. (diff)
downloadgolite-e28cd440fabdd39b9520344bc26829f61db40ece.tar.gz
golite-e28cd440fabdd39b9520344bc26829f61db40ece.tar.xz
Merge pull request #188 from larsmans/optimize
Optimize queries
Diffstat (limited to 'sqlite3.go')
-rw-r--r--sqlite3.go42
1 files changed, 23 insertions, 19 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 65865f3..f4de3fd 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -47,14 +47,23 @@ _sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) {
#include <stdio.h>
#include <stdint.h>
-static long
-_sqlite3_last_insert_rowid(sqlite3* db) {
- return (long) sqlite3_last_insert_rowid(db);
+static int
+_sqlite3_exec(sqlite3* db, const char* pcmd, long* rowid, long* changes)
+{
+ int rv = sqlite3_exec(db, pcmd, 0, 0, 0);
+ *rowid = (long) sqlite3_last_insert_rowid(db);
+ *changes = (long) sqlite3_changes(db);
+ return rv;
}
-static long
-_sqlite3_changes(sqlite3* db) {
- return (long) sqlite3_changes(db);
+static int
+_sqlite3_step(sqlite3_stmt* stmt, long* rowid, long* changes)
+{
+ int rv = sqlite3_step(stmt);
+ sqlite3* db = sqlite3_db_handle(stmt);
+ *rowid = (long) sqlite3_last_insert_rowid(db);
+ *changes = (long) sqlite3_changes(db);
+ return rv;
}
*/
@@ -232,14 +241,13 @@ func (c *SQLiteConn) Query(query string, args []driver.Value) (driver.Rows, erro
func (c *SQLiteConn) exec(cmd string) (driver.Result, error) {
pcmd := C.CString(cmd)
defer C.free(unsafe.Pointer(pcmd))
- rv := C.sqlite3_exec(c.db, pcmd, nil, nil, nil)
+
+ var rowid, changes C.long
+ rv := C._sqlite3_exec(c.db, pcmd, &rowid, &changes)
if rv != C.SQLITE_OK {
return nil, c.lastError()
}
- return &SQLiteResult{
- int64(C._sqlite3_last_insert_rowid(c.db)),
- int64(C._sqlite3_changes(c.db)),
- }, nil
+ return &SQLiteResult{int64(rowid), int64(changes)}, nil
}
// Begin transaction.
@@ -379,7 +387,7 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
return nil, c.lastError()
}
var t string
- if tail != nil && C.strlen(tail) > 0 {
+ if tail != nil && *tail != '\000' {
t = strings.TrimSpace(C.GoString(tail))
}
nv := int(C.sqlite3_bind_parameter_count(s))
@@ -509,19 +517,15 @@ func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) {
C.sqlite3_clear_bindings(s.s)
return nil, err
}
- rv := C.sqlite3_step(s.s)
+ var rowid, changes C.long
+ rv := C._sqlite3_step(s.s, &rowid, &changes)
if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE {
err := s.c.lastError()
C.sqlite3_reset(s.s)
C.sqlite3_clear_bindings(s.s)
return nil, err
}
-
- res := &SQLiteResult{
- int64(C._sqlite3_last_insert_rowid(s.c.db)),
- int64(C._sqlite3_changes(s.c.db)),
- }
- return res, nil
+ return &SQLiteResult{int64(rowid), int64(changes)}, nil
}
// Close the rows.