aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_example/simple/simple.go18
-rw-r--r--sqlite3.go34
-rw-r--r--sqlite3_test.go21
3 files changed, 59 insertions, 14 deletions
diff --git a/_example/simple/simple.go b/_example/simple/simple.go
index 5e9c902..21c09c9 100644
--- a/_example/simple/simple.go
+++ b/_example/simple/simple.go
@@ -17,16 +17,14 @@ func main() {
}
defer db.Close()
- sqls := []string{
- "create table foo (id integer not null primary key, name text)",
- "delete from foo",
- }
- for _, sql := range sqls {
- _, err = db.Exec(sql)
- if err != nil {
- log.Printf("%q: %s\n", err, sql)
- return
- }
+ sql := `
+ create table foo (id integer not null primary key, name text);
+ delete from foo;
+ `
+ _, err = db.Exec(sql)
+ if err != nil {
+ log.Printf("%q: %s\n", err, sql)
+ return
}
tx, err := db.Begin()
diff --git a/sqlite3.go b/sqlite3.go
index 4ac45e1..3d77f06 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -129,10 +129,36 @@ func (tx *SQLiteTx) Rollback() error {
return nil
}
+// AutoCommit return which currently auto commit or not.
func (c *SQLiteConn) AutoCommit() bool {
return int(C.sqlite3_get_autocommit(c.db)) != 0
}
+// Implements Execer
+func (c *SQLiteConn) Exec(query string, args []driver.Value) (driver.Result, error) {
+ for {
+ println(query)
+ ds, err := c.Prepare(query)
+ if err != nil {
+ println("FOO1")
+ return nil, err
+ }
+ s := ds.(*SQLiteStmt)
+ na := s.NumInput()
+ res, err := s.Exec(args[:na])
+ args = args[na:]
+ s.Close()
+ if err != nil {
+ return nil, err
+ }
+ if s.t == "" {
+ return res, nil
+ }
+ s.Close()
+ query = s.t
+ }
+}
+
func (c *SQLiteConn) exec(cmd string) error {
pcmd := C.CString(cmd)
defer C.free(unsafe.Pointer(pcmd))
@@ -244,14 +270,14 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
pquery := C.CString(query)
defer C.free(unsafe.Pointer(pquery))
var s *C.sqlite3_stmt
- var perror *C.char
- rv := C.sqlite3_prepare_v2(c.db, pquery, -1, &s, &perror)
+ var tail *C.char
+ rv := C.sqlite3_prepare_v2(c.db, pquery, -1, &s, &tail)
if rv != C.SQLITE_OK {
return nil, ErrNo(rv)
}
var t string
- if perror != nil && C.strlen(perror) > 0 {
- t = C.GoString(perror)
+ if tail != nil && C.strlen(tail) > 0 {
+ t = strings.TrimSpace(C.GoString(tail))
}
return &SQLiteStmt{c: c, s: s, t: t}, nil
}
diff --git a/sqlite3_test.go b/sqlite3_test.go
index 3df76c0..6c0487e 100644
--- a/sqlite3_test.go
+++ b/sqlite3_test.go
@@ -579,3 +579,24 @@ func TestTransaction(t *testing.T) {
t.Fatal("Expected failure to query")
}
}
+
+func TestExecer(t *testing.T) {
+ tempFilename := TempFilename()
+ db, err := sql.Open("sqlite3", tempFilename)
+ if err != nil {
+ t.Fatal("Failed to open database:", err)
+ }
+ defer os.Remove(tempFilename)
+ defer db.Close()
+
+ _, err = db.Exec(`
+ create table foo (id integer)");
+ insert into foo values(1);
+ insert into foo values(2);
+ insert into foo values(3);
+ `)
+ if err != nil {
+ t.Error("Failed to call db.Exec:", err)
+ }
+}
+