Skip to content

Commit f28900a

Browse files
committed
Extremely basic support for raw tables
1 parent d6ed25b commit f28900a

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

crates/core/src/sync/storage_adapter.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,11 @@ impl StorageAdapter {
184184
}
185185

186186
let sync_result = match priority {
187-
None => SyncOperation::new(self.db, None).apply(),
187+
None => {
188+
let mut sync = SyncOperation::new(self.db, None);
189+
sync.use_schema(schema);
190+
sync.apply()
191+
}
188192
Some(priority) => {
189193
let args = PartialArgs {
190194
priority,

crates/core/src/sync_local.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ impl<'a> SyncOperation<'a> {
136136
match data {
137137
Ok(data) => {
138138
let stmt = raw.put_statement(self.db)?;
139-
stmt.bind_for_put(id, data)?;
139+
let parsed: serde_json::Value = serde_json::from_str(data)?;
140+
stmt.bind_for_put(id, &parsed)?;
140141
stmt.stmt.exec()?;
141142
}
142143
Err(_) => {
@@ -493,11 +494,8 @@ impl<'a> PreparedPendingStatement<'a> {
493494
})
494495
}
495496

496-
pub fn bind_for_put(&self, id: &str, json_data: &str) -> Result<(), SQLiteError> {
497+
pub fn bind_for_put(&self, id: &str, json_data: &serde_json::Value) -> Result<(), SQLiteError> {
497498
use serde_json::Value;
498-
499-
let parsed: Value = serde_json::from_str(json_data)?;
500-
501499
for (i, source) in self.params.iter().enumerate() {
502500
let i = (i + 1) as i32;
503501

@@ -506,7 +504,7 @@ impl<'a> PreparedPendingStatement<'a> {
506504
self.stmt.bind_text(i, id, Destructor::STATIC)?;
507505
}
508506
PendingStatementValue::Column(column) => {
509-
let parsed = parsed.as_object().ok_or_else(|| {
507+
let parsed = json_data.as_object().ok_or_else(|| {
510508
SQLiteError(
511509
ResultCode::CONSTRAINT_DATATYPE,
512510
Some("expected oplog data to be an object".to_string()),

dart/test/sync_test.dart

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void _syncTests<T>({
9292

9393
List<Object?> pushSyncData(
9494
String bucket, String opId, String rowId, Object op, Object? data,
95-
{int checksum = 0}) {
95+
{int checksum = 0, String objectType = 'items'}) {
9696
return syncLine({
9797
'data': {
9898
'bucket': bucket,
@@ -103,7 +103,7 @@ void _syncTests<T>({
103103
{
104104
'op_id': opId,
105105
'op': op,
106-
'object_type': 'items',
106+
'object_type': objectType,
107107
'object_id': rowId,
108108
'checksum': checksum,
109109
'data': json.encode(data),
@@ -676,6 +676,72 @@ void _syncTests<T>({
676676
expect(db.select('SELECT * FROM ps_buckets'), isEmpty);
677677
});
678678
});
679+
680+
group('raw tables', () {
681+
syncTest('smoke test', (_) {
682+
db.execute(
683+
'CREATE TABLE users (id TEXT NOT NULL PRIMARY KEY, name TEXT NOT NULL) STRICT;');
684+
685+
invokeControl(
686+
'start',
687+
json.encode({
688+
'schema': {
689+
'tables': [
690+
{
691+
'name': 'users',
692+
'raw': {
693+
'put': {
694+
'sql':
695+
'INSERT OR REPLACE INTO users (id, name) VALUES (?, ?);',
696+
'params': [
697+
'Id',
698+
{'Column': 'name'}
699+
],
700+
},
701+
'delete': {
702+
'sql': 'DELETE FROM users WHERE id = ?',
703+
'params': ['Id'],
704+
},
705+
},
706+
'columns': [],
707+
}
708+
],
709+
},
710+
}),
711+
);
712+
713+
// Insert
714+
pushCheckpoint(buckets: [bucketDescription('a')]);
715+
pushSyncData(
716+
'a',
717+
'1',
718+
'my_user',
719+
'PUT',
720+
{'name': 'First user'},
721+
objectType: 'users',
722+
);
723+
pushCheckpointComplete();
724+
725+
final users = db.select('SELECT * FROM users;');
726+
expect(users, [
727+
{'id': 'my_user', 'name': 'First user'}
728+
]);
729+
730+
// Delete
731+
pushCheckpoint(buckets: [bucketDescription('a')]);
732+
pushSyncData(
733+
'a',
734+
'1',
735+
'my_user',
736+
'REMOVE',
737+
null,
738+
objectType: 'users',
739+
);
740+
pushCheckpointComplete();
741+
742+
expect(db.select('SELECT * FROM users'), isEmpty);
743+
});
744+
});
679745
}
680746

681747
const _schema = {

0 commit comments

Comments
 (0)