// Generated by moonorm sql from models.mbt. Edit those files, not this one.

///|
fn adults(db : &@moondb.Driver, age : Int32) -> Array[User] raise {
  let rows = db.query(
    "SELECT id, name, age FROM user WHERE age > ?", [
      @moondb.ToValue::to_value(age),
    ],
  )
  rows.map(
    row => {
      id: @mapper.column(row, "id"),
      name: @mapper.column(row, "name"),
      age: @mapper.column(row, "age"),
    },
  )
}

///|
fn find(db : &@moondb.Driver, id : Int64) -> User? raise {
  let rows = db.query(
    "SELECT id, name, age FROM user WHERE id = ?", [
      @moondb.ToValue::to_value(id),
    ],
  )
  match @mapper.optional(rows) {
    Some(row) => {
      Some(
        {
          id: @mapper.column(row, "id"),
          name: @mapper.column(row, "name"),
          age: @mapper.column(row, "age"),
        },
      )
    }
    None => None
  }
}

///|
fn total(db : &@moondb.Driver) -> Int64 raise {
  let rows = db.query("SELECT count(*) FROM user", [])
  let row = @mapper.one(rows)
  @mapper.first(row)
}

///|
fn renamed(db : &@moondb.Driver) -> Array[User] raise {
  let rows = db.query("SELECT id, name AS user_name, age FROM user", [])
  rows.map(
    row => {
      id: @mapper.column(row, "id"),
      name: @mapper.column(row, "user_name"),
      age: @mapper.column(row, "age"),
    },
  )
}

///|
fn add(db : &@moondb.Driver, u : User) -> Int64 raise {
  let result = db.execute(
    "INSERT INTO user(name, age) VALUES(?, ?)", [
      @moondb.ToValue::to_value(u.name),
      @moondb.ToValue::to_value(u.age),
    ],
  )
  result.last_insert_id
}

///|
fn add_returning(db : &@moondb.Driver, u : User) -> Int64 raise {
  let rows = db.query(
    "INSERT INTO user(name, age) VALUES($1, $2) RETURNING id", [
      @moondb.ToValue::to_value(u.name),
      @moondb.ToValue::to_value(u.age),
    ],
  )
  let row = @mapper.one(rows)
  @mapper.first(row)
}

///|
fn set_age(db : &@moondb.Driver, id : Int64, age : Int32) -> Int64 raise {
  let result = db.execute(
    "UPDATE user SET age = ? WHERE id = ?", [
      @moondb.ToValue::to_value(age),
      @moondb.ToValue::to_value(id),
    ],
  )
  result.rows_affected
}

///|
fn remove(db : &@moondb.Driver, id : Int64) -> Unit raise {
  let result = 
    db.execute("DELETE FROM user WHERE id = ?", [@moondb.ToValue::to_value(id)])
  ignore(result)
}