@@ -27,7 +27,6 @@ use futures::Stream;
27
27
use futures:: StreamExt ;
28
28
use ouroboros:: self_referencing;
29
29
use sqlx:: sqlite:: SqliteConnectOptions ;
30
- use sqlx:: sqlite:: SqlitePoolOptions ;
31
30
use sqlx:: SqlitePool ;
32
31
use tokio:: sync:: OnceCell ;
33
32
@@ -137,12 +136,11 @@ impl Builder for SqliteBuilder {
137
136
}
138
137
} ;
139
138
140
- let config: SqliteConnectOptions =
141
- SqliteConnectOptions :: from_str ( & conn) . map_err ( |err| {
142
- Error :: new ( ErrorKind :: ConfigInvalid , "connection_string is invalid" )
143
- . with_context ( "service" , Scheme :: Sqlite )
144
- . set_source ( err)
145
- } ) ?;
139
+ let config = SqliteConnectOptions :: from_str ( & conn) . map_err ( |err| {
140
+ Error :: new ( ErrorKind :: ConfigInvalid , "connection_string is invalid" )
141
+ . with_context ( "service" , Scheme :: Sqlite )
142
+ . set_source ( err)
143
+ } ) ?;
146
144
147
145
let table = match self . config . table {
148
146
Some ( v) => v,
@@ -188,9 +186,7 @@ impl Adapter {
188
186
async fn get_client ( & self ) -> Result < & SqlitePool > {
189
187
self . pool
190
188
. get_or_try_init ( || async {
191
- let pool = SqlitePoolOptions :: new ( )
192
- . max_connections ( 1 )
193
- . connect_with ( self . config . clone ( ) )
189
+ let pool = SqlitePool :: connect_with ( self . config . clone ( ) )
194
190
. await
195
191
. map_err ( parse_sqlite_error) ?;
196
192
Ok ( pool)
@@ -312,5 +308,28 @@ impl kv::Adapter for Adapter {
312
308
}
313
309
314
310
fn parse_sqlite_error ( err : sqlx:: Error ) -> Error {
315
- Error :: new ( ErrorKind :: Unexpected , "unhandled error from sqlite" ) . set_source ( err)
311
+ let ( message, is_temporary) = match & err {
312
+ sqlx:: Error :: Database ( db_err) => {
313
+ let error_code = db_err. code ( ) ;
314
+ if let Some ( code) = error_code {
315
+ match code. as_ref ( ) {
316
+ "5" => ( "database is locked, retry may succeed" , true ) ,
317
+ "6" => ( "database is busy, retry may succeed" , true ) ,
318
+ _ => ( "unhandled error from sqlite" , false ) ,
319
+ }
320
+ } else {
321
+ ( "unhandled error from sqlite" , false )
322
+ }
323
+ }
324
+ _ => ( "unhandled error from sqlite" , false ) ,
325
+ } ;
326
+
327
+ let mut error = Error :: new ( ErrorKind :: Unexpected , message)
328
+ . set_source ( err) ;
329
+
330
+ if is_temporary {
331
+ error = error. set_temporary ( ) ;
332
+ }
333
+
334
+ error
316
335
}
0 commit comments