-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathmod.rs
More file actions
76 lines (68 loc) · 2.24 KB
/
mod.rs
File metadata and controls
76 lines (68 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
mod common;
pub mod inspection;
mod management;
mod raw_table;
mod table_info;
use alloc::{rc::Rc, vec::Vec};
pub use common::{ColumnFilter, SchemaTable};
use powersync_sqlite_nostd::{self as sqlite, Connection, Context, Value, args};
pub use raw_table::InferredSchemaCache;
use serde::Deserialize;
use sqlite::ResultCode;
pub use table_info::{
Column, CommonTableOptions, PendingStatement, PendingStatementValue, RawTable, Table,
TableInfoFlags,
};
use crate::{
error::{PSResult, PowerSyncError},
schema::raw_table::generate_raw_table_trigger,
state::DatabaseState,
utils::WriteType,
};
#[derive(Deserialize, Default)]
pub struct Schema {
pub tables: Vec<table_info::Table>,
#[serde(default)]
pub raw_tables: Vec<table_info::RawTable>,
}
pub fn register(db: *mut sqlite::sqlite3, state: Rc<DatabaseState>) -> Result<(), ResultCode> {
management::register(db, state)?;
{
fn create_trigger(
context: *mut sqlite::context,
args: &[*mut sqlite::value],
) -> Result<(), PowerSyncError> {
// Args: Table (JSON), trigger_name, write_type
let table: RawTable =
serde_json::from_str(args[0].text()).map_err(PowerSyncError::as_argument_error)?;
let trigger_name = args[1].text();
let write_type: WriteType = args[2].text().parse()?;
let db = context.db_handle();
let create_trigger_stmt =
generate_raw_table_trigger(db, &table, trigger_name, write_type)?;
db.exec_safe(&create_trigger_stmt).into_db_result(db)?;
Ok(())
}
extern "C" fn create_raw_trigger_sqlite(
context: *mut sqlite::context,
argc: i32,
args: *mut *mut sqlite::value,
) {
let args = args!(argc, args);
if let Err(e) = create_trigger(context, args) {
e.apply_to_ctx("powersync_create_raw_table_crud_trigger", context);
}
}
db.create_function_v2(
"powersync_create_raw_table_crud_trigger",
3,
sqlite::UTF8,
None,
Some(create_raw_trigger_sqlite),
None,
None,
None,
)?;
}
Ok(())
}