@@ -202,6 +202,7 @@ pub fn insert_db_version(
202202 insert_db_vrsn : i64 ,
203203) -> Result < ( ) , ResultCode > {
204204 unsafe {
205+ // we can get a more recent db_versio
205206 let mut last_db_versions: mem:: ManuallyDrop < Box < BTreeMap < Vec < u8 > , i64 > > > =
206207 mem:: ManuallyDrop :: new ( Box :: from_raw (
207208 ( * ext_data) . lastDbVersions as * mut BTreeMap < Vec < u8 > , i64 > ,
@@ -215,7 +216,16 @@ pub fn insert_db_version(
215216 }
216217
217218 // ensure the site_id exists in the crsql_site_id table
218- let _ = get_or_set_site_ordinal ( ext_data, insert_site_id) ?;
219+ let ordinal = get_or_set_site_ordinal ( ext_data, insert_site_id) ?;
220+ if ordinal == 0 {
221+ // we manage our own db_version internally but only error if we get a bigger db_version
222+ // cause we can get our own rows from other nodes but the version should never be greater than our own.
223+ let db_version = ( * ext_data) . dbVersion ;
224+ if insert_db_vrsn > db_version {
225+ return Err ( ResultCode :: ERROR ) ;
226+ }
227+ return Ok ( ( ) ) ;
228+ }
219229
220230 let bind_result = ( * ext_data)
221231 . pSetDbVersionStmt
@@ -248,11 +258,10 @@ pub unsafe fn get_or_set_site_ordinal(
248258 ext_data : * mut crsql_ExtData ,
249259 site_id : & [ u8 ] ,
250260) -> Result < i64 , ResultCode > {
251- let bind_result = ( * ext_data) . pSelectSiteIdOrdinalStmt . bind_blob (
252- 1 ,
253- site_id,
254- sqlite:: Destructor :: STATIC ,
255- ) ;
261+ let bind_result =
262+ ( * ext_data)
263+ . pSelectSiteIdOrdinalStmt
264+ . bind_blob ( 1 , site_id, sqlite:: Destructor :: STATIC ) ;
256265
257266 if let Err ( rc) = bind_result {
258267 reset_cached_stmt ( ( * ext_data) . pSelectSiteIdOrdinalStmt ) ?;
@@ -269,11 +278,10 @@ pub unsafe fn get_or_set_site_ordinal(
269278 reset_cached_stmt ( ( * ext_data) . pSelectSiteIdOrdinalStmt ) ?;
270279 // site id had no ordinal yet.
271280 // set one and return the ordinal.
272- let bind_result = ( * ext_data) . pSetSiteIdOrdinalStmt . bind_blob (
273- 1 ,
274- site_id,
275- sqlite:: Destructor :: STATIC ,
276- ) ;
281+ let bind_result =
282+ ( * ext_data)
283+ . pSetSiteIdOrdinalStmt
284+ . bind_blob ( 1 , site_id, sqlite:: Destructor :: STATIC ) ;
277285
278286 if let Err ( rc) = bind_result {
279287 reset_cached_stmt ( ( * ext_data) . pSetSiteIdOrdinalStmt ) ?;
@@ -301,4 +309,4 @@ pub unsafe fn get_or_set_site_ordinal(
301309 return Err ( rc) ;
302310 }
303311 }
304- }
312+ }
0 commit comments