hk_sql_utils.anubis 5.51 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
transmit hayamiki_lib/controller/hk_controller.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 List(Int)
  get_ids_by_clause
  (
    SQLite3DataBase db,
    String          table_name,
    String          id_col,
    String          clause
  )=
  with final_clause = if clause = "" then
                         ""
                      else
                        "WHERE "+clause,

  if sql_query_timeout(db, "SELECT \""+id_col+"\" FROM "+table_name+" "+final_clause+";", [], "get_ids_by_clause") is
  {
    error(_)         then [],
    ok(_, cursor, _) then db_get_integer_list(cursor)
  }
.
     relation_table
     id = id of that relation
     source_id = id of the first record in relation
     target_id = id of the second record in relation
     
     for example we search the all record targeted by source id
     
     relation_id | source_id | target_id
     -----------------------------------
     0           | 1         | 1
     1           | 1         | 2
     2           | 1         | 4
     3           | 0         | 2
     
     if we want to get all relation from source matching with id 1 we will get a list of ids [1, 2, 4]
     

public define List($T)
  get_relation
  (
    SQLite3DataBase db,
    String  relation_table,
    String  relation_source_id_col,
    String  relation_target_id_col,
    String  relation_condition,       //only the right part atfer = in SQL format. This means the SQL query will be constructed with "relation_source_id_col = " relation_condition
    String  foreign_order,
    (SQLite3DataBase db, String clause) -> List($T)       get_all_by_clause_to_list_type
  )=
  //get 
  with ids = get_ids_by_clause(db, relation_table, relation_target_id_col, relation_source_id_col+" = "+relation_condition),
  if length(ids) = 0 then 
    []
  else
    with the_clause = " id IN ("+join(", ", to_List_String(ids))+") "+foreign_order,
    get_all_by_clause_to_list_type(db, the_clause)
.

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)
      }
  }
.