mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 14:09:13 +00:00
161 lines
2.8 KiB
Go
161 lines
2.8 KiB
Go
package csv_test
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"testing"
|
|
|
|
"github.com/ncruces/go-sqlite3"
|
|
_ "github.com/ncruces/go-sqlite3/embed"
|
|
"github.com/ncruces/go-sqlite3/ext/csv"
|
|
)
|
|
|
|
func Example() {
|
|
db, err := sqlite3.Open(":memory:")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
csv.Register(db)
|
|
|
|
err = db.Exec(`
|
|
CREATE VIRTUAL TABLE eurofxref USING csv(
|
|
filename = 'testdata/eurofxref.csv',
|
|
header = YES,
|
|
columns = 42,
|
|
)`)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
stmt, _, err := db.Prepare(`SELECT USD FROM eurofxref WHERE Date = '2022-02-22'`)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer stmt.Close()
|
|
|
|
if stmt.Step() {
|
|
fmt.Printf("On Twosday, 1€ = $%g", stmt.ColumnFloat(0))
|
|
}
|
|
if err := stmt.Reset(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
err = db.Exec(`DROP TABLE eurofxref`)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
// Output:
|
|
// On Twosday, 1€ = $1.1342
|
|
}
|
|
|
|
func TestRegister(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, err := sqlite3.Open(":memory:")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
csv.Register(db)
|
|
|
|
const data = `
|
|
"Rob" "Pike" rob
|
|
"Ken" Thompson ken
|
|
Robert "Griesemer" "gri"`
|
|
err = db.Exec(`
|
|
CREATE VIRTUAL TABLE temp.users USING csv(
|
|
data = ` + sqlite3.Quote(data) + `,
|
|
schema = 'CREATE TABLE x(first_name, last_name, username)',
|
|
comma = '\t'
|
|
)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stmt, _, err := db.Prepare(`SELECT * FROM temp.users WHERE rowid = 1 ORDER BY username`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer stmt.Close()
|
|
|
|
if !stmt.Step() {
|
|
t.Fatal("no rows")
|
|
}
|
|
if got := stmt.ColumnText(0); got != "Rob" {
|
|
t.Errorf("got %q want Rob", got)
|
|
}
|
|
if stmt.Step() {
|
|
t.Fatal("more rows")
|
|
}
|
|
|
|
err = db.Exec(`ALTER TABLE temp.users RENAME TO csv`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = db.Exec(`PRAGMA integrity_check`)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
err = db.Exec(`PRAGMA quick_check`)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
err = db.Exec(`DROP TABLE temp.csv`)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestRegister_errors(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, err := sqlite3.Open(":memory:")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
csv.Register(db)
|
|
|
|
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv()`)
|
|
if err == nil {
|
|
t.Fatal("want error")
|
|
} else {
|
|
t.Log(err)
|
|
}
|
|
|
|
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', data='abc')`)
|
|
if err == nil {
|
|
t.Fatal("want error")
|
|
} else {
|
|
t.Log(err)
|
|
}
|
|
|
|
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', xpto='abc')`)
|
|
if err == nil {
|
|
t.Fatal("want error")
|
|
} else {
|
|
t.Log(err)
|
|
}
|
|
|
|
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', comma='"')`)
|
|
if err == nil {
|
|
t.Fatal("want error")
|
|
} else {
|
|
t.Log(err)
|
|
}
|
|
|
|
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', header=tru)`)
|
|
if err == nil {
|
|
t.Fatal("want error")
|
|
} else {
|
|
t.Log(err)
|
|
}
|
|
}
|