Skip to content

Commit 7159d4a

Browse files
committed
update sentinels for pk only rows too
Signed-off-by: Somtochi Onyekwere <[email protected]>
1 parent 3e55074 commit 7159d4a

File tree

4 files changed

+50
-39
lines changed

4 files changed

+50
-39
lines changed

core/rs/core/src/local_writes/after_insert.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,27 @@ fn after_insert(
4646
let (create_record_existed, key_new) = tbl_info
4747
.get_or_create_key_for_insert(db, pks_new)
4848
.map_err(|_| "failed getting or creating lookaside key")?;
49-
if tbl_info.non_pks.is_empty() {
49+
50+
let cl = if tbl_info.non_pks.is_empty() {
5051
let seq = bump_seq(ext_data);
5152
// just a sentinel record
52-
return super::mark_new_pk_row_created(db, tbl_info, key_new, db_version, seq, &ts);
53-
} else if create_record_existed {
54-
// update the create record since it already exists.
55-
let seq = bump_seq(ext_data);
56-
let cl = update_create_record(db, tbl_info, key_new, db_version, seq, &ts)?;
57-
if let Some(cl) = cl {
58-
tbl_info.set_cl(key_new, cl);
59-
}
60-
}
53+
let cl = super::mark_new_pk_row_created(db, tbl_info, key_new, db_version, seq, &ts)?;
54+
Some(cl)
55+
} else {
56+
let cl = if create_record_existed {
57+
// update the create record since it already exists.
58+
let seq = bump_seq(ext_data);
59+
update_create_record(db, tbl_info, key_new, db_version, seq, &ts)?
60+
} else {
61+
None
62+
};
63+
super::mark_locally_inserted(db, ext_data, tbl_info, key_new, db_version, &ts)?;
64+
cl
65+
};
6166

62-
super::mark_locally_inserted(db, ext_data, tbl_info, key_new, db_version, &ts)?;
67+
if let Some(cl) = cl {
68+
tbl_info.set_cl(key_new, cl);
69+
}
6370

6471
Ok(ResultCode::OK)
6572
}
@@ -94,22 +101,15 @@ fn update_create_record(
94101
.map_err(|_e| "failed binding to update_create_record_stmt")?;
95102

96103
let res = update_create_record_stmt.step();
97-
match res {
104+
let result = match res {
98105
Ok(ResultCode::ROW) => {
99106
let col_version = update_create_record_stmt.column_int64(0);
100-
super::reset_cached_stmt(update_create_record_stmt.stmt)
101-
.map_err(|_e| "failed to reset cached stmt")?;
102107
Ok(Some(col_version))
103108
}
104-
Ok(ResultCode::DONE) => {
105-
super::reset_cached_stmt(update_create_record_stmt.stmt)
106-
.map_err(|_e| "failed to reset cached stmt")?;
107-
Ok(None)
108-
}
109-
_ => {
110-
super::reset_cached_stmt(update_create_record_stmt.stmt)
111-
.map_err(|_e| "failed to reset cached stmt")?;
112-
Err("failed to step update_create_record_stmt".to_string())
113-
}
114-
}
109+
Ok(ResultCode::DONE) => Ok(None),
110+
_ => Err("failed to step update_create_record_stmt".to_string()),
111+
};
112+
super::reset_cached_stmt(update_create_record_stmt.stmt)
113+
.map_err(|_e| "failed to reset cached stmt")?;
114+
result
115115
}

core/rs/core/src/local_writes/after_update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ fn after_update(
8585
if crate::compare_values::any_value_changed(pks_new, pks_old)? {
8686
let old_key = tbl_info
8787
.get_or_create_key_via_raw_values(db, pks_old)
88-
.map_err(|_| "failed geteting or creating lookaside key")?;
88+
.map_err(|_| "failed getting or creating lookaside key")?;
8989
let next_seq = super::bump_seq(ext_data);
9090
changed = true;
9191
// Record the delete of the row identified by the old primary keys

core/rs/core/src/local_writes/mod.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn mark_new_pk_row_created(
8484
db_version: i64,
8585
seq: i32,
8686
ts: &str,
87-
) -> Result<ResultCode, String> {
87+
) -> Result<i64, String> {
8888
let mark_locally_created_stmt_ref = tbl_info
8989
.get_mark_locally_created_stmt(db)
9090
.map_err(|_e| "failed to get mark_locally_created_stmt")?;
@@ -98,7 +98,17 @@ fn mark_new_pk_row_created(
9898
.and_then(|_| mark_locally_created_stmt.bind_int(3, seq))
9999
.and_then(|_| mark_locally_created_stmt.bind_text(4, ts, sqlite::Destructor::STATIC))
100100
.map_err(|_| "failed binding to mark_locally_created_stmt")?;
101-
step_trigger_stmt(mark_locally_created_stmt)
101+
let stmt_res = mark_locally_created_stmt.step();
102+
let result = match stmt_res {
103+
Ok(ResultCode::ROW) => {
104+
let cl = mark_locally_created_stmt.column_int64(0);
105+
Ok(cl)
106+
}
107+
_ => Err("failed to step mark locally created stmt".to_string()),
108+
};
109+
reset_cached_stmt(mark_locally_created_stmt.stmt)
110+
.map_err(|_e| "failed to reset cached stmt")?;
111+
result
102112
}
103113

104114
fn bump_seq(ext_data: *mut crsql_ExtData) -> c_int {
@@ -291,19 +301,18 @@ fn mark_locally_deleted(
291301
.and_then(|_| mark_locally_deleted_stmt.bind_text(4, &ts, sqlite::Destructor::STATIC))
292302
.map_err(|_| "failed binding to mark locally deleted stmt")?;
293303

294-
let res = mark_locally_deleted_stmt.step();
304+
let stmt_res = mark_locally_deleted_stmt.step();
295305

296-
match res {
306+
let result = match stmt_res {
297307
Ok(ResultCode::ROW) => {
298308
let cl = mark_locally_deleted_stmt.column_int64(0);
299-
reset_cached_stmt(mark_locally_deleted_stmt.stmt)
300-
.map_err(|_e| "failed to reset cached stmt")?;
301309
Ok(cl)
302310
}
303-
_ => {
304-
reset_cached_stmt(mark_locally_deleted_stmt.stmt)
305-
.map_err(|_e| "failed to reset cached stmt")?;
306-
Err("failed to step mark locally deleted stmt".to_string())
307-
}
308-
}
311+
_ => Err("failed to step mark locally deleted stmt".to_string()),
312+
};
313+
314+
reset_cached_stmt(mark_locally_deleted_stmt.stmt)
315+
.map_err(|_e| "failed to reset cached stmt")?;
316+
317+
result
309318
}

core/rs/core/src/tableinfo.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use sqlite_nostd::ResultCode;
2828
use sqlite_nostd::Stmt;
2929
use sqlite_nostd::StrRef;
3030

31+
// TODO: make this configurable with a crsql_config_set.
3132
const MAX_CL_CACHE_SIZE: usize = 1500;
3233
pub struct TableInfo {
3334
pub tbl_name: String,
@@ -561,7 +562,8 @@ impl TableInfo {
561562
db_version = excluded.db_version,
562563
seq = excluded.seq,
563564
site_id = 0,
564-
ts = excluded.ts",
565+
ts = excluded.ts
566+
RETURNING col_version",
565567
table_name = crate::util::escape_ident(&self.tbl_name),
566568
sentinel = crate::c::INSERT_SENTINEL,
567569
);

0 commit comments

Comments
 (0)