@@ -2,20 +2,21 @@ use alloc::collections::BTreeSet;
22use alloc:: format;
33use alloc:: string:: String ;
44
5+ use crate :: error:: { PSResult , SQLiteError } ;
56use sqlite_nostd as sqlite;
67use sqlite_nostd:: { ColumnType , Connection , ResultCode } ;
7- use crate :: error:: { SQLiteError , PSResult } ;
88
99use crate :: ext:: SafeManagedStmt ;
1010use crate :: util:: { internal_table_name, quote_internal_name} ;
1111
12-
1312pub fn can_update_local ( db : * mut sqlite:: sqlite3 ) -> Result < bool , SQLiteError > {
1413 // language=SQLite
15- let statement = db. prepare_v2 ( "\
14+ let statement = db. prepare_v2 (
15+ "\
1616 SELECT group_concat(name)
1717FROM ps_buckets
18- WHERE target_op > last_op AND (name = '$local' OR pending_delete = 0)" ) ?;
18+ WHERE target_op > last_op AND (name = '$local' OR pending_delete = 0)" ,
19+ ) ?;
1920
2021 if statement. step ( ) ? != ResultCode :: ROW {
2122 return Err ( SQLiteError :: from ( ResultCode :: ABORT ) ) ;
@@ -36,15 +37,15 @@ WHERE target_op > last_op AND (name = '$local' OR pending_delete = 0)")?;
3637 Ok ( true )
3738}
3839
39- pub fn sync_local (
40- db : * mut sqlite:: sqlite3 , _data : & str ) -> Result < i64 , SQLiteError > {
41-
40+ pub fn sync_local ( db : * mut sqlite:: sqlite3 , _data : & str ) -> Result < i64 , SQLiteError > {
4241 if !can_update_local ( db) ? {
4342 return Ok ( 0 ) ;
4443 }
4544
4645 // language=SQLite
47- let statement = db. prepare_v2 ( "SELECT name FROM sqlite_master WHERE type='table' AND name GLOB 'ps_data_*'" ) . into_db_result ( db) ?;
46+ let statement = db
47+ . prepare_v2 ( "SELECT name FROM sqlite_master WHERE type='table' AND name GLOB 'ps_data_*'" )
48+ . into_db_result ( db) ?;
4849 let mut tables: BTreeSet < String > = BTreeSet :: new ( ) ;
4950
5051 while statement. step ( ) ? == ResultCode :: ROW {
@@ -60,7 +61,9 @@ pub fn sync_local(
6061 // |--SEARCH r USING INDEX ps_oplog_by_row (row_type=? AND row_id=?)
6162 // `--USE TEMP B-TREE FOR GROUP BY
6263 // language=SQLite
63- let statement = db. prepare_v2 ( "\
64+ let statement = db
65+ . prepare_v2 (
66+ "\
6467 -- 3. Group the objects from different buckets together into a single one (ops).
6568SELECT r.row_type as type,
6669 r.row_id as id,
@@ -79,7 +82,9 @@ FROM ps_buckets AS buckets
7982WHERE r.superseded = 0
8083AND b.superseded = 0
8184-- Group for (3)
82- GROUP BY r.row_type, r.row_id" ) . into_db_result ( db) ?;
85+ GROUP BY r.row_type, r.row_id" ,
86+ )
87+ . into_db_result ( db) ?;
8388
8489 // TODO: cache statements
8590
@@ -96,12 +101,16 @@ GROUP BY r.row_type, r.row_id").into_db_result(db)?;
96101
97102 if buckets == "[]" {
98103 // DELETE
99- let delete_statement = db. prepare_v2 ( & format ! ( "DELETE FROM {} WHERE id = ?" , quoted) ) . into_db_result ( db) ?;
104+ let delete_statement = db
105+ . prepare_v2 ( & format ! ( "DELETE FROM {} WHERE id = ?" , quoted) )
106+ . into_db_result ( db) ?;
100107 delete_statement. bind_text ( 1 , id, sqlite:: Destructor :: STATIC ) ?;
101108 delete_statement. exec ( ) ?;
102109 } else {
103110 // INSERT/UPDATE
104- let insert_statement = db. prepare_v2 ( & format ! ( "REPLACE INTO {}(id, data) VALUES(?, ?)" , quoted) ) . into_db_result ( db) ?;
111+ let insert_statement = db
112+ . prepare_v2 ( & format ! ( "REPLACE INTO {}(id, data) VALUES(?, ?)" , quoted) )
113+ . into_db_result ( db) ?;
105114 insert_statement. bind_text ( 1 , id, sqlite:: Destructor :: STATIC ) ?;
106115 insert_statement. bind_text ( 2 , data?, sqlite:: Destructor :: STATIC ) ?;
107116 insert_statement. exec ( ) ?;
@@ -110,14 +119,18 @@ GROUP BY r.row_type, r.row_id").into_db_result(db)?;
110119 if buckets == "[]" {
111120 // DELETE
112121 // language=SQLite
113- let delete_statement = db. prepare_v2 ( "DELETE FROM ps_untyped WHERE type = ? AND id = ?" ) . into_db_result ( db) ?;
122+ let delete_statement = db
123+ . prepare_v2 ( "DELETE FROM ps_untyped WHERE type = ? AND id = ?" )
124+ . into_db_result ( db) ?;
114125 delete_statement. bind_text ( 1 , type_name, sqlite:: Destructor :: STATIC ) ?;
115126 delete_statement. bind_text ( 2 , id, sqlite:: Destructor :: STATIC ) ?;
116127 delete_statement. exec ( ) ?;
117128 } else {
118129 // INSERT/UPDATE
119130 // language=SQLite
120- let insert_statement = db. prepare_v2 ( "REPLACE INTO ps_untyped(type, id, data) VALUES(?, ?, ?)" ) . into_db_result ( db) ?;
131+ let insert_statement = db
132+ . prepare_v2 ( "REPLACE INTO ps_untyped(type, id, data) VALUES(?, ?, ?)" )
133+ . into_db_result ( db) ?;
121134 insert_statement. bind_text ( 1 , type_name, sqlite:: Destructor :: STATIC ) ?;
122135 insert_statement. bind_text ( 2 , id, sqlite:: Destructor :: STATIC ) ?;
123136 insert_statement. bind_text ( 3 , data?, sqlite:: Destructor :: STATIC ) ?;
@@ -127,9 +140,16 @@ GROUP BY r.row_type, r.row_id").into_db_result(db)?;
127140 }
128141
129142 // language=SQLite
130- db. exec_safe ( "UPDATE ps_buckets
143+ db. exec_safe (
144+ "UPDATE ps_buckets
131145 SET last_applied_op = last_op
132- WHERE last_applied_op != last_op" ) . into_db_result ( db) ?;
146+ WHERE last_applied_op != last_op" ,
147+ )
148+ . into_db_result ( db) ?;
149+
150+ // language=SQLite
151+ db. exec_safe ( "insert or replace into ps_kv(key, value) values('last_synced_at', datetime())" )
152+ . into_db_result ( db) ?;
133153
134154 Ok ( 1 )
135155}
0 commit comments