MCPcopy Create free account
hub / github.com/f0rr0/oliphaunt / format_query

Function format_query

src/pglite/templating.rs:61–109  ·  view source on GitHub ↗
(pg: &mut Pglite, query: &str, params: &[Value])

Source from the content-addressed store, hash-verified

59}
60
61pub fn format_query(pg: &mut Pglite, query: &str, params: &[Value]) -> Result<String> {
62 if params.is_empty() {
63 return Ok(query.to_string());
64 }
65
66 let described = pg.describe_query(query, None)?;
67 let data_type_ids = described
68 .query_params
69 .iter()
70 .map(|param| param.data_type_id)
71 .collect::<Vec<_>>();
72
73 let formatted = DOLLAR_RE
74 .replace_all(query, |caps: &regex::Captures| format!("%{}L", &caps[1]))
75 .to_string();
76
77 let mut sql = String::from("SELECT format($1");
78 for idx in 0..params.len() {
79 sql.push_str(", $");
80 sql.push_str(&(idx as i32 + 2).to_string());
81 }
82 sql.push_str(") AS query");
83
84 let mut arguments: Vec<Value> = Vec::with_capacity(params.len() + 1);
85 arguments.push(Value::String(formatted));
86 arguments.extend(params.iter().cloned());
87
88 let mut param_types = Vec::with_capacity(arguments.len());
89 param_types.push(TEXT);
90 param_types
91 .extend((0..params.len()).map(|idx| data_type_ids.get(idx).copied().unwrap_or(TEXT)));
92 let options = QueryOptions {
93 param_types,
94 ..QueryOptions::default()
95 };
96
97 let results = pg.query(&sql, &arguments, Some(&options))?;
98 let row = results
99 .rows
100 .first()
101 .ok_or_else(|| anyhow!("format query returned no rows"))?;
102 if let Value::Object(map) = row
103 && let Some(Value::String(formatted)) = map.get("query")
104 {
105 return Ok(formatted.clone());
106 }
107
108 Err(anyhow!("unexpected format query result"))
109}
110
111#[cfg(test)]
112mod tests {

Callers 1

runtime_smokeFunction · 0.85

Calls 5

describe_queryMethod · 0.80
iterMethod · 0.80
lenMethod · 0.80
pushMethod · 0.80
queryMethod · 0.45

Tested by 1

runtime_smokeFunction · 0.68