66 lines
2.1 KiB
Go
66 lines
2.1 KiB
Go
// Copyright 2025 The Sqlite Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package sqlite // import "modernc.org/sqlite"
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
|
|
sqlite3 "modernc.org/sqlite/lib"
|
|
)
|
|
|
|
// Backup object is used to manage progress and cleanup an online backup. It
|
|
// is returned by NewBackup or NewRestore.
|
|
type Backup struct {
|
|
srcConn *conn // source database connection
|
|
dstConn *conn // destination database connection
|
|
pBackup uintptr // sqlite3_backup object pointer
|
|
}
|
|
|
|
// Step will copy up to n pages between the source and destination databases
|
|
// specified by the backup object. If n is negative, all remaining source
|
|
// pages are copied.
|
|
// If it successfully copies n pages and there are still more pages to be
|
|
// copied, then the function returns true with no error. If it successfully
|
|
// finishes copying all pages from source to destination, then it returns
|
|
// false with no error. If an error occurs while running, then an error is
|
|
// returned.
|
|
func (b *Backup) Step(n int32) (bool, error) {
|
|
rc := sqlite3.Xsqlite3_backup_step(b.srcConn.tls, b.pBackup, n)
|
|
if rc == sqlite3.SQLITE_OK {
|
|
return true, nil
|
|
} else if rc == sqlite3.SQLITE_DONE {
|
|
return false, nil
|
|
} else {
|
|
return false, b.srcConn.errstr(rc)
|
|
}
|
|
}
|
|
|
|
// Finish releases all resources associated with the Backup object. The Backup
|
|
// object is invalid and may not be used following a call to Finish.
|
|
func (b *Backup) Finish() error {
|
|
rc := sqlite3.Xsqlite3_backup_finish(b.srcConn.tls, b.pBackup)
|
|
b.dstConn.Close()
|
|
if rc == sqlite3.SQLITE_OK {
|
|
return nil
|
|
} else {
|
|
return b.srcConn.errstr(rc)
|
|
}
|
|
}
|
|
|
|
// Commit releases all resources associated with the Backup object but does not
|
|
// close the destination database connection.
|
|
//
|
|
// The destination database connection is returned to the caller or an error if raised.
|
|
// It is the responsibility of the caller to handle the connection closure.
|
|
func (b *Backup) Commit() (driver.Conn, error) {
|
|
rc := sqlite3.Xsqlite3_backup_finish(b.srcConn.tls, b.pBackup)
|
|
|
|
if rc == sqlite3.SQLITE_OK {
|
|
return b.dstConn, nil
|
|
} else {
|
|
return nil, b.srcConn.errstr(rc)
|
|
}
|
|
}
|