forked from mirror/go-sqlite3
100 lines
2.7 KiB
Go
100 lines
2.7 KiB
Go
|
// +build !libsqlite3 sqlite_serialize
|
||
|
|
||
|
package sqlite3
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"database/sql"
|
||
|
"os"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestSerializeDeserialize(t *testing.T) {
|
||
|
// Connect to the source database.
|
||
|
srcTempFilename := TempFilename(t)
|
||
|
defer os.Remove(srcTempFilename)
|
||
|
srcDb, err := sql.Open(driverName, srcTempFilename)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to open the source database:", err)
|
||
|
}
|
||
|
defer srcDb.Close()
|
||
|
err = srcDb.Ping()
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to connect to the source database:", err)
|
||
|
}
|
||
|
|
||
|
// Connect to the destination database.
|
||
|
destTempFilename := TempFilename(t)
|
||
|
defer os.Remove(destTempFilename)
|
||
|
destDb, err := sql.Open(driverName, destTempFilename)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to open the destination database:", err)
|
||
|
}
|
||
|
defer destDb.Close()
|
||
|
err = destDb.Ping()
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to connect to the destination database:", err)
|
||
|
}
|
||
|
|
||
|
// Write data to source database.
|
||
|
_, err = srcDb.Exec(`CREATE TABLE foo (name string)`)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to create table in source database:", err)
|
||
|
}
|
||
|
_, err = srcDb.Exec(`INSERT INTO foo(name) VALUES("alice")`)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to insert data into source database", err)
|
||
|
}
|
||
|
|
||
|
// Serialize the source database
|
||
|
srcConn, err := srcDb.Conn(context.Background())
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to get connection to source database:", err)
|
||
|
}
|
||
|
defer srcConn.Close()
|
||
|
|
||
|
var serialized []byte
|
||
|
if err := srcConn.Raw(func(raw interface{}) error {
|
||
|
var err error
|
||
|
serialized, err = raw.(*SQLiteConn).Serialize("")
|
||
|
return err
|
||
|
}); err != nil {
|
||
|
t.Fatal("Failed to serialize source database:", err)
|
||
|
}
|
||
|
srcConn.Close()
|
||
|
|
||
|
// Confirm that the destination database is initially empty.
|
||
|
var destTableCount int
|
||
|
err = destDb.QueryRow("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'").Scan(&destTableCount)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to check the destination table count:", err)
|
||
|
}
|
||
|
if destTableCount != 0 {
|
||
|
t.Fatalf("The destination database is not empty; %v table(s) found.", destTableCount)
|
||
|
}
|
||
|
|
||
|
// Deserialize to destination database
|
||
|
destConn, err := destDb.Conn(context.Background())
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to get connection to destination database:", err)
|
||
|
}
|
||
|
defer destConn.Close()
|
||
|
|
||
|
if err := destConn.Raw(func(raw interface{}) error {
|
||
|
return raw.(*SQLiteConn).Deserialize(serialized, "")
|
||
|
}); err != nil {
|
||
|
t.Fatal("Failed to deserialize source database:", err)
|
||
|
}
|
||
|
destConn.Close()
|
||
|
|
||
|
// Confirm that destination database has been loaded correctly.
|
||
|
var destRowCount int
|
||
|
err = destDb.QueryRow(`SELECT COUNT(*) FROM foo`).Scan(&destRowCount)
|
||
|
if err != nil {
|
||
|
t.Fatal("Failed to count rows in destination database table", err)
|
||
|
}
|
||
|
if destRowCount != 1 {
|
||
|
t.Fatalf("Destination table does not have the expected records")
|
||
|
}
|
||
|
}
|