SQLite Counter



examples/sqlite/counter/src/main.rs
//use sqlite::{State, Value};
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let filename = "counter.db";

    let exists = std::path::Path::new(filename).exists();

    let connection = sqlite::open(filename).unwrap();
    if !exists {
        let query = "CREATE TABLE counter (name TEXT, cnt INTEGER);";
        connection.execute(query).unwrap();
    }

    if args.len() == 2 {
        let name = &args[1];
        let mut cnt = 0;
        let query = "SELECT * FROM counter WHERE name = :name";
        let mut statement = connection.prepare(query).unwrap();
        statement
            .bind::<&[(_, sqlite::Value)]>(&[(":name", sqlite::Value::String(name.into()))])
            .unwrap();

        let mut insert = true;

        if let Ok(sqlite::State::Row) = statement.next() {
            //println!("{} = {}", name, statement.read::<String, _>("cnt").unwrap());
            cnt = statement.read::<String, _>("cnt").unwrap().parse().unwrap();
            insert = false;
        }

        cnt += 1;

        if insert {
            let mut insert_statement = connection
                .prepare("INSERT INTO counter VALUES (:name, :cnt);")
                .unwrap();

            match insert_statement.bind_iter::<_, (_, sqlite::Value)>([
                (":name", sqlite::Value::String(name.into())),
                (":cnt", sqlite::Value::Integer(cnt)),
            ]) {
                Ok(val) => println!("{:?}", val),
                Err(err) => println!("{}", err),
            }
            let _ = insert_statement.next();
        } else {
            let mut update_statement = connection
                .prepare("UPDATE counter SET cnt = :cnt WHERE name = :name;")
                .unwrap();

            match update_statement.bind_iter::<_, (_, sqlite::Value)>([
                (":cnt", sqlite::Value::Integer(cnt)),
                (":name", sqlite::Value::String(name.into())),
            ]) {
                Ok(val) => println!("{:?}", val),
                Err(err) => println!("{}", err),
            }
            let _ = update_statement.next();
        }
    }

    if args.len() == 1 {
        let query = "SELECT * FROM counter";
        let mut statement = connection.prepare(query).unwrap();

        while let Ok(sqlite::State::Row) = statement.next() {
            println!(
                "{} = {}",
                statement.read::<String, _>("name").unwrap(),
                statement.read::<String, _>("cnt").unwrap()
            );
        }
    }
}