@@ -54,7 +54,7 @@ type Option interface {
5454type option func (* config ) error
5555
5656type Replicated struct {
57- FrameNo int
57+ FrameNo int
5858 FramesSynced int
5959}
6060
@@ -135,7 +135,37 @@ func NewEmbeddedReplicaConnector(dbPath string, primaryUrl string, opts ...Optio
135135 if config .syncInterval != nil {
136136 syncInterval = * config .syncInterval
137137 }
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 )
139169}
140170
141171type driver struct {}
@@ -173,7 +203,7 @@ func (d driver) OpenConnector(dbAddress string) (sqldriver.Connector, error) {
173203
174204func libsqlSync (nativeDbPtr C.libsql_database_t ) (Replicated , error ) {
175205 var errMsg * C.char
176- var rep C.replicated ;
206+ var rep C.replicated
177207 statusCode := C .libsql_sync2 (nativeDbPtr , & rep , & errMsg )
178208 if statusCode != 0 {
179209 return Replicated {0 , 0 }, libsqlError ("failed to sync database " , statusCode , errMsg )
@@ -198,10 +228,10 @@ func openRemoteConnector(primaryUrl, authToken string) (*Connector, error) {
198228 return & Connector {nativeDbPtr : nativeDbPtr }, nil
199229}
200230
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 ) {
202232 var closeCh chan struct {}
203233 var closeAckCh chan struct {}
204- nativeDbPtr , err := libsqlOpenWithSync (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey )
234+ nativeDbPtr , err := libsqlOpenWithSync (dbPath , primaryUrl , authToken , readYourWrites , encryptionKey , offline )
205235 if err != nil {
206236 return nil , err
207237 }
@@ -309,7 +339,7 @@ func libsqlOpenRemote(url, authToken string) (C.libsql_database_t, error) {
309339 return db , nil
310340}
311341
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 ) {
313343 dbPathNativeString := C .CString (dbPath )
314344 defer C .free (unsafe .Pointer (dbPathNativeString ))
315345 primaryUrlNativeString := C .CString (primaryUrl )
@@ -321,15 +351,30 @@ func libsqlOpenWithSync(dbPath, primaryUrl, authToken string, readYourWrites boo
321351 if readYourWrites {
322352 readYourWritesNative = 1
323353 }
354+
355+ var offlineNative C.char = 0
356+ if offline {
357+ offlineNative = 1
358+ }
359+
324360 var encrytionKeyNativeString * C.char
325361 if encryptionKey != "" {
326362 encrytionKeyNativeString = C .CString (encryptionKey )
327363 defer C .free (unsafe .Pointer (encrytionKeyNativeString ))
328364 }
329365
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+
330375 var db C.libsql_database_t
331376 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 )
333378 if statusCode != 0 {
334379 return nil , libsqlError (fmt .Sprintf ("failed to open database %s %s" , dbPath , primaryUrl ), statusCode , errMsg )
335380 }
0 commit comments