diff options
Diffstat (limited to 'backup.go')
-rw-r--r-- | backup.go | 34 |
1 files changed, 24 insertions, 10 deletions
@@ -1,26 +1,34 @@ +// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + package sqlite3 /* -#include <sqlite3.h> +#include <sqlite3-binding.h> #include <stdlib.h> */ import "C" import ( + "runtime" "unsafe" ) -type Backup struct { +type SQLiteBackup struct { b *C.sqlite3_backup } -func (c *SQLiteConn) Backup(dest string, conn *SQLiteConn, src string) (*Backup, error) { +func (c *SQLiteConn) Backup(dest string, conn *SQLiteConn, src string) (*SQLiteBackup, error) { destptr := C.CString(dest) defer C.free(unsafe.Pointer(destptr)) srcptr := C.CString(src) defer C.free(unsafe.Pointer(srcptr)) if b := C.sqlite3_backup_init(c.db, destptr, conn.db, srcptr); b != nil { - return &Backup{b: b}, nil + bb := &SQLiteBackup{b: b} + runtime.SetFinalizer(bb, (*SQLiteBackup).Finish) + return bb, nil } return nil, c.lastError() } @@ -29,28 +37,34 @@ func (c *SQLiteConn) Backup(dest string, conn *SQLiteConn, src string) (*Backup, // This function returns a boolean indicating if the backup is done and // an error signalling any other error. Done is returned if the underlying C // function returns SQLITE_DONE (Code 101) -func (b *Backup) Step(p int) (bool, error) { +func (b *SQLiteBackup) Step(p int) (bool, error) { ret := C.sqlite3_backup_step(b.b, C.int(p)) - if ret == 101 { + if ret == C.SQLITE_DONE { return true, nil - } else if ret != 0 { + } else if ret != 0 && ret != C.SQLITE_LOCKED && ret != C.SQLITE_BUSY { return false, Error{Code: ErrNo(ret)} } return false, nil } -func (b *Backup) Remaining() int { +func (b *SQLiteBackup) Remaining() int { return int(C.sqlite3_backup_remaining(b.b)) } -func (b *Backup) PageCount() int { +func (b *SQLiteBackup) PageCount() int { return int(C.sqlite3_backup_pagecount(b.b)) } -func (b *Backup) Finish() error { +func (b *SQLiteBackup) Finish() error { + return b.Close() +} + +func (b *SQLiteBackup) Close() error { ret := C.sqlite3_backup_finish(b.b) if ret != 0 { return Error{Code: ErrNo(ret)} } + b.b = nil + runtime.SetFinalizer(b, nil) return nil } |