readervfs

package
v0.8.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 25, 2023 License: MIT Imports: 5 Imported by: 0

README

Go "reader" SQLite VFS

This package implements a "reader" SQLite VFS that allows accessing any io.ReaderAt as an immutable SQLite database.

Documentation

Overview

Package readervfs implements an SQLite VFS for immutable databases.

The "reader" vfs.VFS permits accessing any io.ReaderAt as an immutable SQLite database.

Importing package readervfs registers the VFS.

import _ "github.com/ianatha/go-sqlite3/vfs/readervfs"
Example (Embed)
package main

import (
	"database/sql"
	"fmt"
	"log"
	"strings"

	_ "embed"
	"github.com/ianatha/go-sqlite3/vfs/readervfs"

	_ "github.com/ianatha/go-sqlite3/driver"
	_ "github.com/ianatha/go-sqlite3/embed"
)

//go:embed testdata/test.db
var testDB string

func main() {
	readervfs.Create("test.db", readervfs.NewSizeReaderAt(strings.NewReader(testDB)))
	defer readervfs.Delete("test.db")

	db, err := sql.Open("sqlite3", "file:test.db?vfs=reader")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	rows, err := db.Query(`SELECT id, name FROM users`)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var id, name string
		err = rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%s %s\n", id, name)
	}
}
Output:

0 go
1 zig
2 whatever
Example (Http)
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "embed"
	"github.com/ianatha/go-sqlite3/vfs/readervfs"
	"github.com/psanford/httpreadat"

	_ "github.com/ianatha/go-sqlite3/driver"
	_ "github.com/ianatha/go-sqlite3/embed"
)

func main() {
	readervfs.Create("demo.db", httpreadat.New("https://www.sanford.io/demo.db"))
	defer readervfs.Delete("demo.db")

	db, err := sql.Open("sqlite3", "file:demo.db?vfs=reader")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	magname := map[int]string{
		3: "thousand",
		6: "million",
		9: "billion",
	}
	rows, err := db.Query(`
		SELECT period, data_value, magntude, units FROM csv
			WHERE period > '2010'
			LIMIT 10`)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var period, units string
		var value int64
		var mag int
		err = rows.Scan(&period, &value, &mag, &units)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%s: %d %s %s\n", period, value, magname[mag], units)
	}
}
Output:

2010.03: 17463 million Dollars
2010.06: 17260 million Dollars
2010.09: 15419 million Dollars
2010.12: 17088 million Dollars
2011.03: 18516 million Dollars
2011.06: 18835 million Dollars
2011.09: 16390 million Dollars
2011.12: 18748 million Dollars
2012.03: 18477 million Dollars
2012.06: 18270 million Dollars

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Create

func Create(name string, reader SizeReaderAt)

Create creates an immutable database from reader. The caller should ensure that data from reader does not mutate, otherwise SQLite might return incorrect query results and/or sqlite3.CORRUPT errors.

func Delete

func Delete(name string)

Delete deletes a shared memory database.

Types

type SizeReaderAt

type SizeReaderAt interface {
	Size() (int64, error)
	io.ReaderAt
}

A SizeReaderAt is a ReaderAt with a Size method. Use NewSizeReaderAt to adapt different Size interfaces.

func NewSizeReaderAt

func NewSizeReaderAt(r io.ReaderAt) SizeReaderAt

NewSizeReaderAt returns a SizeReaderAt given an io.ReaderAt that implements one of:

  • Size() (int64, error)
  • Size() int64
  • Len() int
  • Stat() (fs.FileInfo, error)
  • Seek(offset int64, whence int) (int64, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL