Implements Execer
This commit is contained in:
parent
73ea0ad09f
commit
d4673cd31c
|
@ -17,16 +17,14 @@ func main() {
|
||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
sqls := []string{
|
sql := `
|
||||||
"create table foo (id integer not null primary key, name text)",
|
create table foo (id integer not null primary key, name text);
|
||||||
"delete from foo",
|
delete from foo;
|
||||||
}
|
`
|
||||||
for _, sql := range sqls {
|
_, err = db.Exec(sql)
|
||||||
_, err = db.Exec(sql)
|
if err != nil {
|
||||||
if err != nil {
|
log.Printf("%q: %s\n", err, sql)
|
||||||
log.Printf("%q: %s\n", err, sql)
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tx, err := db.Begin()
|
tx, err := db.Begin()
|
||||||
|
|
34
sqlite3.go
34
sqlite3.go
|
@ -129,10 +129,36 @@ func (tx *SQLiteTx) Rollback() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AutoCommit return which currently auto commit or not.
|
||||||
func (c *SQLiteConn) AutoCommit() bool {
|
func (c *SQLiteConn) AutoCommit() bool {
|
||||||
return int(C.sqlite3_get_autocommit(c.db)) != 0
|
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 {
|
func (c *SQLiteConn) exec(cmd string) error {
|
||||||
pcmd := C.CString(cmd)
|
pcmd := C.CString(cmd)
|
||||||
defer C.free(unsafe.Pointer(pcmd))
|
defer C.free(unsafe.Pointer(pcmd))
|
||||||
|
@ -244,14 +270,14 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
|
||||||
pquery := C.CString(query)
|
pquery := C.CString(query)
|
||||||
defer C.free(unsafe.Pointer(pquery))
|
defer C.free(unsafe.Pointer(pquery))
|
||||||
var s *C.sqlite3_stmt
|
var s *C.sqlite3_stmt
|
||||||
var perror *C.char
|
var tail *C.char
|
||||||
rv := C.sqlite3_prepare_v2(c.db, pquery, -1, &s, &perror)
|
rv := C.sqlite3_prepare_v2(c.db, pquery, -1, &s, &tail)
|
||||||
if rv != C.SQLITE_OK {
|
if rv != C.SQLITE_OK {
|
||||||
return nil, ErrNo(rv)
|
return nil, ErrNo(rv)
|
||||||
}
|
}
|
||||||
var t string
|
var t string
|
||||||
if perror != nil && C.strlen(perror) > 0 {
|
if tail != nil && C.strlen(tail) > 0 {
|
||||||
t = C.GoString(perror)
|
t = strings.TrimSpace(C.GoString(tail))
|
||||||
}
|
}
|
||||||
return &SQLiteStmt{c: c, s: s, t: t}, nil
|
return &SQLiteStmt{c: c, s: s, t: t}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -579,3 +579,24 @@ func TestTransaction(t *testing.T) {
|
||||||
t.Fatal("Expected failure to query")
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue