@@ -6,7 +6,7 @@ extern crate lazy_static;
66mod types;
77
88use crate :: types:: libsql_config;
9- use libsql:: { errors, LoadExtensionGuard } ;
9+ use libsql:: { errors, Builder , LoadExtensionGuard } ;
1010use tokio:: runtime:: Runtime ;
1111use types:: {
1212 blob, libsql_connection, libsql_connection_t, libsql_database, libsql_database_t, libsql_row,
@@ -152,6 +152,44 @@ pub unsafe extern "C" fn libsql_open_sync_with_config(
152152 return 3 ;
153153 }
154154 } ;
155+ let uri: http:: Uri = match primary_url. try_into ( ) {
156+ Ok ( uri) => uri,
157+ Err ( e) => {
158+ set_err_msg ( format ! ( "Wrong primary URL: {e}" ) , out_err_msg) ;
159+ return 100 ;
160+ }
161+ } ;
162+ if let Some ( query) = uri. query ( ) {
163+ if query. contains ( "offline" ) {
164+ let mut builder = Builder :: new_synced_database (
165+ db_path,
166+ primary_url. to_owned ( ) ,
167+ auth_token. to_owned ( ) ,
168+ ) ;
169+ if config. with_webpki != 0 {
170+ let https = hyper_rustls:: HttpsConnectorBuilder :: new ( )
171+ . with_webpki_roots ( )
172+ . https_or_http ( )
173+ . enable_http1 ( )
174+ . build ( ) ;
175+ builder = builder. connector ( https) ;
176+ }
177+ match RT . block_on ( builder. build ( ) ) {
178+ Ok ( db) => {
179+ let db = Box :: leak ( Box :: new ( libsql_database { db } ) ) ;
180+ * out_db = libsql_database_t:: from ( db) ;
181+ return 0 ;
182+ }
183+ Err ( e) => {
184+ set_err_msg (
185+ format ! ( "Error opening offline db path {db_path}, primary url {primary_url}: {e}" ) ,
186+ out_err_msg,
187+ ) ;
188+ return 101 ;
189+ }
190+ }
191+ }
192+ }
155193 let mut builder = libsql:: Builder :: new_remote_replica (
156194 db_path,
157195 primary_url. to_string ( ) ,
0 commit comments