59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
type Store struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func Open(dbPath string) (*Store, error) {
|
|
db, err := sql.Open("sqlite", dbPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if _, err := db.Exec("PRAGMA foreign_keys = ON"); err != nil {
|
|
db.Close()
|
|
return nil, err
|
|
}
|
|
|
|
if err := migrate(db); err != nil {
|
|
db.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return &Store{db: db}, nil
|
|
}
|
|
|
|
func (s *Store) Close() error {
|
|
return s.db.Close()
|
|
}
|
|
|
|
func migrate(db *sql.DB) error {
|
|
schema := `
|
|
CREATE TABLE IF NOT EXISTS files (
|
|
id TEXT PRIMARY KEY,
|
|
original_name TEXT NOT NULL,
|
|
storage_name TEXT NOT NULL UNIQUE,
|
|
dir TEXT NOT NULL CHECK (dir IN ('inbox','outbox')),
|
|
size INTEGER NOT NULL,
|
|
created_at INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS shares (
|
|
id TEXT PRIMARY KEY,
|
|
file_id TEXT NOT NULL REFERENCES files(id) ON DELETE CASCADE,
|
|
token TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT,
|
|
expires_at INTEGER,
|
|
created_at INTEGER NOT NULL,
|
|
last_accessed_at INTEGER
|
|
);
|
|
`
|
|
_, err := db.Exec(schema)
|
|
return err
|
|
}
|