finishing sqlite changes

- finished default/active server logic
- dev done
- needs testing
This commit is contained in:
2025-06-18 18:38:01 -04:00
parent fe37cac2da
commit c15c16be8d
19 changed files with 254 additions and 69 deletions

View File

@@ -1,8 +1,11 @@
package database
import (
"context"
"database/sql"
"fmt"
"os"
"time"
"code.jakeyoungdev.com/jake/mctl/model"
"github.com/jmoiron/sqlx"
@@ -11,9 +14,14 @@ import (
)
/*
all sqlx methods for CRUD functionalities of commands and servers
all sqlx methods for CRUD functionalities of commands and servers. All database methods should use the internal
methods query, exec, queryrow -- these wrapper functions handle timeouts and other configuration
*/
const (
DB_TIMEOUT = time.Second * 1
)
type database struct {
*sqlx.DB
}
@@ -22,6 +30,11 @@ type Database interface {
Init() error
Destroy() error
Close() error
//internals
timeout() (context.Context, context.CancelFunc)
query(query string, args ...any) (*sqlx.Rows, error)
queryRow(query string, args ...any) *sqlx.Row
exec(query string, args ...any) (sql.Result, error)
//command methods
GetCmd(name string) (string, error)
GetAllCmds() ([]model.Command, error)
@@ -30,7 +43,9 @@ type Database interface {
DeleteCmd(name string) error
//server methods
GetServer(name string) (model.Server, error)
GetActiveServer() (model.Server, error)
GetAllServers() ([]model.Server, error)
SetActiveServer(name string) error
SaveServer(srv model.Server) error
UpdateServer(name, password string) error
DeleteServer(name string) error
@@ -65,12 +80,12 @@ func (d *database) Init() error {
name TEXT PRIMARY KEY,
server TEXT,
password TEXT,
port NUMBER,
--active TEXT? bit? or something
port INTEGER,
active INTEGER NOT NULL DEFAULT 0
);
`
_, err := d.Exec(query)
_, err := d.exec(query)
return err
}
@@ -81,7 +96,7 @@ func (d *database) Destroy() error {
DROP TABLE servers;
`
_, err := d.Exec(query)
_, err := d.exec(query)
return err
}
@@ -89,6 +104,31 @@ func (d *database) Close() error {
return d.DB.Close()
}
func (d *database) timeout() (context.Context, context.CancelFunc) {
return context.WithTimeout(context.Background(), DB_TIMEOUT)
}
func (d *database) query(query string, args ...any) (*sqlx.Rows, error) {
ctx, cl := d.timeout()
defer cl()
return d.QueryxContext(ctx, query, args...)
}
func (d *database) queryRow(query string, args ...any) *sqlx.Row {
ctx, cl := d.timeout()
defer cl()
return d.QueryRowxContext(ctx, query, args...)
}
func (d *database) exec(query string, args ...any) (sql.Result, error) {
ctx, cl := d.timeout()
defer cl()
return d.ExecContext(ctx, query, args...)
}
// gets command using name
func (d *database) GetCmd(name string) (string, error) {
query := `
@@ -101,7 +141,7 @@ func (d *database) GetCmd(name string) (string, error) {
`
var cmd string
err := d.QueryRowx(query, name).Scan(&cmd)
err := d.queryRow(query, name).Scan(&cmd)
if err != nil {
return "", err
}
@@ -119,7 +159,7 @@ func (d *database) GetAllCmds() ([]model.Command, error) {
commands
`
rows, err := d.Queryx(query)
rows, err := d.query(query)
if err != nil {
return nil, err
}
@@ -146,7 +186,7 @@ func (d *database) SaveCmd(name, cmd string) error {
VALUES(?, ?)
`
_, err := d.Exec(query, name, cmd)
_, err := d.exec(query, name, cmd)
return err
}
@@ -161,7 +201,7 @@ func (d *database) UpdateCmd(name, cmd string) error {
name = ?
`
_, err := d.Exec(query, cmd, name)
_, err := d.exec(query, cmd, name)
return err
}
@@ -171,7 +211,7 @@ func (d *database) DeleteCmd(name string) error {
WHERE name = ?
`
_, err := d.Exec(query, name)
_, err := d.exec(query, name)
return err
}
@@ -189,13 +229,31 @@ func (d *database) GetServer(name string) (model.Server, error) {
`
var s model.Server
err := d.QueryRowx(query, name).StructScan(&s)
err := d.queryRow(query, name).StructScan(&s)
if err != nil {
return model.Server{}, err
}
return s, nil
}
func (d *database) GetActiveServer() (model.Server, error) {
query := `
SELECT
name,
server,
password,
port
FROM
servers
WHERE
active = 1
`
var s model.Server
err := d.queryRow(query).StructScan(&s)
return s, err
}
func (d *database) GetAllServers() ([]model.Server, error) {
query := `
SELECT
@@ -207,7 +265,7 @@ func (d *database) GetAllServers() ([]model.Server, error) {
servers
`
rows, err := d.Queryx(query)
rows, err := d.query(query)
if err != nil {
return nil, err
}
@@ -233,7 +291,26 @@ func (d *database) SaveServer(srv model.Server) error {
VALUES(?, ?, ?, ?)
`
_, err := d.Exec(query, srv.Name, srv.Server, srv.Password, srv.Port)
_, err := d.exec(query, srv.Name, srv.Server, srv.Password, srv.Port)
return err
}
func (d *database) SetActiveServer(name string) error {
query := `
UPDATE
servers
SET
active = 0;
UPDATE
servers
SET
active = 1
WHERE
name = ?
`
_, err := d.exec(query, name)
return err
}
@@ -247,7 +324,7 @@ func (d *database) UpdateServer(name, password string) error {
name = ?
`
_, err := d.Exec(query, password, name)
_, err := d.exec(query, password, name)
return err
}
@@ -258,6 +335,6 @@ func (d *database) DeleteServer(name string) error {
name = ?
`
_, err := d.Exec(query, name)
_, err := d.exec(query, name)
return err
}