package db import ( "database/sql" "fmt" ) func scanNFSExport(row interface { Scan(dest ...any) error }) (NFSExport, error) { var export NFSExport var clients, createdAt, updatedAt string if err := row.Scan( &export.ID, &export.Path, &clients, &export.Options, &createdAt, &updatedAt, ); err != nil { return NFSExport{}, err } var err error export.Clients, err = decodeJSONStrings(clients) if err != nil { return NFSExport{}, err } export.CreatedAt = parseTime(createdAt) export.UpdatedAt = parseTime(updatedAt) return export, nil } func (d *DB) ListNFSExports() ([]NFSExport, error) { rows, err := d.conn.Query(` SELECT id, path, clients, options, created_at, updated_at FROM nfs_exports ORDER BY path ASC`) if err != nil { return nil, fmt.Errorf("list nfs exports: %w", err) } defer rows.Close() var exports []NFSExport for rows.Next() { export, err := scanNFSExport(rows) if err != nil { return nil, fmt.Errorf("scan nfs export: %w", err) } exports = append(exports, export) } return exports, rows.Err() } func (d *DB) GetNFSExport(id int64) (NFSExport, error) { row := d.conn.QueryRow(` SELECT id, path, clients, options, created_at, updated_at FROM nfs_exports WHERE id = ?`, id) export, err := scanNFSExport(row) if err == sql.ErrNoRows { return NFSExport{}, fmt.Errorf("nfs export not found") } if err != nil { return NFSExport{}, fmt.Errorf("get nfs export: %w", err) } return export, nil } func (d *DB) CreateNFSExport(export NFSExport) (NFSExport, error) { clients, err := encodeJSONStrings(export.Clients) if err != nil { return NFSExport{}, err } result, err := d.conn.Exec(` INSERT INTO nfs_exports (path, clients, options) VALUES (?, ?, ?)`, export.Path, clients, export.Options, ) if err != nil { return NFSExport{}, fmt.Errorf("create nfs export: %w", err) } id, err := result.LastInsertId() if err != nil { return NFSExport{}, fmt.Errorf("last insert id: %w", err) } return d.GetNFSExport(id) } func (d *DB) UpdateNFSExport(id int64, export NFSExport) (NFSExport, error) { clients, err := encodeJSONStrings(export.Clients) if err != nil { return NFSExport{}, err } result, err := d.conn.Exec(` UPDATE nfs_exports SET path = ?, clients = ?, options = ?, updated_at = datetime('now') WHERE id = ?`, export.Path, clients, export.Options, id, ) if err != nil { return NFSExport{}, fmt.Errorf("update nfs export: %w", err) } rows, err := result.RowsAffected() if err != nil { return NFSExport{}, err } if rows == 0 { return NFSExport{}, fmt.Errorf("nfs export not found") } return d.GetNFSExport(id) } func (d *DB) DeleteNFSExport(id int64) error { result, err := d.conn.Exec(`DELETE FROM nfs_exports WHERE id = ?`, id) if err != nil { return fmt.Errorf("delete nfs export: %w", err) } rows, err := result.RowsAffected() if err != nil { return err } if rows == 0 { return fmt.Errorf("nfs export not found") } return nil }