diff --git a/src/bin/pgrx_embed.rs b/src/bin/pgrx_embed.rs index 57483f1..5f5c4d8 100644 --- a/src/bin/pgrx_embed.rs +++ b/src/bin/pgrx_embed.rs @@ -1 +1 @@ -::pgrx::pgrx_embed!(); \ No newline at end of file +::pgrx::pgrx_embed!(); diff --git a/src/lib.rs b/src/lib.rs index bbc4ad5..cd57415 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,36 +44,23 @@ fn init_sqlite(query: &str) -> Sqlite { } #[pg_extern] -fn query_sqlite( - sqlite: Sqlite, - query: &str, -) -> TableIterator<'_, (name!(sqlite_row, Vec),)> { +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::, _>>() - .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; + #[pg_extern] -fn get_sqlite_text(mut row: Vec, index: i32) -> Option { +fn get_sqlite_text(mut row: SqliteRow, index: i32) -> Option { let col = row.remove(index as usize); if let pgrx::Json(serde_json::Value::String(text)) = col { Some(text) @@ -83,29 +70,41 @@ fn get_sqlite_text(mut row: Vec, index: i32) -> Option { } #[pg_extern] -fn get_sqlite_integer(mut row: Vec, index: i32) -> Option { +fn get_sqlite_integer(mut row: SqliteRow, index: i32) -> Option { let col = row.remove(index as usize); col.0.as_i64() } #[pg_extern] -fn get_sqlite_real(mut row: Vec, index: i32) -> Option { +fn get_sqlite_real(mut row: SqliteRow, index: i32) -> Option { 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::, _>>() + .expect("sqlite query returned an unexpected row") + }; + + TableIterator::new(table) } fn rusqlite_value_to_json(v: SqliteValue) -> serde_json::Value {