package storage import ( "encoding/json" "gitea.deepblack.cloud/chorus/bubble/models" "github.com/tecbot/gorocksdb" ) // RocksDBStore is an implementation of the Storage interface using RocksDB. type RocksDBStore struct { DB *gorocksdb.DB } // NewRocksDBStore creates and initializes a new RocksDB database. func NewRocksDBStore(dbPath string) (*RocksDBStore, error) { opts := gorocksdb.NewDefaultOptions() opts.SetCreateIfMissing(true) db, err := gorocksdb.OpenDb(opts, dbPath) if err != nil { return nil, err } return &RocksDBStore{DB: db}, nil } // GetDecisionMetadata retrieves a decision's metadata from RocksDB. func (r *RocksDBStore) GetDecisionMetadata(drID string) (*models.DecisionRecordSummary, error) { ro := gorocksdb.NewDefaultReadOptions() // Keys are stored as "meta:" key := []byte("meta:" + drID) slice, err := r.DB.Get(ro, key) if err != nil { return nil, err } defer slice.Free() if !slice.Exists() { return nil, nil // Not found } var summary models.DecisionRecordSummary if err := json.Unmarshal(slice.Data(), &summary); err != nil { return nil, err } return &summary, nil } // GetAncestors retrieves a decision's ancestor IDs from RocksDB. func (r *RocksDBStore) GetAncestors(drID string) ([]string, error) { ro := gorocksdb.NewDefaultReadOptions() // Keys are stored as "rev:" key := []byte("rev:" + drID) slice, err := r.DB.Get(ro, key) if err != nil { return nil, err } defer slice.Free() if !slice.Exists() { return nil, nil // Not found, no ancestors } var ancestorIDs []string if err := json.Unmarshal(slice.Data(), &ancestorIDs); err != nil { return nil, err } return ancestorIDs, nil } // Close closes the RocksDB database connection. func (r *RocksDBStore) Close() { if r.DB != nil { r.DB.Close() } }