@@ -21,7 +21,7 @@ import (
2121 _ "modernc.org/sqlite"
2222)
2323
24- const CURRENT_DB_VERSION = 5
24+ const CURRENT_DB_VERSION = 6
2525
2626// Metadata is the metadata persistence layer
2727type Metadata struct {
@@ -213,6 +213,17 @@ func (m *Metadata) VersionUpgrade(config *types.ServerConfig) error {
213213 }
214214 }
215215
216+ if version < 6 {
217+ m .Info ().Msg ("Upgrading to version 6" )
218+ if _ , err := tx .ExecContext (ctx , `create table config(version_id text, user_id text, update_time ` + system .MapDataType (m .dbType , "datetime" )+ ", config json)" ); err != nil {
219+ return err
220+ }
221+
222+ if _ , err := tx .ExecContext (ctx , `update version set version=6, last_upgraded=` + system .FuncNow (m .dbType )); err != nil {
223+ return err
224+ }
225+ }
226+
216227 if err := tx .Commit (); err != nil {
217228 return err
218229 }
@@ -627,6 +638,88 @@ func (m *Metadata) UpdateSyncStatus(ctx context.Context, tx types.Transaction, i
627638 return nil
628639}
629640
641+ var ErrConfigAlreadyExists = errors .New ("config already exists" )
642+ var ErrConfigNotFound = errors .New ("config not found" )
643+
644+ func (m * Metadata ) InitConfig (ctx context.Context , user string , dynamicConfig * types.DynamicConfig ) error {
645+ configJson , err := json .Marshal (dynamicConfig )
646+ if err != nil {
647+ return fmt .Errorf ("error marshalling dynamic config: %w" , err )
648+ }
649+
650+ tx , err := m .db .BeginTx (ctx , nil )
651+ if err != nil {
652+ return fmt .Errorf ("error beginning transaction: %w" , err )
653+ }
654+
655+ defer tx .Rollback ()
656+ countResult := tx .QueryRowContext (ctx , system .RebindQuery (m .dbType , `select count(*) from config` ))
657+ var rowCount int
658+ err = countResult .Scan (& rowCount )
659+ if err != nil {
660+ return fmt .Errorf ("error scanning config: %w" , err )
661+ }
662+ if rowCount > 0 {
663+ return ErrConfigAlreadyExists
664+ }
665+
666+ _ , err = tx .ExecContext (ctx , system .RebindQuery (m .dbType ,
667+ `insert into config values (?, ?, ` + system .FuncNow (m .dbType )+ ", ?)" ),
668+ dynamicConfig .VersionId , user , string (configJson ))
669+ if err != nil {
670+ return fmt .Errorf ("error inserting config: %w" , err )
671+ }
672+ err = tx .Commit ()
673+ if err != nil {
674+ return fmt .Errorf ("error committing transaction: %w" , err )
675+ }
676+ return nil
677+ }
678+
679+ func (m * Metadata ) UpdateConfig (ctx context.Context , user string , oldVersionId string , dynamicConfig * types.DynamicConfig ) error {
680+ configJson , err := json .Marshal (dynamicConfig )
681+ if err != nil {
682+ return fmt .Errorf ("error marshalling dynamic config: %w" , err )
683+ }
684+
685+ result , err := m .db .ExecContext (ctx , system .RebindQuery (m .dbType ,
686+ `update config set version_id = ?, config = ?, update_time = ` + system .FuncNow (m .dbType )+ ", user_id = ? where version_id = ?" ),
687+ dynamicConfig .VersionId , string (configJson ), user , oldVersionId )
688+ if err != nil {
689+ return fmt .Errorf ("error updating config: %w" , err )
690+ }
691+ rowsAffected , err := result .RowsAffected ()
692+ if err != nil {
693+ return fmt .Errorf ("error getting rows affected: %w" , err )
694+ }
695+ if rowsAffected == 0 {
696+ return fmt .Errorf ("no config entry found with version id for update: %s" , oldVersionId )
697+ }
698+ return nil
699+ }
700+
701+ func (m * Metadata ) GetConfig () (* types.DynamicConfig , error ) {
702+ var configStr sql.NullString
703+ row := m .db .QueryRow (system .RebindQuery (m .dbType , `select config from config` ))
704+ err := row .Scan (& configStr )
705+ if err != nil {
706+ if err == sql .ErrNoRows {
707+ return nil , ErrConfigNotFound
708+ }
709+ return nil , fmt .Errorf ("error querying config: %w" , err )
710+ }
711+
712+ var config types.DynamicConfig
713+ if configStr .Valid && configStr .String != "" {
714+ err = json .Unmarshal ([]byte (configStr .String ), & config )
715+ if err != nil {
716+ return nil , fmt .Errorf ("error unmarshalling config: %w" , err )
717+ }
718+ }
719+
720+ return & config , nil
721+ }
722+
630723// BeginTransaction starts a new Transaction
631724func (m * Metadata ) BeginTransaction (ctx context.Context ) (types.Transaction , error ) {
632725 tx , err := m .db .BeginTx (ctx , nil )
0 commit comments