Skip to content

Commit ba67c76

Browse files
committed
Add sqlite_dbpage extension build tag
1 parent 65302b0 commit ba67c76

File tree

4 files changed

+107
-2
lines changed

4 files changed

+107
-2
lines changed

.github/workflows/go.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
run: go-acc . -- -race -v -tags "libsqlite3"
4545

4646
- name: 'Tags: full'
47-
run: go-acc . -- -race -v -tags "sqlite_allow_uri_authority sqlite_app_armor sqlite_column_metadata sqlite_foreign_keys sqlite_fts5 sqlite_icu sqlite_introspect sqlite_json sqlite_math_functions sqlite_os_trace sqlite_preupdate_hook sqlite_secure_delete sqlite_see sqlite_stat4 sqlite_trace sqlite_unlock_notify sqlite_userauth sqlite_vacuum_incr sqlite_vtable"
47+
run: go-acc . -- -race -v -tags "sqlite_allow_uri_authority sqlite_app_armor sqlite_column_metadata sqlite_foreign_keys sqlite_fts5 sqlite_icu sqlite_introspect sqlite_json sqlite_math_functions sqlite_os_trace sqlite_preupdate_hook sqlite_secure_delete sqlite_see sqlite_stat4 sqlite_trace sqlite_unlock_notify sqlite_userauth sqlite_vacuum_incr sqlite_vtable sqlite_dbpage"
4848

4949
- name: 'Tags: vacuum'
5050
run: go-acc . -- -race -v -tags "sqlite_vacuum_full"
@@ -99,7 +99,7 @@ jobs:
9999
- name: 'Tags: full'
100100
run: |
101101
echo 'skip this test'
102-
echo go build -race -v -tags "sqlite_allow_uri_authority sqlite_app_armor sqlite_column_metadata sqlite_foreign_keys sqlite_fts5 sqlite_icu sqlite_introspect sqlite_json sqlite_math_functions sqlite_preupdate_hook sqlite_secure_delete sqlite_see sqlite_stat4 sqlite_trace sqlite_unlock_notify sqlite_userauth sqlite_vacuum_incr sqlite_vtable"
102+
echo go build -race -v -tags "sqlite_allow_uri_authority sqlite_app_armor sqlite_column_metadata sqlite_foreign_keys sqlite_fts5 sqlite_icu sqlite_introspect sqlite_json sqlite_math_functions sqlite_preupdate_hook sqlite_secure_delete sqlite_see sqlite_stat4 sqlite_trace sqlite_unlock_notify sqlite_userauth sqlite_vacuum_incr sqlite_vtable sqlite_dbpage"
103103
shell: msys2 {0}
104104

105105
- name: 'Tags: vacuum'

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ go build -tags "icu json1 fts5 secure_delete"
180180
| Tracing / Debug | sqlite_trace | Activate trace functions |
181181
| User Authentication | sqlite_userauth | SQLite User Authentication see [User Authentication](#user-authentication) for more information. |
182182
| Virtual Tables | sqlite_vtable | SQLite Virtual Tables see [SQLite Official VTABLE Documentation](https://www.sqlite.org/vtab.html) for more information, and a [full example here](https://github.com/mattn/go-sqlite3/tree/master/_example/vtable) |
183+
| SQLITE_DBPAGE Virtual Table | sqlite_dbpage | SQLITE_DBPAGE Virtual Table see [SQLite Official SQLITE_DBPAGE Documentation](https://www.sqlite.org/dbpage.html) for more information. |
183184

184185
# Compilation
185186

sqlite3_opt_dbpage.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (C) 2019 Yasuhiro Matsumoto <[email protected]>.
2+
//
3+
// Use of this source code is governed by an MIT-style
4+
// license that can be found in the LICENSE file.
5+
6+
//go:build sqlite_dbpage
7+
// +build sqlite_dbpage
8+
9+
package sqlite3
10+
11+
/*
12+
#cgo CFLAGS: -DSQLITE_ENABLE_DBPAGE_VTAB
13+
#cgo LDFLAGS: -lm
14+
*/
15+
import "C"

sqlite3_opt_dbpage_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright (C) 2019 Yasuhiro Matsumoto <[email protected]>.
2+
//
3+
// Use of this source code is governed by an MIT-style
4+
// license that can be found in the LICENSE file.
5+
6+
//go:build cgo
7+
// +build cgo
8+
9+
package sqlite3
10+
11+
import (
12+
"database/sql"
13+
"os"
14+
"testing"
15+
)
16+
17+
func TestDbpage(t *testing.T) {
18+
sourceFilename := TempFilename(t)
19+
defer os.Remove(sourceFilename)
20+
21+
destFilename := TempFilename(t)
22+
defer os.Remove(destFilename)
23+
24+
db, err := sql.Open("sqlite3", sourceFilename)
25+
if err != nil {
26+
t.Fatal("Failed to open database:", err)
27+
}
28+
defer db.Close()
29+
30+
if _, err = db.Exec("PRAGMA journal_mode=WAL"); err != nil {
31+
t.Fatal("Failed to Exec PRAGMA journal_mode:", err)
32+
} else if _, err := db.Exec("CREATE TABLE foo(data TEXT)"); err != nil {
33+
t.Fatal("Failed to create table:", err)
34+
} else if _, err := db.Exec("INSERT INTO foo(data) VALUES(?)", "hello sqlite_dbpage"); err != nil {
35+
t.Fatal("Failed to create table:", err)
36+
}
37+
38+
rows, err := db.Query("SELECT data FROM sqlite_dbpage")
39+
if err != nil && err.Error() == "no such table: sqlite_dbpage" {
40+
t.Skip("sqlite_dbpage not supported")
41+
} else if err != nil {
42+
t.Fatal("Unable to query sqlite_dbpage table:", err)
43+
}
44+
defer rows.Close()
45+
46+
destFile, err := os.OpenFile(destFilename, os.O_CREATE|os.O_WRONLY, 0700)
47+
if err != nil {
48+
t.Fatal("Unable to open file for writing:", err)
49+
}
50+
defer destFile.Close()
51+
52+
for rows.Next() {
53+
var page []byte
54+
if err := rows.Scan(&page); err != nil {
55+
t.Fatal("Unable to scan results:", err)
56+
}
57+
58+
if _, err := destFile.Write(page); err != nil {
59+
t.Fatal("Unable to write page to file:", err)
60+
}
61+
}
62+
if err := rows.Close(); err != nil {
63+
t.Fatal("Unable to close rows:", err)
64+
} else if err := db.Close(); err != nil {
65+
t.Fatal("Unable to close database:", err)
66+
} else if err := destFile.Close(); err != nil {
67+
t.Fatal("Unable to close file:", err)
68+
}
69+
70+
db, err = sql.Open("sqlite3", destFilename)
71+
if err != nil {
72+
t.Fatal("Failed to open database:", err)
73+
}
74+
defer db.Close()
75+
76+
var result string
77+
if err = db.QueryRow("PRAGMA integrity_check").Scan(&result); err != nil {
78+
t.Fatal("Failed to query PRAGMA integrity_check:", err)
79+
} else if result != "ok" {
80+
t.Fatal("Copied database integrity check failed:", result)
81+
}
82+
83+
var hello string
84+
if err = db.QueryRow("SELECT data FROM foo").Scan(&hello); err != nil {
85+
t.Fatal("Failed to query data:", err)
86+
} else if hello != "hello sqlite_dbpage" {
87+
t.Fatal("Unable to find expected data:", hello)
88+
}
89+
}

0 commit comments

Comments
 (0)