hecate 0.62.0

OpenStreetMap Inspired Data Storage Backend Focused on Performance and GeoJSON Interchange
use err::HecateError;

pub fn list(conn: &r2d2::PooledConnection<r2d2_postgres::PostgresConnectionManager>) -> Result<Vec<String>, HecateError> {
    match conn.query("
        SELECT key FROM meta ORDER BY key
    ", &[ ]) {
        Ok(rows) => {
            let mut names = Vec::<String>::new();

            for row in rows.iter() {
                names.push(row.get(0));
            }

            Ok(names)
        },
        Err(err) => Err(HecateError::from_db(err))
    }
}

pub fn get(conn: &r2d2::PooledConnection<r2d2_postgres::PostgresConnectionManager>, key: &String) -> Result<serde_json::Value, HecateError> {
    match conn.query("
        SELECT value::JSON FROM meta WHERE key = $1;
    ", &[ &key ]) {
        Ok(rows) => {
            if rows.len() == 0 {
                Ok(json!(null))
            } else {
                Ok(rows.get(0).get(0))
            }
        },
        Err(err) => Err(HecateError::from_db(err))
    }
}

pub fn set(conn: &r2d2::PooledConnection<r2d2_postgres::PostgresConnectionManager>, key: &String, value: &serde_json::Value) -> Result<bool, HecateError> {
    match conn.query("
        INSERT INTO meta (key, value) VALUES ($1, $2)
            ON CONFLICT (key) DO
                UPDATE
                    SET value = $2
                    WHERE meta.key = $1
    ", &[ &key, &value ]) {
        Ok(_) => Ok(true),
        Err(err) => Err(HecateError::from_db(err))
    }
}

pub fn delete(conn: &r2d2::PooledConnection<r2d2_postgres::PostgresConnectionManager>, key: &String) -> Result<bool, HecateError> {
    match conn.query("
        DELETE FROM meta WHERE key = $1
    ", &[ &key ]) {
        Ok(_) => Ok(true),
        Err(err) => Err(HecateError::from_db(err))
    }
}