Made dev tools not break everything about the db
Also improved multi statements to allow out of order parameter binding in statements Ensured that all statements are run for maybe_row and single, and that of all statements only 1 of them returns only 1 row Made bind and column calls add useful context to errors Co-authored-by: kay@zed.dev
This commit is contained in:
parent
2dc1130902
commit
3e0f9d27a7
13 changed files with 219 additions and 110 deletions
|
@ -5,7 +5,7 @@ use std::{
|
|||
sync::Arc,
|
||||
};
|
||||
|
||||
use anyhow::Result;
|
||||
use anyhow::{Context, Result};
|
||||
|
||||
use crate::statement::{SqlType, Statement};
|
||||
|
||||
|
@ -19,61 +19,82 @@ pub trait Column: Sized {
|
|||
|
||||
impl Bind for bool {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind(self.then_some(1).unwrap_or(0), start_index)
|
||||
statement
|
||||
.bind(self.then_some(1).unwrap_or(0), start_index)
|
||||
.with_context(|| format!("Failed to bind bool at index {start_index}"))
|
||||
}
|
||||
}
|
||||
|
||||
impl Column for bool {
|
||||
fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
|
||||
i32::column(statement, start_index).map(|(i, next_index)| (i != 0, next_index))
|
||||
i32::column(statement, start_index)
|
||||
.map(|(i, next_index)| (i != 0, next_index))
|
||||
.with_context(|| format!("Failed to read bool at index {start_index}"))
|
||||
}
|
||||
}
|
||||
|
||||
impl Bind for &[u8] {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_blob(start_index, self)?;
|
||||
statement
|
||||
.bind_blob(start_index, self)
|
||||
.with_context(|| format!("Failed to bind &[u8] at index {start_index}"))?;
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
||||
impl<const C: usize> Bind for &[u8; C] {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_blob(start_index, self.as_slice())?;
|
||||
statement
|
||||
.bind_blob(start_index, self.as_slice())
|
||||
.with_context(|| format!("Failed to bind &[u8; C] at index {start_index}"))?;
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
||||
impl Bind for Vec<u8> {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_blob(start_index, self)?;
|
||||
statement
|
||||
.bind_blob(start_index, self)
|
||||
.with_context(|| format!("Failed to bind Vec<u8> at index {start_index}"))?;
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
||||
impl Column for Vec<u8> {
|
||||
fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
|
||||
let result = statement.column_blob(start_index)?;
|
||||
let result = statement
|
||||
.column_blob(start_index)
|
||||
.with_context(|| format!("Failed to read Vec<u8> at index {start_index}"))?;
|
||||
|
||||
Ok((Vec::from(result), start_index + 1))
|
||||
}
|
||||
}
|
||||
|
||||
impl Bind for f64 {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_double(start_index, *self)?;
|
||||
statement
|
||||
.bind_double(start_index, *self)
|
||||
.with_context(|| format!("Failed to bind f64 at index {start_index}"))?;
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
||||
impl Column for f64 {
|
||||
fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
|
||||
let result = statement.column_double(start_index)?;
|
||||
let result = statement
|
||||
.column_double(start_index)
|
||||
.with_context(|| format!("Failed to parse f64 at index {start_index}"))?;
|
||||
|
||||
Ok((result, start_index + 1))
|
||||
}
|
||||
}
|
||||
|
||||
impl Bind for i32 {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_int(start_index, *self)?;
|
||||
statement
|
||||
.bind_int(start_index, *self)
|
||||
.with_context(|| format!("Failed to bind i32 at index {start_index}"))?;
|
||||
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +108,9 @@ impl Column for i32 {
|
|||
|
||||
impl Bind for i64 {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
statement.bind_int64(start_index, *self)?;
|
||||
statement
|
||||
.bind_int64(start_index, *self)
|
||||
.with_context(|| format!("Failed to bind i64 at index {start_index}"))?;
|
||||
Ok(start_index + 1)
|
||||
}
|
||||
}
|
||||
|
@ -101,7 +124,9 @@ impl Column for i64 {
|
|||
|
||||
impl Bind for usize {
|
||||
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
|
||||
(*self as i64).bind(statement, start_index)
|
||||
(*self as i64)
|
||||
.bind(statement, start_index)
|
||||
.with_context(|| format!("Failed to bind usize at index {start_index}"))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue