diff --git a/cmd/main-server.go b/cmd/main-server.go index 4e3b7a8e..0e484c54 100644 --- a/cmd/main-server.go +++ b/cmd/main-server.go @@ -496,20 +496,17 @@ func main() { fmt.Printf("[error] %v\n", err) return } - numSessions, err := sstore.NumSessions(context.Background()) - if err != nil { - fmt.Printf("[error] getting num sessions: %v\n", err) - return - } err = sstore.EnsureLocalRemote(context.Background()) if err != nil { fmt.Printf("[error] ensuring local remote: %v\n", err) return } - fmt.Printf("[db] sessions count=%d\n", numSessions) - if numSessions == 0 { - sstore.CreateInitialSession(context.Background()) + defaultSession, err := sstore.EnsureDefaultSession(context.Background()) + if err != nil { + fmt.Printf("[error] ensuring default session: %v\n", err) + return } + fmt.Printf("session: %#v\n", defaultSession) return runnerProc, err := remote.LaunchMShell() diff --git a/pkg/sstore/dbops.go b/pkg/sstore/dbops.go index a09f19db..cae208c6 100644 --- a/pkg/sstore/dbops.go +++ b/pkg/sstore/dbops.go @@ -94,17 +94,23 @@ func GetSessionById(ctx context.Context, id string) (*SessionType, error) { } func GetSessionByName(ctx context.Context, name string) (*SessionType, error) { - db, err := GetDB() - query := `SELECT * FROM session WHERE name = ?` - var session SessionType - err = db.GetContext(ctx, &session, query, name) - if err == sql.ErrNoRows { - return nil, nil - } + var rtnSession *SessionType + err := WithTx(ctx, func(tx *TxWrap) error { + var session SessionType + query := `SELECT * FROM session WHERE name = ?` + found := tx.GetWrap(&session, query, name) + if !found { + return nil + } + rtnSession = &session + query = `SELECT sessionid, windowid, name, curremote, version FROM window WHERE sessionid = ?` + tx.SelectWrap(&session.Windows, query, session.SessionId) + return nil + }) if err != nil { return nil, err } - return &session, nil + return rtnSession, nil } // also creates window, and sessionremote diff --git a/pkg/sstore/sstore.go b/pkg/sstore/sstore.go index 59313057..b6f31dbf 100644 --- a/pkg/sstore/sstore.go +++ b/pkg/sstore/sstore.go @@ -51,20 +51,19 @@ func GetDB() (*sqlx.DB, error) { type SessionType struct { SessionId string `json:"sessionid"` - Remote string `json:"remote"` Name string `json:"name"` Windows []*WindowType `json:"windows"` Cmds []*CmdType `json:"cmds"` } type WindowType struct { - SessionId string `json:"sessionid"` - WindowId string `json:"windowid"` - Name string `json:"name"` - CurRemote string `json:"curremote"` - Remotes []*SessionRemote `json:"remotes"` - Lines []*LineType `json:"lines"` - Version int `json:"version"` + SessionId string `json:"sessionid"` + WindowId string `json:"windowid"` + Name string `json:"name"` + CurRemote string `json:"curremote"` + Remotes []*RemoteType `json:"remotes"` + Lines []*LineType `json:"lines"` + Version int `json:"version"` } type SessionRemote struct { @@ -178,19 +177,19 @@ func EnsureLocalRemote(ctx context.Context) error { return nil } -func EnsureDefaultSession(ctx context.Context) error { +func EnsureDefaultSession(ctx context.Context) (*SessionType, error) { session, err := GetSessionByName(ctx, DefaultSessionName) if err != nil { - return err + return nil, err } if session != nil { - return nil + return session, nil } err = InsertSessionWithName(ctx, DefaultSessionName) if err != nil { - return err + return nil, err } - return nil + return GetSessionByName(ctx, DefaultSessionName) } func CreateInitialSession(ctx context.Context) error { diff --git a/pkg/sstore/txwrap.go b/pkg/sstore/txwrap.go index 68f05eda..b58b8442 100644 --- a/pkg/sstore/txwrap.go +++ b/pkg/sstore/txwrap.go @@ -65,24 +65,28 @@ func (tx *TxWrap) ExecWrap(query string, args ...interface{}) sql.Result { return result } -func (tx *TxWrap) GetWrap(dest interface{}, query string, args ...interface{}) error { +func (tx *TxWrap) GetWrap(dest interface{}, query string, args ...interface{}) bool { if tx.Err != nil { - return nil + return false } err := tx.Txx.Get(dest, query, args...) - if err != nil && err != sql.ErrNoRows { - tx.Err = err + if err != nil && err == sql.ErrNoRows { + return false } - return err + if err != nil { + tx.Err = err + return false + } + return true } -func (tx *TxWrap) SelectWrap(dest interface{}, query string, args ...interface{}) error { +func (tx *TxWrap) SelectWrap(dest interface{}, query string, args ...interface{}) { if tx.Err != nil { - return nil + return } err := tx.Txx.Select(dest, query, args...) if err != nil { tx.Err = err } - return err + return } diff --git a/scripthaus.md b/scripthaus.md new file mode 100644 index 00000000..08a6c52d --- /dev/null +++ b/scripthaus.md @@ -0,0 +1,12 @@ +# SH2 Server Commands + +```bash +# @scripthaus command dump-schema +sqlite3 /Users/mike/scripthaus/sh2.db .schema > db/schema.sql +``` + +```bash +# @scripthaus command opendb +sqlite3 /Users/mike/scripthaus/sh2.db +``` +