Skip to content

Commit

Permalink
statement implementations for managing lookaside
Browse files Browse the repository at this point in the history
  • Loading branch information
tantaman committed Sep 27, 2023
1 parent 5c68a6e commit 56d7c4e
Showing 1 changed file with 55 additions and 0 deletions.
55 changes: 55 additions & 0 deletions core/rs/core/src/tableinfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,61 @@ impl TableInfo {
Err(ResultCode::ERROR)
}

// TODO: macro-ify all these
pub fn get_select_key_stmt(
&self,
db: *mut sqlite3,
) -> Result<Ref<Option<ManagedStmt>>, ResultCode> {
if self.select_key_stmt.try_borrow()?.is_none() {
let sql = format!(
"SELECT __crsql_key FROM \"{table_name}__crsql_pks\" WHERE {pk_where_list}",
table_name = crate::util::escape_ident(&self.tbl_name),
pk_where_list = crate::util::where_list(&self.pks, None)?,
);
let ret = db.prepare_v3(&sql, sqlite::PREPARE_PERSISTENT)?;
*self.select_key_stmt.try_borrow_mut()? = Some(ret);
}
Ok(self.select_key_stmt.try_borrow()?)
}

pub fn get_insert_key_stmt(
&self,
db: *mut sqlite3,
) -> Result<Ref<Option<ManagedStmt>>, ResultCode> {
if self.insert_key_stmt.try_borrow()?.is_none() {
let sql = format!(
"INSERT INTO \"{table_name}__crsql_pks\" ({pk_list}) VALUES ({pk_bindings})",
table_name = crate::util::escape_ident(&self.tbl_name),
pk_list = crate::util::as_identifier_list(&self.pks, None)?,
pk_bindings = crate::util::binding_list(self.pks.len()),
);
let ret = db.prepare_v3(&sql, sqlite::PREPARE_PERSISTENT)?;
*self.insert_key_stmt.try_borrow_mut()? = Some(ret);
}
Ok(self.insert_key_stmt.try_borrow()?)
}

pub fn get_insert_or_ignore_returning_key_stmt(
&self,
db: *mut sqlite3,
) -> Result<Ref<Option<ManagedStmt>>, ResultCode> {
if self
.insert_or_ignore_returning_key_stmt
.try_borrow()?
.is_none()
{
let sql = format!(
"INSERT OR IGNORE INTO \"{table_name}__crsql_pks\" ({pk_list}) VALUES ({pk_bindings}) RETURNING __crsql_key",
table_name = crate::util::escape_ident(&self.tbl_name),
pk_list = crate::util::as_identifier_list(&self.pks, None)?,
pk_bindings = crate::util::binding_list(self.pks.len()),
);
let ret = db.prepare_v3(&sql, sqlite::PREPARE_PERSISTENT)?;
*self.insert_or_ignore_returning_key_stmt.try_borrow_mut()? = Some(ret);
}
Ok(self.insert_or_ignore_returning_key_stmt.try_borrow()?)
}

pub fn get_set_winner_clock_stmt(
&self,
db: *mut sqlite3,
Expand Down

0 comments on commit 56d7c4e

Please sign in to comment.