db_utils.anubis 4.98 KB
/*
 * 
 * User: David RENE
 * Date: 11/12/2007
 * Time: 01:16
 * (c) Calexium
 *
 */

read tools/basis.anubis
read system/logger.anubis
read data_base/sqlite.anubis

read calexium_lib/net_services_protocols/logger_service.anubis

public define Result(SQLite3Error, One)
  sql_transaction
  (
    SQLite3DataBase db, 
    String          sql_command,
    String          message
  ) =
//  logDebug(debug_log, "Entering into transaction [" + message + "].");
  if db_do_transaction(
        db,
        (One _) |->
          if sql_query(db, sql_command) is
          {
            error(err)  then logError("DB", db_error(err,message));failure  //error in the SQL request
            ok(cursor)  then success(unique)
          }, 
        success( (SQLite3Error err) |-> logError("DB", db_error(err,message))),
        60000,   // max 60s
        100      // retry every 100 ms 
      ) is
  {
    error(err_and_result) then 
//      logDebug(debug_log, "Exiting from transaction [" + message + "] with error.");
      if err_and_result is (err, mb_result) then
        error(err),
    ok(_)                 then 
//      logDebug(debug_log, "Exiting from transaction [" + message + "].");
      ok(unique)
  }.
  
 

public define SQLite3QueryResult
  sql_query_timeout
  (
    SQLite3DataBase   db,         //database handle
    String            sql_query,  //sql query itself
    List(SQLite3Bind) initial_bindings,
    String            msg         //message to be shown if an error occure
  ) =
  //we try with 30 sec of timeout
  if sql_query_timeout(db, sql_query, initial_bindings, 60, 100) is 
  {
    error(sql_error)  then  logError("DB", db_error(sql_error,msg)); error(sql_error),
    ok(headers, cursor, reset) then ok(headers, cursor, reset)
  }.

// deprecated. Use one of the previous ones.
public define Maybe(SQLite3HeadersOrRow -> SQLite3Row)
  sql_query_timeout
  (
    SQLite3DataBase db,         //database handle
    String          sql_query,  //sql query itself
    String          msg         //message to be shown if an error occure
  ) =
  //we try with 30 sec of timeout
  if sql_query_timeout(db, sql_query, [], 60, 100) is 
  {
    error(sql_error)  then  logError("DB", db_error(sql_error,msg));failure,
    ok(headers, cursor, reset) then  
      success((SQLite3HeadersOrRow h_or_r) |-> if h_or_r is
                                               {
                                                  headers then 
                                                    with cols = map((String c) |-> (SQLite3Datum)text(c), headers(unique)),
                                                    row((Int n) |-> force(nth(n, cols), no_such_column)),
                                                  next_row then cursor(unique)
                                               })
  }.

// -- Extractors HELPERS ---------------

public define List(String) 
  db_get_string_list
  ( 
    One -> SQLite3Row table_cursor,
    List(String)      so_far
  ) =
  if table_cursor(unique) is
  {
    error(sql_error)  then logError("DB", db_error(sql_error, "db_get_string_list")); reverse(so_far),
    no_more_row       then reverse(so_far),    //can't find the symbol in the table, because the row is empty
    row(explorer)     then 
      with s = text(explorer)(0),
      db_get_string_list(table_cursor, [s . so_far])
 }.
 
// Old sqlite3 API
public define List(String) 
  db_get_string_list
  ( 
    SQLite3HeadersOrRow -> SQLite3Row table_cursor,
    List(String)                      so_far
  ) =
  if table_cursor(next_row) is
  {
    error(sql_error)  then logError("DB", db_error(sql_error, "db_get_string_list")); reverse(so_far),
    no_more_row       then reverse(so_far),    //can't find the symbol in the table, because the row is empty
    row(explorer)     then 
      with s = text(explorer)(0),
      db_get_string_list(table_cursor, [s . so_far])
 }.

public define List(Int) 
  db_get_integer_list
  ( 
    SQLite3HeadersOrRow -> SQLite3Row table_cursor,
    List(Int)                       so_far
  ) =
  if table_cursor(next_row) is
  {
    error(sql_error)  then logError("DB", db_error(sql_error, "db_get_integer_list")); reverse(so_far),
    no_more_row       then reverse(so_far),    //can't find the symbol in the table, because the row is empty
    row(explorer)     then 
      with s = (Int)db_integer(explorer)(0),
      db_get_integer_list(table_cursor, [s . so_far])
 }.
 
 
public define List(Int) 
  db_get_integer_list
  ( 
    One -> SQLite3Row   table_cursor,
    List(Int)           so_far
  ) =
  if table_cursor(unique) is
  {
    error(sql_error)  then logError("DB", db_error(sql_error, "db_get_integer_list")); reverse(so_far),
    no_more_row       then reverse(so_far),    //can't find the symbol in the table, because the row is empty
    row(explorer)     then 
      with s = (Int)db_integer(explorer)(0),
      db_get_integer_list(table_cursor, [s . so_far])
 }.