55
66namespace BingusApi . EmbeddingServices
77{
8- public class RocksDbStore : IEmbeddingStore
8+ public class RocksDbStore : IEmbeddingStore , IDisposable
99 {
10+ public const string ModelUidKey = "<model_uid>" ;
11+
1012 private readonly RocksDb rocksDb ;
1113
1214 public RocksDbStore ( RocksDb rocksDb )
@@ -16,14 +18,21 @@ public RocksDbStore(RocksDb rocksDb)
1618
1719 private static byte [ ] SerializeString ( string value ) => Encoding . UTF8 . GetBytes ( value ) ;
1820
21+ private static string DeserializeString ( byte [ ] value ) => Encoding . UTF8 . GetString ( value ) ;
22+
1923 public void Add ( string key , Vector < float > embedding )
2024 {
21- rocksDb . Put ( SerializeString ( key ) , RocksDbSerializer . SerializeVector ( embedding ) ) ;
25+ Add ( key , RocksDbSerializer . SerializeVector ( embedding ) ) ;
2226 }
2327
2428 public void Add ( string key , float [ ] embedding )
2529 {
26- rocksDb . Put ( SerializeString ( key ) , RocksDbSerializer . SerializeArray ( embedding ) ) ;
30+ Add ( key , RocksDbSerializer . SerializeArray ( embedding ) ) ;
31+ }
32+
33+ public void Add ( string key , byte [ ] data )
34+ {
35+ rocksDb . Put ( SerializeString ( key ) , data ) ;
2736 }
2837
2938 public byte [ ] ? GetBytes ( string key )
@@ -47,5 +56,61 @@ public bool Has(string key)
4756 {
4857 return rocksDb . HasKey ( SerializeString ( key ) ) ;
4958 }
59+
60+ public void Dispose ( )
61+ {
62+ rocksDb ? . Dispose ( ) ;
63+ GC . SuppressFinalize ( this ) ;
64+ }
65+
66+ public static RocksDbStore Create (
67+ string dbPath ,
68+ string modelUid ,
69+ ILogger < RocksDbStore > ? logger
70+ )
71+ {
72+ var preexisting = Directory . Exists ( dbPath ) && Directory . GetFiles ( dbPath ) . Length > 0 ;
73+
74+ var options = new DbOptions ( ) . SetCreateIfMissing ( true ) ;
75+ var db = RocksDb . Open ( options , dbPath ) ;
76+ var store = new RocksDbStore ( db ) ;
77+
78+ var lastModelUidB = store . GetBytes ( ModelUidKey ) ;
79+ if ( lastModelUidB != null )
80+ {
81+ var lastModelUid = DeserializeString ( lastModelUidB ) ;
82+ if ( lastModelUid != modelUid )
83+ {
84+ logger ? . LogWarning (
85+ "Model UID has changed from \" {LastModelUid}\" to \" {ModelUid}\" . Deleting the store." ,
86+ lastModelUid ,
87+ modelUid
88+ ) ;
89+
90+ // Delete the store
91+ store . Dispose ( ) ;
92+ foreach ( var file in Directory . GetFiles ( dbPath ) )
93+ {
94+ File . Delete ( file ) ;
95+ }
96+
97+ // Recreate the store
98+ return Create ( dbPath , modelUid , logger ) ;
99+ }
100+ }
101+ else
102+ {
103+ if ( preexisting )
104+ {
105+ logger ? . LogWarning (
106+ "No model UID found in existing store. Writing current model UID \" {ModelUid}\" ." ,
107+ modelUid
108+ ) ;
109+ }
110+ store . Add ( ModelUidKey , SerializeString ( modelUid ) ) ;
111+ }
112+
113+ return store ;
114+ }
50115 }
51116}
0 commit comments