generated from C4T-BuT-S4D/ad-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
86 lines (74 loc) · 1.86 KB
/
main.go
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
package main
import (
"context"
"fmt"
"log"
"github.com/genjidb/genji"
"github.com/genjidb/genji/types"
"github.com/titanous/json5"
)
func main() {
// Create a database instance, here we'll store everything on-disk
db, err := genji.Open("mydb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// If needed, attach context, e.g. (*http.Request).Context().
db = db.WithContext(context.Background())
// Create a table with a strict schema.
// Useful to have full control of the table content.
// Notice that it is possible to define constraint on nested documents.
err = db.Exec(`
CREATE TABLE if not exists user (
id INT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
friends ARRAY,
kek DOCUMENT
)
`)
if err != nil {
panic(err)
}
err = db.Exec(`CREATE INDEX IF NOT EXISTS idx_user_friends ON user (friends)`)
if err != nil {
panic(err)
}
// Go structures can be passed directly
type User struct {
ID uint
Name string
Friends []string
Kek map[string]any
}
goodFriends := []string{"a", "b"}
// Let's create a user
u := User{
ID: 23,
Name: "foo3",
Friends: goodFriends,
Kek: map[string]any{"lol\\\": 2.0, kek: 1} // ": 1},
}
err = db.Exec(`INSERT INTO user VALUES ?`, &u)
if err != nil {
panic(err)
}
attackFriends := make([]string, 1000)
for i := range attackFriends {
attackFriends[i] = "a"
}
// Query some documents
res, err := db.Query("SELECT * FROM user")
// always close the result when you're done with it
defer res.Close()
res.Iterate(func(d types.Document) error {
kek, err := d.GetByField("kek")
fmt.Printf("name=%v, err=%v", kek, err)
var k any
if err := json5.Unmarshal([]byte(fmt.Sprintf("%v", kek)), &k); err != nil {
panic(err)
}
fmt.Printf("kek=%v\n", k)
return nil
})
}