(
ctx: Context<'gc>,
row: &sqlx::postgres::PgRow,
i: usize,
type_info: &sqlx::postgres::PgTypeInfo,
)
| 36 | } |
| 37 | |
| 38 | fn column_to_value<'gc>( |
| 39 | ctx: Context<'gc>, |
| 40 | row: &sqlx::postgres::PgRow, |
| 41 | i: usize, |
| 42 | type_info: &sqlx::postgres::PgTypeInfo, |
| 43 | ) -> Result<Value<'gc>, VmError> { |
| 44 | // Handle NULL values first |
| 45 | if row.try_get_raw(i).map_or(true, |v| v.is_null()) { |
| 46 | return Ok(Value::Nil); |
| 47 | } |
| 48 | |
| 49 | let value = match type_info.name() { |
| 50 | // Integer types |
| 51 | "INT2" | "SMALLINT" => row.try_get::<i16, _>(i).map(|v| Value::Number(v as f64)), |
| 52 | "INT4" | "INTEGER" => row.try_get::<i32, _>(i).map(|v| Value::Number(v as f64)), |
| 53 | "INT8" | "BIGINT" => row.try_get::<i64, _>(i).map(|v| Value::Number(v as f64)), |
| 54 | |
| 55 | // Serial types (same as integer types) |
| 56 | "SERIAL2" | "SMALLSERIAL" => row.try_get::<i16, _>(i).map(|v| Value::Number(v as f64)), |
| 57 | "SERIAL4" | "SERIAL" => row.try_get::<i32, _>(i).map(|v| Value::Number(v as f64)), |
| 58 | "SERIAL8" | "BIGSERIAL" => row.try_get::<i64, _>(i).map(|v| Value::Number(v as f64)), |
| 59 | |
| 60 | // Floating-point types |
| 61 | "FLOAT4" | "REAL" => row.try_get::<f32, _>(i).map(|v| Value::Number(v as f64)), |
| 62 | "FLOAT8" | "DOUBLE PRECISION" => row.try_get::<f64, _>(i).map(Value::Number), |
| 63 | |
| 64 | // Decimal/numeric types |
| 65 | // "NUMERIC" | "DECIMAL" => row |
| 66 | // .try_get::<sqlx::types::Decimal, _>(i) |
| 67 | // .map(|v| Value::Number(v.to_string().parse::<f64>().unwrap_or(0.0))), |
| 68 | |
| 69 | // Character types |
| 70 | "VARCHAR" | "CHAR" | "TEXT" | "BPCHAR" | "NAME" => row |
| 71 | .try_get::<String, _>(i) |
| 72 | .map(|v| Value::String(ctx.intern(v.as_bytes()))), |
| 73 | |
| 74 | // Boolean type |
| 75 | "BOOL" | "BOOLEAN" => row.try_get::<bool, _>(i).map(Value::Boolean), |
| 76 | |
| 77 | // UUID type |
| 78 | "UUID" => row |
| 79 | .try_get::<sqlx::types::Uuid, _>(i) |
| 80 | .map(|v| Value::String(ctx.intern(v.to_string().as_bytes()))), |
| 81 | |
| 82 | // Date/Time types |
| 83 | "DATE" => row |
| 84 | .try_get::<sqlx::types::chrono::NaiveDate, _>(i) |
| 85 | .map(|v| Value::String(ctx.intern(v.to_string().as_bytes()))), |
| 86 | "TIME" => row |
| 87 | .try_get::<sqlx::types::chrono::NaiveTime, _>(i) |
| 88 | .map(|v| Value::String(ctx.intern(v.to_string().as_bytes()))), |
| 89 | "TIMESTAMP" => row |
| 90 | .try_get::<sqlx::types::chrono::NaiveDateTime, _>(i) |
| 91 | .map(|v| Value::String(ctx.intern(v.to_string().as_bytes()))), |
| 92 | "TIMESTAMPTZ" => row |
| 93 | .try_get::<sqlx::types::chrono::DateTime<sqlx::types::chrono::Utc>, _>(i) |
| 94 | .map(|v| Value::String(ctx.intern(v.to_string().as_bytes()))), |
| 95 |
no test coverage detected