|
| 1 | +#![allow(improper_ctypes)] |
1 | 2 | #[cfg(test)] |
2 | 3 | mod tests { |
3 | 4 | use rusqlite::Connection; |
@@ -121,8 +122,7 @@ mod tests { |
121 | 122 | db: extern "C" fn(wal: *mut Wal, db: *const c_void), |
122 | 123 | pathname_len: extern "C" fn(orig_len: i32) -> i32, |
123 | 124 | get_pathname: extern "C" fn(buf: *mut u8, orig: *const u8, orig_len: i32), |
124 | | - pre_main_db_open: |
125 | | - extern "C" fn(methods: *mut libsql_wal_methods, name: *const i8) -> i32, |
| 125 | + pre_main_db_open: extern "C" fn(methods: *mut libsql_wal_methods, name: *const i8) -> i32, |
126 | 126 | b_uses_shm: i32, |
127 | 127 | name: *const u8, |
128 | 128 | p_next: *const c_void, |
@@ -165,7 +165,7 @@ mod tests { |
165 | 165 | wal: *mut *const Wal, |
166 | 166 | ) -> i32 { |
167 | 167 | let new_wal = Box::new(Wal { |
168 | | - vfs: vfs, |
| 168 | + vfs, |
169 | 169 | db_fd: std::ptr::null(), |
170 | 170 | wal_fd: std::ptr::null(), |
171 | 171 | callback_value: 0, |
@@ -199,7 +199,7 @@ mod tests { |
199 | 199 | }, |
200 | 200 | min_frame: 0, |
201 | 201 | recalculate_checksums: 0, |
202 | | - wal_name: wal_name, |
| 202 | + wal_name, |
203 | 203 | n_checkpoints: 0, |
204 | 204 | lock_error: 0, |
205 | 205 | p_snapshot: std::ptr::null(), |
@@ -253,12 +253,14 @@ mod tests { |
253 | 253 | return ERR_MISUSE; |
254 | 254 | } |
255 | 255 | let out_buffer = unsafe { std::slice::from_raw_parts_mut(p_out, n_out) }; |
256 | | - out_buffer.copy_from_slice(&data); |
| 256 | + out_buffer.copy_from_slice(data); |
257 | 257 | println!("\t\tread {} bytes", data.len()); |
258 | 258 | 0 |
259 | 259 | } |
260 | | - extern "C" fn db_size(_wal: *mut Wal) -> i32 { |
261 | | - ERR_MISUSE |
| 260 | + extern "C" fn db_size(wal: *mut Wal) -> i32 { |
| 261 | + println!("Db size called"); |
| 262 | + let methods = unsafe { &*(*wal).wal_methods }; |
| 263 | + methods.pages.len() as i32 |
262 | 264 | } |
263 | 265 | extern "C" fn begin_write(_wal: *mut Wal) -> i32 { |
264 | 266 | println!("Write started"); |
@@ -300,7 +302,7 @@ mod tests { |
300 | 302 | } |
301 | 303 | .to_vec(); |
302 | 304 | methods.pages.insert(current.pgno, data); |
303 | | - if current.dirty == std::ptr::null() { |
| 305 | + if current.dirty.is_null() { |
304 | 306 | break; |
305 | 307 | } |
306 | 308 | current_ptr = current.dirty |
@@ -334,12 +336,14 @@ mod tests { |
334 | 336 | panic!("Should never be called") |
335 | 337 | } |
336 | 338 | extern "C" fn db(_wal: *mut Wal, _db: *const c_void) {} |
337 | | - extern "C" fn pathname_len(_orig_len: i32) -> i32 { |
338 | | - println!("Returning length 0"); |
339 | | - 0 |
| 339 | + extern "C" fn pathname_len(orig_len: i32) -> i32 { |
| 340 | + orig_len + 4 |
340 | 341 | } |
341 | | - extern "C" fn get_pathname(_buf: *mut u8, _orig: *const u8, _orig_len: i32) { |
342 | | - panic!("Should never be called") |
| 342 | + extern "C" fn get_pathname(buf: *mut u8, orig: *const u8, orig_len: i32) { |
| 343 | + unsafe { |
| 344 | + std::ptr::copy_nonoverlapping(orig, buf, orig_len as usize); |
| 345 | + std::ptr::copy_nonoverlapping(".wal".as_ptr(), buf.offset(orig_len as isize), 4); |
| 346 | + } |
343 | 347 | } |
344 | 348 | extern "C" fn pre_main_db_open(_methods: *mut libsql_wal_methods, _name: *const i8) -> i32 { |
345 | 349 | 0 |
@@ -402,7 +406,11 @@ mod tests { |
402 | 406 | Box::leak(vwal); |
403 | 407 | Connection::from_handle(pdb).unwrap() |
404 | 408 | }; |
405 | | - conn.pragma_update(None, "journal_mode", "wal").unwrap(); |
| 409 | + let journal_mode: String = conn |
| 410 | + .query_row("PRAGMA journal_mode", [], |r| r.get(0)) |
| 411 | + .unwrap(); |
| 412 | + println!("Journaling mode: {}", journal_mode); |
| 413 | + assert_eq!(journal_mode, "wal".to_string()); |
406 | 414 | conn.execute("CREATE TABLE t(id)", ()).unwrap(); |
407 | 415 | conn.execute("INSERT INTO t(id) VALUES (42)", ()).unwrap(); |
408 | 416 | conn.execute("INSERT INTO t(id) VALUES (zeroblob(8193))", ()) |
|
0 commit comments