hk_sql_utils.anubis 3.64 KB
/*
 * Created by PyramIDE.
 * User: フランスのトトロ aka (David RENÉ) 
 * Date: 02/04/2017
 * Time: 19:23
 * © Calexium 
 */

read data_base/sqlite.anubis
read calexium_lib/database/db_utils.anubis
read hayamiki_lib/types/hayamiki.anubis

public define String
  referer_to_sql_clause
  (
    HK_Referer    referer,
    String        table_name,
    List(String)  table_columns
  )=
  if referer is
  {
    no_referer                                                     then " (1 = 1) ",
    hk_referer(referer_table, referer_row_id, fk_table, fk_column) then
      if referer_table = table_name then
        "id = " +referer_row_id
      else if fk_column:table_columns then
        fk_column + " = " + referer_row_id
      else
        " (1 = 1) ",
  }
.

public define Maybe(One)
  delete_from_ids
  (
    SQLite3DataBase db,
    String          table_name,    
    List(Int)       ids
  )=
  if sql_query_timeout(db,
        "DELETE FROM "+table_name+
        " WHERE id IN ("+join(", ", to_List_String(ids))+");",
         [],
        "delete_from_ids") is
  {
    error(_)    then failure,
    ok(_, _, _) then success(unique)
  }.
  
public define Int
  get_count_by_clause
  (
    SQLite3DataBase db,
    String          table_name,
    String          clause
  )=
  with final_clause = if clause = "" then
                         ""
                      else
                        "WHERE "+clause,

  if sql_query_timeout(db, "SELECT COUNT(\"id\") FROM "+table_name+" "+final_clause+";", [], "get_count_by_clause") is
  {
    error(_)         then 0,
    ok(_, cursor, _) then db_get_integer(cursor)
  }
.

public define Int
  get_count
  (
    SQLite3DataBase db,
    String          table_name
  )=
  get_count_by_clause(db, table_name, "")
.


public define List(Int)
  get_ids_by_clause
  (
    SQLite3DataBase db,
    String          table_name,
    String          clause
  )=
  with final_clause = if clause = "" then
                         ""
                      else
                        "WHERE "+clause,

  if sql_query_timeout(db, "SELECT \"id\" FROM "+table_name+" "+final_clause+";", [], "get_ids_by_clause") is
  {
    error(_)         then [],
    ok(_, cursor, _) then db_get_integer_list(cursor)
  }
.

public define Maybe(Int)
  insert_or_update
  (
    SQLite3DataBase             db,
    String                      table_name,
    DB_id                       db_id,
    List(SQLite3_update_field)  fields
  )=
  if db_id is
  {
    none then
      since make_insert_clause_and_binds(fields) is (binds, insert_columns, insert_values),
      if sql_query_timeout(db, "INSERT INTO "+table_name+" "+insert_columns+" VALUES "+insert_values+";", binds, table_name+" (INSERT)") is
      {
        error(sql_error)  then 
          //logError(debug_log, db_error(sql_error, table_name));
          failure,
        ok(_, cursor, _)  then 
          if sql_query_scalar(db, "SELECT last_insert_rowid()") is
          {
            error(_)  then  failure,
            ok(datum) then  
              with result1 = if datum is integer(n) then n else 0,
              println(table_name+" inserted id ["+result1+"]");
              success(result1)
          }
//    SQLite3DataBase        db, 
//    String                 sql_command
//  )        
//        success(unique)
      },
    db_id(idx) then
      since make_update_clause_and_binds(fields) is (binds, set_string),
      if sql_query_timeout(db, "UPDATE "+table_name+" SET "+set_string +" WHERE id = "+idx+";", binds, table_name+" (UPDATE)") is
      {
        error(sql_error) then 
          //logError(debug_log, db_error(sql_error, table_name));
          failure,
        ok(_, _, _)      then success(idx)
      }
  }
.