Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 93d8e09

Browse files
author
Frank Braun
committed
update github.com/mattn/go-sqlite3 to latest
Related to mutecomm#8
1 parent c295eba commit 93d8e09

File tree

74 files changed

+11225
-654
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+11225
-654
lines changed

.MAINTENANCE.swp

12 KB
Binary file not shown.

MAINTENANCE

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,10 @@ tracked for changes (maintenance details below):
99
Update code from https://github.com/mattn/go-sqlite3
1010
----------------------------------------------------
1111

12-
Current HEAD: cf7286f069c3ef596efcc87781a4653a2e7607bd
13-
(from 2017-04-08)
12+
Current HEAD: 4c2df3cc4614a8001c1afdebcbda0fcf6e045719
13+
(from 2020-07-21)
1414

15-
Track files:
16-
17-
error.go
18-
error_test.go
19-
sqlite3.go (dead code and extension loading removed, sqlcipher pragmas added)
20-
sqlite3_other.go
21-
sqlite3_test.go (adjust path)
22-
sqlite3_windows.go
23-
_example/simple/simple.go
24-
sqlite3_test/sqltest.go
15+
Use ./track_go-sqlite3.sh
2516

2617

2718
Update code from https://github.com/sqlcipher/sqlcipher
@@ -42,6 +33,6 @@ Update code from https://github.com/libtom/libtomcrypt
4233
------------------------------------------------------
4334

4435
Current HEAD: d8d7a83b34e0f37f78d206d45f3f058d14e905bb
45-
(from develop branch)
36+
(from develop branch, 2020-07-14)
4637

4738
Use ./track_libtomcrypt.sh

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.PHONY: all update-modules
22

33
all:
4-
env GO111MODULE=on go build -v . ./_example/simple/...
4+
env GO111MODULE=on go build -v ./...
55

66
update-modules:
77
env GO111MODULE=on go get -u

_example/custom_func/main.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
7+
"math"
8+
"math/rand"
9+
10+
sqlite "github.com/mutecomm/go-sqlcipher/v4"
11+
)
12+
13+
// Computes x^y
14+
func pow(x, y int64) int64 {
15+
return int64(math.Pow(float64(x), float64(y)))
16+
}
17+
18+
// Computes the bitwise exclusive-or of all its arguments
19+
func xor(xs ...int64) int64 {
20+
var ret int64
21+
for _, x := range xs {
22+
ret ^= x
23+
}
24+
return ret
25+
}
26+
27+
// Returns a random number. It's actually deterministic here because
28+
// we don't seed the RNG, but it's an example of a non-pure function
29+
// from SQLite's POV.
30+
func getrand() int64 {
31+
return rand.Int63()
32+
}
33+
34+
// Computes the standard deviation of a GROUPed BY set of values
35+
type stddev struct {
36+
xs []int64
37+
// Running average calculation
38+
sum int64
39+
n int64
40+
}
41+
42+
func newStddev() *stddev { return &stddev{} }
43+
44+
func (s *stddev) Step(x int64) {
45+
s.xs = append(s.xs, x)
46+
s.sum += x
47+
s.n++
48+
}
49+
50+
func (s *stddev) Done() float64 {
51+
mean := float64(s.sum) / float64(s.n)
52+
var sqDiff []float64
53+
for _, x := range s.xs {
54+
sqDiff = append(sqDiff, math.Pow(float64(x)-mean, 2))
55+
}
56+
var dev float64
57+
for _, x := range sqDiff {
58+
dev += x
59+
}
60+
dev /= float64(len(sqDiff))
61+
return math.Sqrt(dev)
62+
}
63+
64+
func main() {
65+
sql.Register("sqlite3_custom", &sqlite.SQLiteDriver{
66+
ConnectHook: func(conn *sqlite.SQLiteConn) error {
67+
if err := conn.RegisterFunc("pow", pow, true); err != nil {
68+
return err
69+
}
70+
if err := conn.RegisterFunc("xor", xor, true); err != nil {
71+
return err
72+
}
73+
if err := conn.RegisterFunc("rand", getrand, false); err != nil {
74+
return err
75+
}
76+
if err := conn.RegisterAggregator("stddev", newStddev, true); err != nil {
77+
return err
78+
}
79+
return nil
80+
},
81+
})
82+
83+
db, err := sql.Open("sqlite3_custom", ":memory:")
84+
if err != nil {
85+
log.Fatal("Failed to open database:", err)
86+
}
87+
defer db.Close()
88+
89+
var i int64
90+
err = db.QueryRow("SELECT pow(2,3)").Scan(&i)
91+
if err != nil {
92+
log.Fatal("POW query error:", err)
93+
}
94+
fmt.Println("pow(2,3) =", i) // 8
95+
96+
err = db.QueryRow("SELECT xor(1,2,3,4,5,6)").Scan(&i)
97+
if err != nil {
98+
log.Fatal("XOR query error:", err)
99+
}
100+
fmt.Println("xor(1,2,3,4,5) =", i) // 7
101+
102+
err = db.QueryRow("SELECT rand()").Scan(&i)
103+
if err != nil {
104+
log.Fatal("RAND query error:", err)
105+
}
106+
fmt.Println("rand() =", i) // pseudorandom
107+
108+
_, err = db.Exec("create table foo (department integer, profits integer)")
109+
if err != nil {
110+
log.Fatal("Failed to create table:", err)
111+
}
112+
_, err = db.Exec("insert into foo values (1, 10), (1, 20), (1, 45), (2, 42), (2, 115)")
113+
if err != nil {
114+
log.Fatal("Failed to insert records:", err)
115+
}
116+
117+
rows, err := db.Query("select department, stddev(profits) from foo group by department")
118+
if err != nil {
119+
log.Fatal("STDDEV query error:", err)
120+
}
121+
defer rows.Close()
122+
for rows.Next() {
123+
var dept int64
124+
var dev float64
125+
if err := rows.Scan(&dept, &dev); err != nil {
126+
log.Fatal(err)
127+
}
128+
fmt.Printf("dept=%d stddev=%f\n", dept, dev)
129+
}
130+
if err := rows.Err(); err != nil {
131+
log.Fatal(err)
132+
}
133+
}

_example/hook/hook.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"log"
6+
"os"
7+
8+
"github.com/mutecomm/go-sqlcipher/v4"
9+
)
10+
11+
func main() {
12+
sqlite3conn := []*sqlite3.SQLiteConn{}
13+
sql.Register("sqlite3_with_hook_example",
14+
&sqlite3.SQLiteDriver{
15+
ConnectHook: func(conn *sqlite3.SQLiteConn) error {
16+
sqlite3conn = append(sqlite3conn, conn)
17+
conn.RegisterUpdateHook(func(op int, db string, table string, rowid int64) {
18+
switch op {
19+
case sqlite3.SQLITE_INSERT:
20+
log.Println("Notified of insert on db", db, "table", table, "rowid", rowid)
21+
}
22+
})
23+
return nil
24+
},
25+
})
26+
os.Remove("./foo.db")
27+
os.Remove("./bar.db")
28+
29+
srcDb, err := sql.Open("sqlite3_with_hook_example", "./foo.db")
30+
if err != nil {
31+
log.Fatal(err)
32+
}
33+
defer srcDb.Close()
34+
srcDb.Ping()
35+
36+
_, err = srcDb.Exec("create table foo(id int, value text)")
37+
if err != nil {
38+
log.Fatal(err)
39+
}
40+
_, err = srcDb.Exec("insert into foo values(1, 'foo')")
41+
if err != nil {
42+
log.Fatal(err)
43+
}
44+
_, err = srcDb.Exec("insert into foo values(2, 'bar')")
45+
if err != nil {
46+
log.Fatal(err)
47+
}
48+
_, err = srcDb.Query("select * from foo")
49+
if err != nil {
50+
log.Fatal(err)
51+
}
52+
destDb, err := sql.Open("sqlite3_with_hook_example", "./bar.db")
53+
if err != nil {
54+
log.Fatal(err)
55+
}
56+
defer destDb.Close()
57+
destDb.Ping()
58+
59+
bk, err := sqlite3conn[1].Backup("main", sqlite3conn[0], "main")
60+
if err != nil {
61+
log.Fatal(err)
62+
}
63+
64+
_, err = bk.Step(-1)
65+
if err != nil {
66+
log.Fatal(err)
67+
}
68+
_, err = destDb.Query("select * from foo")
69+
if err != nil {
70+
log.Fatal(err)
71+
}
72+
_, err = destDb.Exec("insert into foo values(3, 'bar')")
73+
if err != nil {
74+
log.Fatal(err)
75+
}
76+
77+
bk.Finish()
78+
}

_example/limit/limit.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
7+
"os"
8+
"strings"
9+
10+
"github.com/mutecomm/go-sqlcipher/v4"
11+
)
12+
13+
func createBulkInsertQuery(n int, start int) (query string, args []interface{}) {
14+
values := make([]string, n)
15+
args = make([]interface{}, n*2)
16+
pos := 0
17+
for i := 0; i < n; i++ {
18+
values[i] = "(?, ?)"
19+
args[pos] = start + i
20+
args[pos+1] = fmt.Sprintf("こんにちわ世界%03d", i)
21+
pos += 2
22+
}
23+
query = fmt.Sprintf(
24+
"insert into foo(id, name) values %s",
25+
strings.Join(values, ", "),
26+
)
27+
return
28+
}
29+
30+
func bulkInsert(db *sql.DB, query string, args []interface{}) (err error) {
31+
stmt, err := db.Prepare(query)
32+
if err != nil {
33+
return
34+
}
35+
36+
_, err = stmt.Exec(args...)
37+
if err != nil {
38+
return
39+
}
40+
41+
return
42+
}
43+
44+
func main() {
45+
var sqlite3conn *sqlite3.SQLiteConn
46+
sql.Register("sqlite3_with_limit", &sqlite3.SQLiteDriver{
47+
ConnectHook: func(conn *sqlite3.SQLiteConn) error {
48+
sqlite3conn = conn
49+
return nil
50+
},
51+
})
52+
53+
os.Remove("./foo.db")
54+
db, err := sql.Open("sqlite3_with_limit", "./foo.db")
55+
if err != nil {
56+
log.Fatal(err)
57+
}
58+
defer db.Close()
59+
60+
sqlStmt := `
61+
create table foo (id integer not null primary key, name text);
62+
delete from foo;
63+
`
64+
_, err = db.Exec(sqlStmt)
65+
if err != nil {
66+
log.Printf("%q: %s\n", err, sqlStmt)
67+
return
68+
}
69+
70+
if sqlite3conn == nil {
71+
log.Fatal("not set sqlite3 connection")
72+
}
73+
74+
limitVariableNumber := sqlite3conn.GetLimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER)
75+
log.Printf("default SQLITE_LIMIT_VARIABLE_NUMBER: %d", limitVariableNumber)
76+
77+
num := 400
78+
query, args := createBulkInsertQuery(num, 0)
79+
err = bulkInsert(db, query, args)
80+
if err != nil {
81+
log.Fatal(err)
82+
}
83+
84+
smallLimitVariableNumber := 100
85+
sqlite3conn.SetLimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER, smallLimitVariableNumber)
86+
87+
limitVariableNumber = sqlite3conn.GetLimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER)
88+
log.Printf("updated SQLITE_LIMIT_VARIABLE_NUMBER: %d", limitVariableNumber)
89+
90+
query, args = createBulkInsertQuery(num, num)
91+
err = bulkInsert(db, query, args)
92+
if err != nil {
93+
if err != nil {
94+
log.Printf("expect failed since SQLITE_LIMIT_VARIABLE_NUMBER is too small: %v", err)
95+
}
96+
}
97+
98+
bigLimitVariableNumber := 999999
99+
sqlite3conn.SetLimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER, bigLimitVariableNumber)
100+
limitVariableNumber = sqlite3conn.GetLimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER)
101+
log.Printf("set SQLITE_LIMIT_VARIABLE_NUMBER: %d", bigLimitVariableNumber)
102+
log.Printf("updated SQLITE_LIMIT_VARIABLE_NUMBER: %d", limitVariableNumber)
103+
104+
query, args = createBulkInsertQuery(500, num+num)
105+
err = bulkInsert(db, query, args)
106+
if err != nil {
107+
if err != nil {
108+
log.Fatal(err)
109+
}
110+
}
111+
112+
log.Println("no error if SQLITE_LIMIT_VARIABLE_NUMBER > 999")
113+
}

_example/mod_regexp/Makefile

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
ifeq ($(OS),Windows_NT)
2+
EXE=extension.exe
3+
LIB_EXT=dll
4+
RM=cmd /c del
5+
LDFLAG=
6+
else
7+
EXE=extension
8+
ifeq ($(shell uname -s),Darwin)
9+
LIB_EXT=dylib
10+
else
11+
LIB_EXT=so
12+
endif
13+
RM=rm -f
14+
LDFLAG=-fPIC
15+
endif
16+
LIB=sqlite3_mod_regexp.$(LIB_EXT)
17+
18+
all : $(EXE) $(LIB)
19+
20+
$(EXE) : extension.go
21+
go build $<
22+
23+
$(LIB) : sqlite3_mod_regexp.c
24+
gcc $(LDFLAG) -shared -o $@ $< -lsqlite3 -lpcre
25+
26+
clean :
27+
@-$(RM) $(EXE) $(LIB)

0 commit comments

Comments
 (0)