Skip to content

Commit

Permalink
chore: refactor with a SqliteRow alias
Browse files Browse the repository at this point in the history
  • Loading branch information
frectonz committed Nov 20, 2024
1 parent 0e1b2ba commit e78bd14
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 31 deletions.
2 changes: 1 addition & 1 deletion src/bin/pgrx_embed.rs
Original file line number Diff line number Diff line change
@@ -1 +1 @@
::pgrx::pgrx_embed!();
::pgrx::pgrx_embed!();
59 changes: 29 additions & 30 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,36 +44,23 @@ fn init_sqlite(query: &str) -> Sqlite {
}

#[pg_extern]
fn query_sqlite(
sqlite: Sqlite,
query: &str,
) -> TableIterator<'_, (name!(sqlite_row, Vec<pgrx::Json>),)> {
fn execute_sqlite(sqlite: Sqlite, query: &str) -> Sqlite {
let temp = temp_file();
fs::write(&temp, sqlite.data).expect("failed to create a temprary sqlite database file");

let table = {
{
let conn = Connection::open(&temp).expect("couldn't open sqlite database");
let mut stmt = conn.prepare(query).expect("couldn't prepare sqlite query");

let columns_len = stmt.column_count();
stmt.query_map((), |row| {
let mut rows = Vec::with_capacity(columns_len);
for i in 0..columns_len {
let val = rusqlite_value_to_json(row.get(i)?);
rows.push(pgrx::Json(val));
}
Ok((rows,))
})
.expect("query execution failed")
.collect::<Result<Vec<_>, _>>()
.expect("sqlite query returned an unexpected row")
};
conn.execute_batch(query).expect("query execution failed");
}

TableIterator::new(table)
let data = fs::read(&temp).expect("couldn't read newly created sqlite database file");
Sqlite { data }
}

type SqliteRow = Vec<pgrx::Json>;

#[pg_extern]
fn get_sqlite_text(mut row: Vec<pgrx::Json>, index: i32) -> Option<String> {
fn get_sqlite_text(mut row: SqliteRow, index: i32) -> Option<String> {
let col = row.remove(index as usize);
if let pgrx::Json(serde_json::Value::String(text)) = col {
Some(text)
Expand All @@ -83,29 +70,41 @@ fn get_sqlite_text(mut row: Vec<pgrx::Json>, index: i32) -> Option<String> {
}

#[pg_extern]
fn get_sqlite_integer(mut row: Vec<pgrx::Json>, index: i32) -> Option<i64> {
fn get_sqlite_integer(mut row: SqliteRow, index: i32) -> Option<i64> {
let col = row.remove(index as usize);
col.0.as_i64()
}

#[pg_extern]
fn get_sqlite_real(mut row: Vec<pgrx::Json>, index: i32) -> Option<f64> {
fn get_sqlite_real(mut row: SqliteRow, index: i32) -> Option<f64> {
let col = row.remove(index as usize);
col.0.as_f64()
}

#[pg_extern]
fn execute_sqlite(sqlite: Sqlite, query: &str) -> Sqlite {
fn query_sqlite(sqlite: Sqlite, query: &str) -> TableIterator<'_, (name!(sqlite_row, SqliteRow),)> {
let temp = temp_file();
fs::write(&temp, sqlite.data).expect("failed to create a temprary sqlite database file");

{
let table = {
let conn = Connection::open(&temp).expect("couldn't open sqlite database");
conn.execute_batch(query).expect("query execution failed");
}
let mut stmt = conn.prepare(query).expect("couldn't prepare sqlite query");

let data = fs::read(&temp).expect("couldn't read newly created sqlite database file");
Sqlite { data }
let columns_len = stmt.column_count();
stmt.query_map((), |row| {
let mut rows = Vec::with_capacity(columns_len);
for i in 0..columns_len {
let val = rusqlite_value_to_json(row.get(i)?);
rows.push(pgrx::Json(val));
}
Ok((rows,))
})
.expect("query execution failed")
.collect::<Result<Vec<_>, _>>()
.expect("sqlite query returned an unexpected row")
};

TableIterator::new(table)
}

fn rusqlite_value_to_json(v: SqliteValue) -> serde_json::Value {
Expand Down

0 comments on commit e78bd14

Please sign in to comment.