db_utils.anubis 3.5 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
read NetBox_types.anubis

define Result(SQLite3Error, SQLite3HeadersOrRow -> SQLite3Row)
  sql_query_timeout
  (
    SQLite3DataBase  db, 
    String           sql_command,
    Int            timeout
  ) =
  
  if sql_query(db, sql_command) is
  {
    error(sql_error)  then (
      if (sql_error.code /= 1 & sql_error.code /= 5 & sql_error.code /= 6) | now > timeout  then  
        error(sql_error)
      else
        (
          if sql_error.code = 5 then
            unique
          else
            print_db_error(sql_error)
        );
        sleep(100);
        sql_query_timeout(db, sql_command, timeout)),
    ok(cursor)        then ok(cursor)
  }.
   
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 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, now + 60) is 
  {
    error(sql_error)  then  logError("DB", db_error(sql_error,msg));failure,
    ok(cursor)        then  success(cursor) 
  }.

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

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