Files
sqlite3/ext/lines/lines_test.go

184 lines
3.3 KiB
Go
Raw Permalink Normal View History

2023-11-23 15:32:28 +00:00
package lines_test
import (
"database/sql"
"errors"
"fmt"
"log"
2023-12-19 00:13:51 +00:00
"net/http"
2023-11-23 15:32:28 +00:00
"os"
"strings"
"testing"
"github.com/ncruces/go-sqlite3"
"github.com/ncruces/go-sqlite3/driver"
_ "github.com/ncruces/go-sqlite3/embed"
"github.com/ncruces/go-sqlite3/ext/lines"
2024-06-02 10:33:20 +01:00
_ "github.com/ncruces/go-sqlite3/internal/testcfg"
2024-08-05 21:25:47 +01:00
"github.com/ncruces/go-sqlite3/vfs/memdb"
2023-11-23 15:32:28 +00:00
)
func Example() {
2024-08-05 21:25:47 +01:00
db, err := driver.Open("file:/test.db?vfs=memdb", lines.Register)
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer db.Close()
2023-12-19 00:13:51 +00:00
res, err := http.Get("https://storage.googleapis.com/quickdraw_dataset/full/simplified/calendar.ndjson")
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
2023-12-19 00:13:51 +00:00
defer res.Body.Close()
2023-11-23 15:32:28 +00:00
rows, err := db.Query(`
SELECT
line ->> '$.countrycode' as countrycode,
COUNT(*)
FROM lines_read(?)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 5`,
2023-12-19 00:13:51 +00:00
sqlite3.Pointer(res.Body))
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var countrycode sql.RawBytes
var count int
for rows.Next() {
err := rows.Scan(&countrycode, &count)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s: %d\n", countrycode, count)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
// Expected output:
2023-11-23 15:32:28 +00:00
// US: 141001
// GB: 22560
// CA: 11759
// RU: 9250
// DE: 8748
}
func Test_lines(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2025-09-26 16:25:15 +01:00
dsn := memdb.TestDB(t)
2023-12-02 12:03:31 +00:00
2025-09-26 16:25:15 +01:00
db, err := driver.Open(dsn, lines.Register)
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer db.Close()
2023-12-19 00:13:51 +00:00
const data = "line 1\nline 2\r\nline 3\n"
2023-11-23 15:32:28 +00:00
rows, err := db.Query(`SELECT rowid, line FROM lines(?)`, data)
if err != nil {
t.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int64
var line string
err := rows.Scan(&id, &line)
if err != nil {
t.Fatal(err)
}
2023-12-19 00:13:51 +00:00
if want := fmt.Sprintf("line %d", id); line != want {
t.Errorf("got %q, want %q", line, want)
}
2023-11-23 15:32:28 +00:00
}
}
func Test_lines_error(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2025-09-26 16:25:15 +01:00
dsn := memdb.TestDB(t)
2023-12-02 12:03:31 +00:00
2025-09-26 16:25:15 +01:00
db, err := driver.Open(dsn, lines.Register)
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec(`SELECT rowid, line FROM lines(?)`, nil)
if err == nil {
t.Fatal("want error")
} else {
t.Log(err)
}
_, err = db.Exec(`SELECT rowid, line FROM lines_read(?)`, "xpto")
if err == nil {
t.Fatal("want error")
} else {
t.Log(err)
}
}
func Test_lines_read(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2025-09-26 16:25:15 +01:00
dsn := memdb.TestDB(t)
2023-12-02 12:03:31 +00:00
2025-09-26 16:25:15 +01:00
db, err := driver.Open(dsn, lines.Register)
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer db.Close()
2023-12-19 00:13:51 +00:00
const data = "line 1\nline 2\r\nline 3\n"
2023-11-23 15:32:28 +00:00
rows, err := db.Query(`SELECT rowid, line FROM lines_read(?)`,
sqlite3.Pointer(strings.NewReader(data)))
if err != nil {
t.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int64
var line string
err := rows.Scan(&id, &line)
if err != nil {
t.Fatal(err)
}
2023-12-19 00:13:51 +00:00
if want := fmt.Sprintf("line %d", id); line != want {
t.Errorf("got %q, want %q", line, want)
}
2023-11-23 15:32:28 +00:00
}
}
func Test_lines_test(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2025-09-26 16:25:15 +01:00
dsn := memdb.TestDB(t)
2023-12-02 12:03:31 +00:00
2025-09-26 16:25:15 +01:00
db, err := driver.Open(dsn, lines.Register)
2023-11-23 15:32:28 +00:00
if err != nil {
log.Fatal(err)
}
defer db.Close()
2025-01-05 19:32:42 +00:00
rows, err := db.Query(`SELECT rowid, line FROM lines_read(?, '}')`, "lines_test.go")
2023-11-23 15:32:28 +00:00
if errors.Is(err, os.ErrNotExist) {
t.Skip(err)
}
if err != nil {
t.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int64
var line string
err := rows.Scan(&id, &line)
if err != nil {
t.Fatal(err)
}
}
}