aboutsummaryrefslogtreecommitdiff
path: root/sqlite3_opt_serialize_test.go
blob: 624c5a94eb14ab7e5ce3fc4f7bf62753fb2074db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// +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")
	}
}