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