@@ -54,7 +54,7 @@ type Option interface {
54
54
type option func (* config ) error
55
55
56
56
type Replicated struct {
57
- FrameNo int
57
+ FrameNo int
58
58
FramesSynced int
59
59
}
60
60
@@ -135,7 +135,37 @@ func NewEmbeddedReplicaConnector(dbPath string, primaryUrl string, opts ...Optio
135
135
if config .syncInterval != nil {
136
136
syncInterval = * config .syncInterval
137
137
}
138
- return openEmbeddedReplicaConnector (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey , syncInterval )
138
+ return openSyncConnector (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey , syncInterval , false )
139
+ }
140
+
141
+ func NewSyncedDatabaseConnector (dbPath string , primaryUrl string , opts ... Option ) (* Connector , error ) {
142
+ var config config
143
+ errs := make ([]error , 0 , len (opts ))
144
+ for _ , opt := range opts {
145
+ if err := opt .apply (& config ); err != nil {
146
+ errs = append (errs , err )
147
+ }
148
+ }
149
+ if len (errs ) > 0 {
150
+ return nil , errors .Join (errs ... )
151
+ }
152
+ authToken := ""
153
+ if config .authToken != nil {
154
+ authToken = * config .authToken
155
+ }
156
+ readYourWrites := true
157
+ if config .readYourWrites != nil {
158
+ readYourWrites = * config .readYourWrites
159
+ }
160
+ encryptionKey := ""
161
+ if config .encryptionKey != nil {
162
+ encryptionKey = * config .encryptionKey
163
+ }
164
+ syncInterval := time .Duration (0 )
165
+ if config .syncInterval != nil {
166
+ syncInterval = * config .syncInterval
167
+ }
168
+ return openSyncConnector (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey , syncInterval , true )
139
169
}
140
170
141
171
type driver struct {}
@@ -173,7 +203,7 @@ func (d driver) OpenConnector(dbAddress string) (sqldriver.Connector, error) {
173
203
174
204
func libsqlSync (nativeDbPtr C.libsql_database_t ) (Replicated , error ) {
175
205
var errMsg * C.char
176
- var rep C.replicated ;
206
+ var rep C.replicated
177
207
statusCode := C .libsql_sync2 (nativeDbPtr , & rep , & errMsg )
178
208
if statusCode != 0 {
179
209
return Replicated {0 , 0 }, libsqlError ("failed to sync database " , statusCode , errMsg )
@@ -198,10 +228,10 @@ func openRemoteConnector(primaryUrl, authToken string) (*Connector, error) {
198
228
return & Connector {nativeDbPtr : nativeDbPtr }, nil
199
229
}
200
230
201
- func openEmbeddedReplicaConnector (dbPath , primaryUrl , authToken string , readYourWrites bool , encryptionKey string , syncInterval time.Duration ) (* Connector , error ) {
231
+ func openSyncConnector (dbPath , primaryUrl , authToken string , readYourWrites bool , encryptionKey string , syncInterval time.Duration , offline bool ) (* Connector , error ) {
202
232
var closeCh chan struct {}
203
233
var closeAckCh chan struct {}
204
- nativeDbPtr , err := libsqlOpenWithSync (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey )
234
+ nativeDbPtr , err := libsqlOpenWithSync (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey , offline )
205
235
if err != nil {
206
236
return nil , err
207
237
}
@@ -309,7 +339,7 @@ func libsqlOpenRemote(url, authToken string) (C.libsql_database_t, error) {
309
339
return db , nil
310
340
}
311
341
312
- func libsqlOpenWithSync (dbPath , primaryUrl , authToken string , readYourWrites bool , encryptionKey string ) (C.libsql_database_t , error ) {
342
+ func libsqlOpenWithSync (dbPath , primaryUrl , authToken string , readYourWrites bool , encryptionKey string , offline bool ) (C.libsql_database_t , error ) {
313
343
dbPathNativeString := C .CString (dbPath )
314
344
defer C .free (unsafe .Pointer (dbPathNativeString ))
315
345
primaryUrlNativeString := C .CString (primaryUrl )
@@ -321,15 +351,30 @@ func libsqlOpenWithSync(dbPath, primaryUrl, authToken string, readYourWrites boo
321
351
if readYourWrites {
322
352
readYourWritesNative = 1
323
353
}
354
+
355
+ var offlineNative C.char = 0
356
+ if offline {
357
+ offlineNative = 1
358
+ }
359
+
324
360
var encrytionKeyNativeString * C.char
325
361
if encryptionKey != "" {
326
362
encrytionKeyNativeString = C .CString (encryptionKey )
327
363
defer C .free (unsafe .Pointer (encrytionKeyNativeString ))
328
364
}
329
365
366
+ config := C.libsql_config {
367
+ db_path : dbPathNativeString ,
368
+ auth_token : authTokenNativeString ,
369
+ primary_url : primaryUrlNativeString ,
370
+ read_your_writes : readYourWritesNative ,
371
+ encryption_key : encrytionKeyNativeString ,
372
+ offline : offlineNative ,
373
+ }
374
+
330
375
var db C.libsql_database_t
331
376
var errMsg * C.char
332
- statusCode := C .libsql_open_sync ( dbPathNativeString , primaryUrlNativeString , authTokenNativeString , readYourWritesNative , encrytionKeyNativeString , & db , & errMsg )
377
+ statusCode := C .libsql_open_sync_with_config ( config , & db , & errMsg )
333
378
if statusCode != 0 {
334
379
return nil , libsqlError (fmt .Sprintf ("failed to open database %s %s" , dbPath , primaryUrl ), statusCode , errMsg )
335
380
}
0 commit comments