From d4673cd31cac7742ce1735defa74d63090ac3401 Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 9 Sep 2013 10:44:44 +0900 Subject: [PATCH] Implements Execer --- _example/simple/simple.go | 18 ++++++++---------- sqlite3.go | 34 ++++++++++++++++++++++++++++++---- sqlite3_test.go | 21 +++++++++++++++++++++ 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) + } +} +