Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ build/
tsconfig.tsbuildinfo
.turbo/
target/
py/correctness/.hypothesis/
1 change: 0 additions & 1 deletion core/rs/bundle/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

extern crate alloc;

use core::alloc::GlobalAlloc;
use core::ffi::c_char;
use core::panic::PanicInfo;
use crsql_core;
Expand Down
2 changes: 1 addition & 1 deletion core/rs/core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ sqlite_nostd = { path="../sqlite-rs-embedded/sqlite_nostd" }
bytes = { version = "1.5", default-features = false }
num-traits = { version = "0.2.17", default-features = false }
num-derive = "0.4.1"
libc-print = "0.1.22"
libc-print = "*"

[dev-dependencies]

Expand Down
2 changes: 1 addition & 1 deletion core/rs/core/src/alter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ unsafe fn compact_post_alter(
SELECT name FROM pragma_table_info('{table_name}')
WHERE pk > 0 AND name NOT IN
(SELECT name FROM pragma_index_info('{table_name}__crsql_pks_pks'))
UNION SELECT name FROM pragma_index_info('{table_name}__crsql_pks_pks') WHERE name NOT IN
UNION SELECT name FROM pragma_index_info('{table_name}__crsql_pks_pks') WHERE name NOT IN
(SELECT name FROM pragma_table_info('{table_name}') WHERE pk > 0) AND name != 'col_name'
);",
table_name = crate::util::escape_ident_as_value(tbl_name_str),
Expand Down
8 changes: 4 additions & 4 deletions core/rs/core/src/automigrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -423,8 +423,8 @@ fn maybe_recreate_index(
let fetch_idx_cols_mem = mem_db.prepare_v2(IDX_COLS_SQL)?;
let fetch_idx_cols_local = local_db.prepare_v2(IDX_COLS_SQL)?;

let mem_result = fetch_idx_cols_mem.step()?;
let local_result = fetch_idx_cols_local.step()?;
let mut mem_result = fetch_idx_cols_mem.step()?;
let mut local_result = fetch_idx_cols_local.step()?;
while mem_result == ResultCode::ROW && local_result == ResultCode::ROW {
if fetch_idx_cols_mem.column_text(0) != fetch_idx_cols_local.column_text(0) {
// We cannot alter a table against which we have open statements
Expand All @@ -433,8 +433,8 @@ fn maybe_recreate_index(
drop(fetch_idx_cols_mem);
return recreate_index(local_db, idx);
}
fetch_idx_cols_mem.step()?;
fetch_idx_cols_local.step()?;
mem_result = fetch_idx_cols_mem.step()?;
local_result = fetch_idx_cols_local.step()?;
}

if mem_result != local_result {
Expand Down
39 changes: 20 additions & 19 deletions core/rs/core/src/bootstrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ pub extern "C" fn crsql_init_peer_tracking_table(db: *mut sqlite3) -> c_int {
}
}

// #[no_mangle]
pub extern "C" fn crsql_init_db_versions_table(db: *mut sqlite3) -> c_int {
match db.exec_safe("CREATE TABLE IF NOT EXISTS crsql_db_versions (\"site_id\" BLOB NOT NULL PRIMARY KEY, \"db_version\" INTEGER NOT NULL) STRICT;") {
Ok(_) => ResultCode::OK as c_int,
Err(code) => code as c_int
}
}

fn has_table(db: *mut sqlite3, table_name: &str) -> Result<bool, ResultCode> {
let stmt =
db.prepare_v2("SELECT 1 FROM sqlite_master WHERE type = 'table' AND tbl_name = ?")?;
Expand Down Expand Up @@ -146,25 +154,16 @@ fn maybe_update_db_inner(
recorded_version = stmt.column_int(0);
}
}
// libc_print::libc_println!("recorded_version: {}", recorded_version);

if recorded_version < consts::CRSQLITE_VERSION_0_15_0 && !is_blank_slate {
// todo: return an error message to the user that their version is
// not supported
let cstring = CString::new(format!("Opening a db created with cr-sqlite version {} is not supported. Upcoming release 0.15.0 is a breaking change.", recorded_version))?;
if recorded_version < consts::CRSQLITE_VERSION_0_17_0 && !is_blank_slate {
let cstring = CString::new(format!("Opening a db created with cr-sqlite version {} is not supported. Upcoming release 0.17.0 is a breaking change.", recorded_version))?;
unsafe {
(*err_msg) = cstring.into_raw();
return Err(ResultCode::ERROR);
}
}

// if recorded_version < consts::CRSQLITE_VERSION_0_13_0 {
// update_to_0_13_0(db)?;
// }

// if recorded_version < consts::CRSQLITE_VERSION_0_15_0 {
// update_to_0_15_0(db)?;
// }

// write the db version if we migrated to a new one or we are a blank slate db
if recorded_version < consts::CRSQLITE_VERSION || is_blank_slate {
let stmt =
Expand Down Expand Up @@ -208,28 +207,30 @@ pub fn create_clock_table(
db_version INTEGER NOT NULL,
site_id INTEGER NOT NULL DEFAULT 0,
seq INTEGER NOT NULL,
ts TEXT NOT NULL DEFAULT '0',

PRIMARY KEY (key, col_name)
) WITHOUT ROWID, STRICT",
table_name = crate::util::escape_ident(table_name),
))?;

db.exec_safe(
&format!(
"CREATE INDEX IF NOT EXISTS \"{table_name}__crsql_clock_dbv_idx\" ON \"{table_name}__crsql_clock\" (\"db_version\")",
&format!(
"CREATE INDEX IF NOT EXISTS \"{table_name}__crsql_clock_dbv_idx\" ON \"{table_name}__crsql_clock\" (\"site_id\", \"db_version\")",
table_name = crate::util::escape_ident(table_name),
))?;
))?;
db.exec_safe(
&format!(
&format!(
"CREATE TABLE IF NOT EXISTS \"{table_name}__crsql_pks\" (__crsql_key INTEGER PRIMARY KEY, {pk_list})",
table_name = table_name,
pk_list = pk_list,
)
)
)?;
db.exec_safe(
&format!(
&format!(
"CREATE UNIQUE INDEX IF NOT EXISTS \"{table_name}__crsql_pks_pks\" ON \"{table_name}__crsql_pks\" ({pk_list})",
table_name = table_name,
pk_list = pk_list
)
)
)
}
57 changes: 46 additions & 11 deletions core/rs/core/src/c.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ pub enum CrsqlChangesColumn {
SiteId = 6,
Cl = 7,
Seq = 8,
Ts = 9,
}

#[derive(FromPrimitive, PartialEq, Debug)]
Expand All @@ -36,6 +37,7 @@ pub enum ClockUnionColumn {
RowId = 6,
Seq = 7,
Cl = 8,
Ts = 9,
}

#[derive(FromPrimitive, PartialEq, Debug)]
Expand All @@ -59,6 +61,8 @@ pub struct crsql_ExtData {
pub pragmaSchemaVersionForTableInfos: ::core::ffi::c_int,
pub siteId: *mut ::core::ffi::c_uchar,
pub pDbVersionStmt: *mut sqlite::stmt,
pub pSetDbVersionStmt: *mut sqlite::stmt,
pub lastDbVersions: *mut ::core::ffi::c_void,
pub tableInfos: *mut ::core::ffi::c_void,
pub rowsImpacted: ::core::ffi::c_int,
pub seq: ::core::ffi::c_int,
Expand All @@ -68,6 +72,7 @@ pub struct crsql_ExtData {
pub pSelectSiteIdOrdinalStmt: *mut sqlite::stmt,
pub pSelectClockTablesStmt: *mut sqlite::stmt,
pub mergeEqualValues: ::core::ffi::c_int,
pub timestamp: ::core::ffi::c_ulonglong,
}

#[repr(C)]
Expand Down Expand Up @@ -257,13 +262,13 @@ fn bindgen_test_layout_crsql_Changes_cursor() {
}

#[test]
#[allow(non_snake_case)]
#[allow(non_snake_case, non_camel_case_types)]
fn bindgen_test_layout_crsql_ExtData() {
const UNINIT: ::core::mem::MaybeUninit<crsql_ExtData> = ::core::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::core::mem::size_of::<crsql_ExtData>(),
136usize,
160usize,
concat!("Size of: ", stringify!(crsql_ExtData))
);
assert_eq!(
Expand Down Expand Up @@ -374,8 +379,28 @@ fn bindgen_test_layout_crsql_ExtData() {
)
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).tableInfos) as usize - ptr as usize },
unsafe { ::core::ptr::addr_of!((*ptr).pSetDbVersionStmt) as usize - ptr as usize },
72usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
"::",
stringify!(pSetDbVersionStmt)
)
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).lastDbVersions) as usize - ptr as usize },
80usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
"::",
stringify!(lastDbVersions)
)
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).tableInfos) as usize - ptr as usize },
88usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -385,7 +410,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).rowsImpacted) as usize - ptr as usize },
80usize,
96usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -395,7 +420,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).seq) as usize - ptr as usize },
84usize,
100usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -405,7 +430,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).pSetSyncBitStmt) as usize - ptr as usize },
88usize,
104usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -415,7 +440,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).pClearSyncBitStmt) as usize - ptr as usize },
96usize,
112usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -425,7 +450,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).pSetSiteIdOrdinalStmt) as usize - ptr as usize },
104usize,
120usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -435,7 +460,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).pSelectSiteIdOrdinalStmt) as usize - ptr as usize },
112usize,
128usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -445,7 +470,7 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).pSelectClockTablesStmt) as usize - ptr as usize },
120usize,
136usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
Expand All @@ -455,12 +480,22 @@ fn bindgen_test_layout_crsql_ExtData() {
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).mergeEqualValues) as usize - ptr as usize },
128usize,
144usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
"::",
stringify!(mergeEqualValues)
)
);
assert_eq!(
unsafe { ::core::ptr::addr_of!((*ptr).timestamp) as usize - ptr as usize },
152usize,
concat!(
"Offset of field: ",
stringify!(crsql_ExtData),
"::",
stringify!(timestamp)
)
);
}
Loading
Loading