driver

package
v0.10.0 Latest Latest
Warning

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

Go to latest
Published: May 10, 2026 License: AGPL-3.0 Imports: 10 Imported by: 0

Documentation

Overview

Example (NamedDriverAccess)

Example_namedDriverAccess demonstrates that all three Open helpers use the same registered driver name and produce a working *sql.DB.

package main

import (
	"database/sql"
	"fmt"

	tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)

func main() {
	db, err := sql.Open(tsqldriver.DriverName, "mem://?tenant=named_test")
	if err != nil {
		fmt.Println("error:", err)
		return
	}
	defer db.Close()

	if err := db.Ping(); err != nil {
		fmt.Println("ping error:", err)
		return
	}
	fmt.Println("driver name:", tsqldriver.DriverName)
	fmt.Println("ping: ok")

}
Output:
driver name: tinysql
ping: ok

Index

Examples

Constants

View Source
const DriverName = "tinysql"

DriverName is the registered database/sql driver name for tinySQL.

Variables

View Source
var (
	OpenInMemory = id.OpenInMemory
	SetDefaultDB = id.SetDefaultDB
)

Re-export selected symbols from the internal driver package so external consumers can use a stable public API while the implementation remains hidden under `internal/driver`.

Functions

func Open

func Open(dsn string) (*sql.DB, error)

Open is a convenience wrapper around `sql.Open(DriverName, dsn)`.

Example

ExampleOpen demonstrates opening a tinySQL in-memory database via database/sql.

package main

import (
	"fmt"

	tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)

func main() {
	db, err := tsqldriver.Open("mem://?tenant=default")
	if err != nil {
		fmt.Println("open error:", err)
		return
	}
	defer db.Close()

	if _, err := db.Exec(`CREATE TABLE products (id INT, name TEXT, price FLOAT)`); err != nil {
		fmt.Println("create error:", err)
		return
	}
	if _, err := db.Exec(`INSERT INTO products VALUES (?, ?, ?)`, 1, "Widget", 9.99); err != nil {
		fmt.Println("insert error:", err)
		return
	}

	var name string
	var price float64
	row := db.QueryRow(`SELECT name, price FROM products WHERE id = ?`, 1)
	if err := row.Scan(&name, &price); err != nil {
		fmt.Println("scan error:", err)
		return
	}
	fmt.Printf("%s: $%.2f\n", name, price)

}
Output:
Widget: $9.99
Example (Transaction)

ExampleOpen_transaction demonstrates wrapping multiple operations in a database/sql transaction.

package main

import (
	"context"
	"fmt"

	tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)

func main() {
	db, err := tsqldriver.Open("mem://?tenant=txdemo")
	if err != nil {
		fmt.Println("open error:", err)
		return
	}
	defer db.Close()

	if _, err := db.Exec(`CREATE TABLE accounts (id INT, balance FLOAT)`); err != nil {
		fmt.Println("create error:", err)
		return
	}
	if _, err := db.Exec(`INSERT INTO accounts VALUES (1, 1000.0)`); err != nil {
		fmt.Println("insert error:", err)
		return
	}
	if _, err := db.Exec(`INSERT INTO accounts VALUES (2, 500.0)`); err != nil {
		fmt.Println("insert error:", err)
		return
	}

	ctx := context.Background()
	tx, err := db.BeginTx(ctx, nil)
	if err != nil {
		fmt.Println("begin error:", err)
		return
	}

	if _, err := tx.ExecContext(ctx, `UPDATE accounts SET balance = balance - ? WHERE id = ?`, 200.0, 1); err != nil {
		_ = tx.Rollback()
		fmt.Println("update error:", err)
		return
	}
	if _, err := tx.ExecContext(ctx, `UPDATE accounts SET balance = balance + ? WHERE id = ?`, 200.0, 2); err != nil {
		_ = tx.Rollback()
		fmt.Println("update error:", err)
		return
	}
	if err := tx.Commit(); err != nil {
		fmt.Println("commit error:", err)
		return
	}

	rows, err := db.Query(`SELECT id, balance FROM accounts ORDER BY id`)
	if err != nil {
		fmt.Println("query error:", err)
		return
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var bal float64
		if err := rows.Scan(&id, &bal); err != nil {
			fmt.Println("scan error:", err)
			return
		}
		fmt.Printf("account %d: %.0f\n", id, bal)
	}

}
Output:
account 1: 800
account 2: 700

func OpenFile

func OpenFile(path string) (*sql.DB, error)

OpenFile is a convenience wrapper that opens a file-backed tinySQL database by constructing a `file:` DSN for `sql.Open`.

func OpenWithConfig added in v0.10.0

func OpenWithConfig(ctx context.Context, cfg OpenConfig) (*sql.DB, error)

OpenWithConfig opens a tinySQL database using explicit settings and validates connectivity with PingContext.

Example

ExampleOpenWithConfig demonstrates config-driven setup with explicit pool and timeout settings, then executes a query via database/sql.

package main

import (
	"context"
	"fmt"
	"time"

	tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)

func main() {
	cfg := tsqldriver.DefaultOpenConfig()
	cfg.Tenant = "example"
	cfg.PoolReaders = 2
	cfg.BusyTimeout = 100 * time.Millisecond
	cfg.MaxOpenConns = 4
	cfg.MaxIdleConns = 2
	cfg.PingTimeout = 3 * time.Second

	ctx := context.Background()
	db, err := tsqldriver.OpenWithConfig(ctx, cfg)
	if err != nil {
		fmt.Println("open error:", err)
		return
	}
	defer db.Close()

	if _, err := db.ExecContext(ctx, `CREATE TABLE notes (id INT, body TEXT)`); err != nil {
		fmt.Println("create error:", err)
		return
	}
	if _, err := db.ExecContext(ctx, `INSERT INTO notes VALUES (?, ?)`, 1, "hello tinySQL"); err != nil {
		fmt.Println("insert error:", err)
		return
	}

	rows, err := db.QueryContext(ctx, `SELECT id, body FROM notes ORDER BY id`)
	if err != nil {
		fmt.Println("query error:", err)
		return
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var body string
		if err := rows.Scan(&id, &body); err != nil {
			fmt.Println("scan error:", err)
			return
		}
		fmt.Printf("%d: %s\n", id, body)
	}
	if err := rows.Err(); err != nil {
		fmt.Println("rows error:", err)
	}

}
Output:
1: hello tinySQL

func OpenWithDB

func OpenWithDB(db *storage.DB) (*sql.DB, error)

OpenWithDB registers the provided storage.DB as the driver's default DB and returns a *sql.DB connected to it. This is useful for embedding or tests.

Types

type OpenConfig added in v0.10.0

type OpenConfig struct {
	// Mode controls DSN scheme. Allowed values: "mem" (default) or "file".
	Mode string
	// FilePath is required when Mode is "file".
	FilePath string
	// Tenant maps to DSN option `tenant`. Empty falls back to "default".
	Tenant string
	// Autosave maps to DSN option `autosave=1` for file mode.
	Autosave bool
	// PoolReaders maps to DSN option `pool_readers`.
	PoolReaders int
	// PoolWriters maps to DSN option `pool_writers`.
	PoolWriters int
	// BusyTimeout maps to DSN option `busy_timeout` (e.g. 250ms, 2s).
	BusyTimeout time.Duration

	// database/sql pool settings.
	MaxOpenConns    int
	MaxIdleConns    int
	ConnMaxLifetime time.Duration
	ConnMaxIdleTime time.Duration

	// PingTimeout is used for startup health-check in OpenWithConfig.
	PingTimeout time.Duration
}

OpenConfig describes connection, DSN and database/sql settings for OpenWithConfig.

Best-practice split:

  • DSN fields configure tinySQL driver/server behavior (tenant, autosave, pools, busy_timeout).
  • database/sql fields configure connection pool behavior (max open/idle/lifetimes).
  • PingTimeout validates startup connectivity with PingContext.

func DefaultOpenConfig added in v0.10.0

func DefaultOpenConfig() OpenConfig

DefaultOpenConfig returns sensible defaults for tinySQL.

func (OpenConfig) DSN added in v0.10.0

func (c OpenConfig) DSN() (string, error)

DSN builds a tinySQL DSN from OpenConfig.

Jump to

Keyboard shortcuts

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