2023-06-30 02:49:21 +01:00
|
|
|
package sqlite3_test
|
|
|
|
|
|
|
|
|
|
import (
|
2023-07-01 00:15:28 +01:00
|
|
|
"bytes"
|
2023-06-30 02:49:21 +01:00
|
|
|
"fmt"
|
|
|
|
|
"log"
|
2023-07-04 02:18:03 +01:00
|
|
|
"regexp"
|
2023-06-30 02:49:21 +01:00
|
|
|
|
|
|
|
|
"golang.org/x/text/collate"
|
|
|
|
|
"golang.org/x/text/language"
|
|
|
|
|
|
|
|
|
|
"github.com/ncruces/go-sqlite3"
|
|
|
|
|
_ "github.com/ncruces/go-sqlite3/embed"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func ExampleConn_CreateCollation() {
|
2023-07-01 15:14:45 +01:00
|
|
|
db, err := sqlite3.Open(":memory:")
|
2023-06-30 02:49:21 +01:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`CREATE TABLE IF NOT EXISTS words (word VARCHAR(10))`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`INSERT INTO words (word) VALUES ('côte'), ('cote'), ('coter'), ('coté'), ('cotée'), ('côté')`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.CreateCollation("french", collate.New(language.French).Compare)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stmt, _, err := db.Prepare(`SELECT word FROM words ORDER BY word COLLATE french`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
defer stmt.Close()
|
|
|
|
|
|
|
|
|
|
for stmt.Step() {
|
|
|
|
|
fmt.Println(stmt.ColumnText(0))
|
|
|
|
|
}
|
|
|
|
|
if err := stmt.Err(); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = stmt.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
// Output:
|
|
|
|
|
// cote
|
|
|
|
|
// coté
|
|
|
|
|
// côte
|
|
|
|
|
// côté
|
|
|
|
|
// cotée
|
|
|
|
|
// coter
|
|
|
|
|
}
|
2023-07-01 00:15:28 +01:00
|
|
|
|
|
|
|
|
func ExampleConn_CreateFunction() {
|
2023-07-01 15:14:45 +01:00
|
|
|
db, err := sqlite3.Open(":memory:")
|
2023-07-01 00:15:28 +01:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`CREATE TABLE IF NOT EXISTS words (word VARCHAR(10))`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`INSERT INTO words (word) VALUES ('côte'), ('cote'), ('coter'), ('coté'), ('cotée'), ('côté')`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.CreateFunction("upper", 1, sqlite3.DETERMINISTIC|sqlite3.INNOCUOUS, func(ctx sqlite3.Context, arg ...sqlite3.Value) {
|
|
|
|
|
ctx.ResultBlob(bytes.ToUpper(arg[0].RawBlob()))
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stmt, _, err := db.Prepare(`SELECT upper(word) FROM words`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
defer stmt.Close()
|
|
|
|
|
|
|
|
|
|
for stmt.Step() {
|
|
|
|
|
fmt.Println(stmt.ColumnText(0))
|
|
|
|
|
}
|
|
|
|
|
if err := stmt.Err(); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = stmt.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
// Unordered output:
|
|
|
|
|
// COTE
|
|
|
|
|
// COTÉ
|
|
|
|
|
// CÔTE
|
|
|
|
|
// CÔTÉ
|
|
|
|
|
// COTÉE
|
|
|
|
|
// COTER
|
|
|
|
|
}
|
2023-07-04 02:18:03 +01:00
|
|
|
|
|
|
|
|
func ExampleContext_SetAuxData() {
|
|
|
|
|
db, err := sqlite3.Open(":memory:")
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`CREATE TABLE IF NOT EXISTS words (word VARCHAR(10))`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Exec(`INSERT INTO words (word) VALUES ('côte'), ('cote'), ('coter'), ('coté'), ('cotée'), ('côté')`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.CreateFunction("regexp", 2, sqlite3.DETERMINISTIC|sqlite3.INNOCUOUS, func(ctx sqlite3.Context, arg ...sqlite3.Value) {
|
|
|
|
|
re, ok := ctx.GetAuxData(0).(*regexp.Regexp)
|
|
|
|
|
if !ok {
|
|
|
|
|
r, err := regexp.Compile(arg[0].Text())
|
|
|
|
|
if err != nil {
|
|
|
|
|
ctx.ResultError(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
ctx.SetAuxData(0, r)
|
|
|
|
|
re = r
|
|
|
|
|
}
|
2023-07-11 13:38:29 +01:00
|
|
|
ctx.ResultBool(re.Match(arg[1].RawBlob()))
|
2023-07-04 02:18:03 +01:00
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stmt, _, err := db.Prepare(`SELECT word FROM words WHERE word REGEXP '^\p{L}+e$'`)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
defer stmt.Close()
|
|
|
|
|
|
|
|
|
|
for stmt.Step() {
|
|
|
|
|
fmt.Println(stmt.ColumnText(0))
|
|
|
|
|
}
|
|
|
|
|
if err := stmt.Err(); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = stmt.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = db.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
// Unordered output:
|
|
|
|
|
// cote
|
|
|
|
|
// côte
|
|
|
|
|
// cotée
|
|
|
|
|
}
|