MCPcopy Create free account
hub / github.com/aiscriptdev/aiscript / column_to_value

Function column_to_value

aiscript-vm/src/stdlib/db/pg.rs:38–179  ·  view source on GitHub ↗
(
    ctx: Context<'gc>,
    row: &sqlx::postgres::PgRow,
    i: usize,
    type_info: &sqlx::postgres::PgTypeInfo,
)

Source from the content-addressed store, hash-verified

36}
37
38fn 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

Callers 2

row_to_objectFunction · 0.70
execute_typed_queryFunction · 0.70

Calls 3

as_bytesMethod · 0.80
nameMethod · 0.45
internMethod · 0.45

Tested by

no test coverage detected