Skip to content

Commit b9e1ac3

Browse files
committed
upgrade mattn/go-sqlite3 to v1.14.16
1 parent 25f68ad commit b9e1ac3

38 files changed

+1196
-197
lines changed

MAINTENANCE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ tracked for changes (maintenance details below):
99
Update code from https://github.com/mattn/go-sqlite3
1010
----------------------------------------------------
1111

12-
Current release: v1.14.5
12+
Current release: v1.14.16
1313

1414
Use ./track_go-sqlite3.sh
1515

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
TARGET = custom_driver_name
2+
ifeq ($(OS),Windows_NT)
3+
TARGET := $(TARGET).exe
4+
endif
5+
6+
all : $(TARGET)
7+
8+
$(TARGET) : main.go
9+
go build -ldflags="-X 'github.com/mattn/go-sqlite3.driverName=my-sqlite3'"
10+
11+
clean :
12+
rm -f $(TARGET)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
6+
_ "github.com/mutecomm/go-sqlcipher/v4"
7+
)
8+
9+
func main() {
10+
for _, driver := range sql.Drivers() {
11+
println(driver)
12+
}
13+
}

_example/fuzz/fuzz_openexec.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package sqlite3_fuzz
2+
3+
import (
4+
"bytes"
5+
"database/sql"
6+
"io/ioutil"
7+
8+
_ "github.com/mutecomm/go-sqlcipher/v4"
9+
)
10+
11+
func FuzzOpenExec(data []byte) int {
12+
sep := bytes.IndexByte(data, 0)
13+
if sep <= 0 {
14+
return 0
15+
}
16+
err := ioutil.WriteFile("/tmp/fuzz.db", data[sep+1:], 0644)
17+
if err != nil {
18+
return 0
19+
}
20+
db, err := sql.Open("sqlite3", "/tmp/fuzz.db")
21+
if err != nil {
22+
return 0
23+
}
24+
defer db.Close()
25+
_, err = db.Exec(string(data[:sep-1]))
26+
if err != nil {
27+
return 0
28+
}
29+
return 1
30+
}

_example/limit/limit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func createBulkInsertQuery(n int, start int) (query string, args []interface{})
1717
for i := 0; i < n; i++ {
1818
values[i] = "(?, ?)"
1919
args[pos] = start + i
20-
args[pos+1] = fmt.Sprintf("こんにちわ世界%03d", i)
20+
args[pos+1] = fmt.Sprintf("こんにちは世界%03d", i)
2121
pos += 2
2222
}
2323
query = fmt.Sprintf(

_example/simple/Dockerfile

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# =============================================================================
2+
# Multi-stage Dockerfile Example
3+
# =============================================================================
4+
# This is a simple Dockerfile that will build an image of scratch-base image.
5+
# Usage:
6+
# docker build -t simple:local . && docker run --rm simple:local
7+
# =============================================================================
8+
9+
# -----------------------------------------------------------------------------
10+
# Build Stage
11+
# -----------------------------------------------------------------------------
12+
FROM golang:alpine AS build
13+
14+
# Important:
15+
# Because this is a CGO enabled package, you are required to set it as 1.
16+
ENV CGO_ENABLED=1
17+
18+
RUN apk add --no-cache \
19+
# Important: required for go-sqlite3
20+
gcc \
21+
# Required for Alpine
22+
musl-dev
23+
24+
WORKDIR /workspace
25+
26+
COPY . /workspace/
27+
28+
RUN \
29+
go mod init github.com/mattn/sample && \
30+
go mod tidy && \
31+
go install -ldflags='-s -w -extldflags "-static"' ./simple.go
32+
33+
RUN \
34+
# Smoke test
35+
set -o pipefail; \
36+
/go/bin/simple | grep 99\ こんにちは世界099
37+
38+
# -----------------------------------------------------------------------------
39+
# Main Stage
40+
# -----------------------------------------------------------------------------
41+
FROM scratch
42+
43+
COPY --from=build /go/bin/simple /usr/local/bin/simple
44+
45+
ENTRYPOINT [ "/usr/local/bin/simple" ]

_example/simple/simple.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ func main() {
3838
}
3939
defer stmt.Close()
4040
for i := 0; i < 100; i++ {
41-
_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
41+
_, err = stmt.Exec(i, fmt.Sprintf("こんにちは世界%03d", i))
4242
if err != nil {
4343
log.Fatal(err)
4444
}
4545
}
46-
tx.Commit()
46+
err = tx.Commit()
47+
if err != nil {
48+
log.Fatal(err)
49+
}
4750

4851
rows, err := db.Query("select id, name from foo")
4952
if err != nil {

_example/vtable/vtable.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ func (v *ghRepoTable) Open() (sqlite3.VTabCursor, error) {
6363
}
6464

6565
func (v *ghRepoTable) BestIndex(cst []sqlite3.InfoConstraint, ob []sqlite3.InfoOrderBy) (*sqlite3.IndexResult, error) {
66-
return &sqlite3.IndexResult{}, nil
66+
used := make([]bool, len(csts))
67+
return &sqlite3.IndexResult{
68+
IdxNum: 0,
69+
IdxStr: "default",
70+
Used: used,
71+
}, nil
6772
}
6873

6974
func (v *ghRepoTable) Disconnect() error { return nil }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
7+
8+
sqlite3 "github.com/mutecomm/go-sqlcipher/v4"
9+
)
10+
11+
func main() {
12+
sql.Register("sqlite3_with_extensions", &sqlite3.SQLiteDriver{
13+
ConnectHook: func(conn *sqlite3.SQLiteConn) error {
14+
return conn.CreateModule("series", &seriesModule{})
15+
},
16+
})
17+
db, err := sql.Open("sqlite3_with_extensions", ":memory:")
18+
if err != nil {
19+
log.Fatal(err)
20+
}
21+
defer db.Close()
22+
23+
rows, err := db.Query("select * from series")
24+
if err != nil {
25+
log.Fatal(err)
26+
}
27+
defer rows.Close()
28+
for rows.Next() {
29+
var value int
30+
rows.Scan(&value)
31+
fmt.Printf("value: %d\n", value)
32+
}
33+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
sqlite3 "github.com/mutecomm/go-sqlcipher/v4"
7+
)
8+
9+
type seriesModule struct{}
10+
11+
func (m *seriesModule) EponymousOnlyModule() {}
12+
13+
func (m *seriesModule) Create(c *sqlite3.SQLiteConn, args []string) (sqlite3.VTab, error) {
14+
err := c.DeclareVTab(fmt.Sprintf(`
15+
CREATE TABLE %s (
16+
value INT,
17+
start HIDDEN,
18+
stop HIDDEN,
19+
step HIDDEN
20+
)`, args[0]))
21+
if err != nil {
22+
return nil, err
23+
}
24+
return &seriesTable{0, 0, 1}, nil
25+
}
26+
27+
func (m *seriesModule) Connect(c *sqlite3.SQLiteConn, args []string) (sqlite3.VTab, error) {
28+
return m.Create(c, args)
29+
}
30+
31+
func (m *seriesModule) DestroyModule() {}
32+
33+
type seriesTable struct {
34+
start int64
35+
stop int64
36+
step int64
37+
}
38+
39+
func (v *seriesTable) Open() (sqlite3.VTabCursor, error) {
40+
return &seriesCursor{v, 0}, nil
41+
}
42+
43+
func (v *seriesTable) BestIndex(csts []sqlite3.InfoConstraint, ob []sqlite3.InfoOrderBy) (*sqlite3.IndexResult, error) {
44+
used := make([]bool, len(csts))
45+
for c, cst := range csts {
46+
if cst.Usable && cst.Op == sqlite3.OpEQ {
47+
used[c] = true
48+
}
49+
}
50+
51+
return &sqlite3.IndexResult{
52+
IdxNum: 0,
53+
IdxStr: "default",
54+
Used: used,
55+
}, nil
56+
}
57+
58+
func (v *seriesTable) Disconnect() error { return nil }
59+
func (v *seriesTable) Destroy() error { return nil }
60+
61+
type seriesCursor struct {
62+
*seriesTable
63+
value int64
64+
}
65+
66+
func (vc *seriesCursor) Column(c *sqlite3.SQLiteContext, col int) error {
67+
switch col {
68+
case 0:
69+
c.ResultInt64(vc.value)
70+
case 1:
71+
c.ResultInt64(vc.seriesTable.start)
72+
case 2:
73+
c.ResultInt64(vc.seriesTable.stop)
74+
case 3:
75+
c.ResultInt64(vc.seriesTable.step)
76+
}
77+
return nil
78+
}
79+
80+
func (vc *seriesCursor) Filter(idxNum int, idxStr string, vals []interface{}) error {
81+
switch {
82+
case len(vals) < 1:
83+
vc.seriesTable.start = 0
84+
vc.seriesTable.stop = 1000
85+
vc.value = vc.seriesTable.start
86+
case len(vals) < 2:
87+
vc.seriesTable.start = vals[0].(int64)
88+
vc.seriesTable.stop = 1000
89+
vc.value = vc.seriesTable.start
90+
case len(vals) < 3:
91+
vc.seriesTable.start = vals[0].(int64)
92+
vc.seriesTable.stop = vals[1].(int64)
93+
vc.value = vc.seriesTable.start
94+
case len(vals) < 4:
95+
vc.seriesTable.start = vals[0].(int64)
96+
vc.seriesTable.stop = vals[1].(int64)
97+
vc.seriesTable.step = vals[2].(int64)
98+
}
99+
100+
return nil
101+
}
102+
103+
func (vc *seriesCursor) Next() error {
104+
vc.value += vc.step
105+
return nil
106+
}
107+
108+
func (vc *seriesCursor) EOF() bool {
109+
return vc.value > vc.stop
110+
}
111+
112+
func (vc *seriesCursor) Rowid() (int64, error) {
113+
return int64(vc.value), nil
114+
}
115+
116+
func (vc *seriesCursor) Close() error {
117+
return nil
118+
}

0 commit comments

Comments
 (0)