Changeset 73da9daaa0c2bbf2116a51186a27efaa4618d41d

Show
Ignore:
Timestamp:
09/29/11 00:27:38 (8 months ago)
Author:
Neutron Soutmun <neo.neutron@…>
Children:
dc6cdce2418f218dcb7797fb6efecfe424d83b0d
Parents:
3b60405304d9d393a2ed0d36f9e43f539f961c44
git-committer:
Neutron Soutmun <neo.neutron@…> (09/29/11 00:27:38)
Message:

Switch to sqlite3 native API

  • configure.ac:
    • Drop libgda check.
    • Add libsqlite3 check.
  • src/Makefile.am:
    • Drop libgda cflags/libs.
    • Add libsqlite3 cflags/libs.
    • Rename RAHUNAS_DB_DIR to RAHUNAS_DB which now declare the fullpath to db file.
  • src/rh-task-dbset.c, src/rh-task-serviceclass.c:
    • Migrate to libsqlite3 native API.
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • configure.ac

    rcb53713 r73da9da  
    2929AC_SUBST(LIBGNET_LIBS) 
    3030 
    31 dnl Check for LibGDA 4.x 
    32 LIBGDA_REQ=4.0 
    33 PKG_CHECK_MODULES(LIBGDA, [ libgda-4.0 >= $LIBGDA_REQ ], , [ AC_MSG_ERROR([LibGDA is required]) ]) 
     31dnl Check for Sqlite3 
     32LIBSQLITE3_REQ=3.7.3 
     33PKG_CHECK_MODULES(LIBSQLITE3, [ sqlite3 >= $LIBSQLITE3_REQ ], , [ AC_MSG_ERROR([libsqlite3 is required]) ]) 
    3434 
    35 AC_SUBST(LIBGDA_CFLAGS) 
    36 AC_SUBST(LIBGDA_LIBS) 
     35AC_SUBST(LIBSQLITE3_CFLAGS) 
     36AC_SUBST(LIBSQLITE3_LIBS) 
    3737 
    3838# Checks for header files. 
  • src/Makefile.am

    r4b5d05b r73da9da  
    77AM_CFLAGS = \ 
    88  $(LIBGNET_CFLAGS) \ 
    9   $(LIBGDA_CFLAGS) \ 
     9  $(LIBSQLITE3_CFLAGS) \ 
    1010  -I$(top_srcdir)/src/ \ 
    1111  -DRAHUNAS_VERSION=\"$(RAHUNAS_VERSION)\" \ 
     
    1313  -DIPSET_VERSION=\"$(IPSET_VERSION)\" \ 
    1414  -DRAHUNAS_CONF_DIR=\"$(sysconfdir)/rahunas/\" \ 
    15   -DRAHUNAS_DB_DIR=\"$(localstatedir)/lib/rahunas/\" \ 
     15  -DRAHUNAS_DB=\"$(localstatedir)/lib/rahunas/rahunas.db\" \ 
    1616  -DRAHUNAS_LOG_DIR=\"$(localstatedir)/log/rahunas/\" \ 
    1717  -DRAHUNAS_RUN_DIR=\"$(localstatedir)/run/\" \ 
     
    6262  $(top_builddir)/lcfg/liblcfg.a \ 
    6363  $(LIBGNET_LIBS) \ 
    64   $(LIBGDA_LIBS) 
     64  $(LIBSQLITE3_LIBS) 
  • src/rh-task-dbset.c

    rcb53713 r73da9da  
    99#include <time.h> 
    1010#include <string.h> 
    11 #include <libgda/libgda.h> 
     11#include <sqlite3.h> 
    1212#include "rahunasd.h" 
    1313#include "rh-task.h" 
     
    1515#include "rh-utils.h" 
    1616#include "rh-task-memset.h" 
     17 
     18#define COLNAME_MATCH(a, b) (strncmp(a, b, strlen(a)) == 0) 
    1719 
    1820struct dbset_row { 
     
    3133}; 
    3234 
    33 gboolean get_errors (GdaConnection * connection) 
    34 { 
    35   GList *list; 
    36   GList *node; 
    37   GdaConnectionEvent *error; 
    38  
    39   list = (GList *) gda_connection_get_events(connection); 
    40  
    41   for (node = g_list_first(list); node != NULL; node = g_list_next(node)) { 
    42     error = (GdaConnectionEvent *) node->data; 
    43     logmsg(RH_LOG_NORMAL, "DB Error no: %d",  
    44              gda_connection_event_get_code(error)); 
    45     logmsg(RH_LOG_NORMAL, "DB Desc: %s",  
    46              gda_connection_event_get_description(error)); 
    47     logmsg(RH_LOG_NORMAL, "DB Source: %s",  
    48              gda_connection_event_get_source(error)); 
    49     logmsg(RH_LOG_NORMAL, "DB SQL State: %s",  
    50              gda_connection_event_get_sqlstate(error)); 
    51   } 
    52 } 
    53  
    54 gboolean 
    55 parse_dm_to_struct(GList **data_list, GdaDataModel *dm) { 
    56   gint  row_id; 
    57   gint  column_id; 
    58   const GValue *value; 
    59   gchar  *str; 
    60   const gchar  *title; 
    61   GdaNumeric *num; 
    62   struct dbset_row *row; 
    63   struct tm tm; 
    64   time_t time; 
    65  
    66   char tmp[80]; 
    67  
    68   for (row_id = 0; row_id < gda_data_model_get_n_rows(dm); row_id++) { 
    69     row = (struct dbset_row *)g_malloc(sizeof(struct dbset_row)); 
    70     if (row == NULL) { 
    71       /* Do implement the row list cleanup */ 
    72     } 
    73  
    74     *data_list = g_list_append(*data_list, row);  
    75  
    76     for (column_id = 0; column_id < gda_data_model_get_n_columns(dm);  
    77            column_id++) { 
    78  
    79       title = gda_data_model_get_column_title(dm, column_id); 
    80       value = gda_data_model_get_value_at (dm, column_id, row_id, NULL); 
    81       str = gda_value_stringify(value); 
    82                 
    83       if (strncmp("session_id", title, 10) == 0) { 
    84         row->session_id = g_strdup(str); 
    85       } else if (strncmp("vserver_id", title, 10) == 0) { 
    86         row->vserver_id = g_strdup(str); 
    87       } else if (strncmp("username", title, 8) == 0) { 
    88         row->username = g_strdup(str); 
    89       } else if (strncmp("ip", title, 2) == 0) { 
    90         row->ip = g_strdup(str); 
    91       } else if (strncmp("mac", title, 3) == 0) { 
    92         row->mac = g_strdup(str); 
    93       } else if (strncmp("session_start", title, 13) == 0) { 
    94         strptime(str, "%s", &tm); 
    95         time = mktime(&tm); 
    96         memcpy(&row->session_start, &time, sizeof(time_t)); 
    97       } else if (strncmp("session_timeout", title, 15) == 0) { 
    98         strptime(str, "%s", &tm); 
    99         time = mktime(&tm); 
    100         memcpy(&row->session_timeout, &time, sizeof(time_t)); 
    101       } else if (strncmp("bandwidth_slot_id", title, 17) == 0) { 
    102         row->bandwidth_slot_id = atoi(str); 
    103       } else if (strncmp("bandwidth_max_down", title, 18) == 0) { 
    104         row->bandwidth_max_down = atol(str); 
    105       } else if (strncmp("bandwidth_max_up", title, 18) == 0) { 
    106         row->bandwidth_max_up = atol(str); 
    107       } else if (strncmp("service_class_slot_id", title, 
    108                          strlen("service_class_slot_id")) == 0) { 
    109           row->service_class_slot_id = atol(str); 
    110       } else if (strncmp("service_class", title, 
    111                          strlen("service_class")) == 0) { 
    112           row->service_class = g_strdup(str); 
     35static void 
     36free_dbset_row (struct dbset_row *row) 
     37{ 
     38  if (!row) 
     39    return; 
     40 
     41  g_free (row->session_id); 
     42  g_free (row->vserver_id); 
     43  g_free (row->username); 
     44  g_free (row->ip); 
     45  g_free (row->mac); 
     46  g_free (row->service_class); 
     47} 
     48 
     49static sqlite3 * 
     50openconn (void) 
     51{ 
     52  sqlite3 *connection = NULL; 
     53  int  rc; 
     54 
     55  rc = sqlite3_open (RAHUNAS_DB, &connection); 
     56  if (rc) { 
     57    logmsg (RH_LOG_ERROR, "Task DBSET: could not open database, %s", 
     58            sqlite3_errmsg (connection)); 
     59    sqlite3_close (connection); 
     60    connection = NULL; 
     61  } 
     62 
     63  return connection; 
     64} 
     65 
     66static void 
     67closeconn (sqlite3 *connection) 
     68{ 
     69  if (connection) 
     70    sqlite3_close (connection); 
     71} 
     72 
     73static int 
     74sql_execute_cb (void *NotUsed, int argc, char **argv, char **azColName) 
     75{ 
     76  /* Do nothing */ 
     77  return 0; 
     78} 
     79 
     80static int 
     81sql_execute (const char *sql) 
     82{ 
     83  sqlite3 *connection = NULL; 
     84  char *zErrMsg       = NULL; 
     85  int rc; 
     86 
     87  if (!sql) 
     88    return -1; 
     89 
     90  connection = openconn (); 
     91  if (!connection) 
     92    return -1; 
     93 
     94  rc = sqlite3_exec (connection, sql, sql_execute_cb, 0, &zErrMsg); 
     95  if (rc != SQLITE_OK) { 
     96    logmsg (RH_LOG_ERROR, "Task DBSET: could not execute sql (%s)", zErrMsg); 
     97    sqlite3_free (zErrMsg); 
     98  } 
     99 
     100  closeconn (connection); 
     101  return rc; 
     102} 
     103 
     104 
     105static int 
     106restore_set (RHVServer *vs) 
     107{ 
     108  sqlite3 *connection = NULL; 
     109  char sql[256]; 
     110  int  rc; 
     111  char **azResult = NULL; 
     112  char *zErrMsg   = NULL; 
     113  char *colname   = NULL; 
     114  char *value     = NULL; 
     115  int  nRow       = 0; 
     116  int  nColumn    = 0; 
     117  int  rowOffset  = 1; 
     118  int  i          = 0; 
     119 
     120  if (!vs) 
     121    return -1; 
     122 
     123  connection = openconn (); 
     124 
     125  if (!connection) 
     126    return -1; 
     127  
     128  DP("Get data from DB if exist"); 
     129  snprintf(sql, sizeof (sql) - 1, 
     130           "SELECT * FROM dbset WHERE vserver_id='%d'", 
     131           vs->vserver_config->vserver_id); 
     132  sql[sizeof (sql) - 1] = '\0'; 
     133 
     134  DP("SQL: %s", sql); 
     135 
     136  rc = sqlite3_get_table (connection, sql, &azResult, &nRow, &nColumn, 
     137                          &zErrMsg); 
     138  if (rc != SQLITE_OK) { 
     139    logmsg (RH_LOG_ERROR, "[%s] Task DBSET: could not get data (%s)", 
     140                          vs->vserver_config->vserver_name, zErrMsg); 
     141    sqlite3_free (zErrMsg); 
     142    closeconn (connection); 
     143    return -1; 
     144  } 
     145 
     146  while (rowOffset < (nRow + 1)) { 
     147    struct dbset_row row; 
     148    uint32_t id; 
     149    struct task_req req; 
     150    unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0}; 
     151    struct tm tm; 
     152    time_t time; 
     153 
     154    /* Fetch row data */ 
     155    for (i = 0; i < nColumn; i++) { 
     156      colname = azResult[i]; 
     157      value = azResult[(rowOffset * nColumn) + i]; 
     158 
     159      DP ("Row: %s = %s", colname, value); 
     160 
     161      if (COLNAME_MATCH ("session_id", colname)) { 
     162        row.session_id = g_strdup (value); 
     163      } else if (COLNAME_MATCH ("vserver_id", colname)) { 
     164        row.vserver_id = g_strdup (value); 
     165      } else if (COLNAME_MATCH ("username", colname)) { 
     166        row.username = g_strdup (value); 
     167      } else if (COLNAME_MATCH ("ip", colname)) { 
     168        row.ip = g_strdup (value); 
     169      } else if (COLNAME_MATCH ("mac", colname)) { 
     170        row.mac = g_strdup (value); 
     171      } else if (COLNAME_MATCH ("session_start", colname)) { 
     172        strptime (value, "%s", &tm); 
     173        time = mktime (&tm); 
     174        memcpy (&row.session_start, &time, sizeof (time_t)); 
     175      } else if (COLNAME_MATCH ("session_timeout", colname)) { 
     176        strptime (value, "%s", &tm); 
     177        time = mktime (&tm); 
     178        memcpy (&row.session_timeout, &time, sizeof (time_t)); 
     179      } else if (COLNAME_MATCH ("bandwidth_slot_id", colname)) { 
     180        row.bandwidth_slot_id = atoi (value); 
     181      } else if (COLNAME_MATCH ("bandwidth_max_down", colname)) { 
     182        row.bandwidth_max_down = atol (value); 
     183      } else if (COLNAME_MATCH ("bandwidth_max_up", colname)) { 
     184        row.bandwidth_max_up = atol (value); 
     185      } else if (COLNAME_MATCH ("service_class_slot_id", colname)) { 
     186          row.service_class_slot_id = atol (value); 
     187      } else if (COLNAME_MATCH ("service_class", colname)) { 
     188          row.service_class = g_strdup (value); 
    113189      } 
    114190    } 
    115   } 
    116    
    117   return TRUE; 
    118 } 
    119  
    120 GList *execute_sql_command(GdaConnection *connection, const gchar *buffer) 
    121 { 
    122   GdaSqlParser *parser = NULL; 
    123   GdaStatement *stmt   = NULL; 
    124   GdaSet       *params = NULL; 
    125   GList *data_list = NULL; 
    126   GList *list; 
    127   GList *node; 
    128   GdaDataModel *dm; 
    129   gboolean errors = FALSE; 
    130  
    131   parser = g_object_get_data (G_OBJECT (connection), "parser"); 
    132  
    133   stmt = gda_sql_parser_parse_string (parser, buffer, NULL, NULL); 
    134   gda_statement_get_parameters (stmt, &params, NULL); 
    135  
    136   dm = gda_connection_statement_execute_select (connection, stmt, params, NULL); 
    137   if (dm) { 
    138     parse_dm_to_struct (&data_list, dm); 
    139     g_object_unref (dm); 
    140   } 
    141  
    142   if (params) 
    143     g_object_unref (params); 
    144  
    145   if (stmt) 
    146     g_object_unref (stmt); 
    147    
    148   return errors == TRUE ? NULL : data_list; 
    149 } 
    150  
    151 void execute_sql(GdaConnection *connection, const gchar *buffer) 
    152 { 
    153   GdaSqlParser *parser = NULL; 
    154   GdaStatement *stmt   = NULL; 
    155   GdaSet       *params = NULL; 
    156   gint         res     = 0; 
    157  
    158   parser = g_object_get_data (G_OBJECT (connection), "parser"); 
    159  
    160   stmt = gda_sql_parser_parse_string (parser, buffer, NULL, NULL); 
    161   gda_statement_get_parameters (stmt, &params, NULL); 
    162  
    163   res = gda_connection_statement_execute_non_select (connection, stmt, params, 
    164                                                      NULL, NULL); 
    165   if (params) 
    166     g_object_unref (params); 
    167  
    168   if (stmt) 
    169     g_object_unref (stmt); 
    170 } 
    171  
    172 void list_datasource (void) 
    173 { 
    174   GList *ds_list; 
    175   GList *node; 
    176   GdaDsnInfo *info; 
    177  
    178   info = gda_config_get_dsn_info (PROGRAM); 
    179  
    180   logmsg(RH_LOG_NORMAL, "Datasource: NAME: %s PROVIDER: %s", 
    181          info->name, info->provider); 
    182   logmsg(RH_LOG_NORMAL, "  CNC: %s", info->cnc_string); 
    183   logmsg(RH_LOG_NORMAL, "  DESC: %s", info->description); 
    184 } 
    185  
    186 void free_data_list(GList *data_list) 
    187 { 
    188   GList *node; 
    189   struct dbset_row *row; 
    190  
    191   for (node = g_list_first(data_list); node != NULL;  
    192          node = g_list_next (node)) { 
    193     row = (struct dbset_row *) node->data; 
    194     g_free(row->session_id); 
    195     g_free(row->vserver_id); 
    196     g_free(row->username); 
    197     g_free(row->ip); 
    198     g_free(row->mac); 
    199     g_free(row->service_class); 
    200   } 
    201    
    202   g_list_free (data_list);   
    203 } 
    204  
    205 gboolean restore_set(GList **data_list, RHVServer *vs) 
    206 { 
    207   GList *node = NULL; 
    208   struct dbset_row *row = NULL; 
    209   uint32_t id; 
    210   GList *member_node = NULL; 
    211   struct rahunas_member *member = NULL; 
    212   struct task_req req; 
    213   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0}; 
    214   unsigned char max_try = 3; 
    215   
    216   node = g_list_first(*data_list); 
    217  
    218   if (node == NULL) 
    219     return TRUE; 
    220  
    221   DP("Get data from DB if exist"); 
    222  
    223   for (node; node != NULL; node = g_list_next(node)) { 
    224     row = (struct dbset_row *) node->data; 
    225  
    226     if (atoi(row->vserver_id) != vs->vserver_config->vserver_id) 
    227       continue; 
    228  
    229     id = iptoid(vs->v_map, row->ip); 
     191 
     192    /* Process row data */ 
     193    if (atoi(row.vserver_id) != vs->vserver_config->vserver_id) 
     194      goto skip; 
     195 
     196    id = iptoid (vs->v_map, row.ip); 
    230197 
    231198    if (id < 0) 
    232       continue; 
     199      goto skip; 
    233200 
    234201    req.id = id; 
    235     req.vserver_id = atoi(row->vserver_id); 
    236     req.username = row->username; 
    237     req.session_id = row->session_id; 
    238     parse_mac(row->mac, ethernet); 
     202    req.vserver_id = atoi (row.vserver_id); 
     203    req.username = row.username; 
     204    req.session_id = row.session_id; 
     205    parse_mac(row.mac, ethernet); 
    239206    memcpy(req.mac_address, ethernet, ETH_ALEN); 
    240207 
    241     req.session_start = row->session_start; 
    242     req.session_timeout = row->session_timeout; 
    243  
    244     req.bandwidth_slot_id = row->bandwidth_slot_id; 
    245     req.bandwidth_max_down = row->bandwidth_max_down;  
    246     req.bandwidth_max_up = row->bandwidth_max_up; 
    247  
    248     req.serviceclass_name = row->service_class; 
    249     req.serviceclass_slot_id = row->service_class_slot_id; 
     208    req.session_start = row.session_start; 
     209    req.session_timeout = row.session_timeout; 
     210 
     211    req.bandwidth_slot_id = row.bandwidth_slot_id; 
     212    req.bandwidth_max_down = row.bandwidth_max_down; 
     213    req.bandwidth_max_up = row.bandwidth_max_up; 
     214 
     215    req.serviceclass_name = row.service_class; 
     216    req.serviceclass_slot_id = row.service_class_slot_id; 
    250217 
    251218    rh_task_startsess(vs, &req); 
    252   } 
    253   return TRUE; 
    254 } 
    255  
    256 GdaConnection * 
    257 openconn (GdaConnectionOptions options) 
    258 { 
    259   GdaConnection *connection = NULL; 
    260   GdaSqlParser  *parser = NULL; 
    261   connection = gda_connection_open_from_dsn (PROGRAM, NULL, options, NULL); 
    262  
    263   parser = gda_connection_create_parser (connection); 
    264   if (!parser) { 
    265     parser = gda_sql_parser_new (); 
    266   } 
    267  
    268   g_object_set_data_full (G_OBJECT (connection), "parser", parser, g_object_unref); 
    269  
    270   return connection; 
     219 
     220skip: 
     221    free_dbset_row (&row); 
     222    rowOffset++; 
     223  } 
     224 
     225  sqlite3_free_table (azResult); 
     226  closeconn (connection); 
     227  return 0; 
    271228} 
    272229 
     
    274231static int startservice () 
    275232{ 
    276   GError *error = NULL; 
    277   GdaDsnInfo dsn_info = { 
    278     .name        = PROGRAM, 
    279     .provider    = "SQLite", 
    280     .cnc_string  = "DB_DIR=" RAHUNAS_DB_DIR ";DB_NAME=" DB_NAME, 
    281     .description = "RahuNAS DB Set", 
    282   }; 
     233  sqlite3 *connection = NULL; 
    283234 
    284235  logmsg(RH_LOG_NORMAL, "Task DBSET start.."); 
    285     
    286   gda_init(); 
    287      
    288   if (!gda_config_define_dsn (&dsn_info, &error)) { 
    289     logmsg (RH_LOG_ERROR, "Could not define DSN"); 
    290     g_error_free (error); 
    291   } 
    292  
    293   list_datasource(); 
     236 
     237  /* Test database connection */ 
     238  connection = openconn(); 
     239  if (!connection) { 
     240    return -1; 
     241  } 
     242 
     243  /* Connection successfully connected, just close */ 
     244  closeconn (connection); 
    294245 
    295246  return 0; 
     
    299250static int stopservice  () 
    300251{ 
    301   gda_config_remove_dsn (PROGRAM, NULL); 
     252  /* Do nothing */ 
    302253  return 0; 
    303254} 
     
    306257static void init (RHVServer *vs) 
    307258{ 
    308   GdaConnection *connection; 
    309   GList *data_list; 
    310   GList *node; 
    311   struct dbset_row *row; 
    312   char select_cmd[256]; 
    313  
    314259  if (vs->vserver_config->init_flag == VS_RELOAD) 
    315260    return; 
     
    318263         vs->vserver_config->vserver_name);   
    319264 
    320   connection = openconn (GDA_CONNECTION_OPTIONS_READ_ONLY); 
    321  
    322   snprintf(select_cmd, sizeof (select_cmd),  
    323            "SELECT * FROM dbset WHERE vserver_id='%d'", 
    324            vs->vserver_config->vserver_id); 
    325  
    326   DP("SQL: %s", select_cmd); 
    327  
    328   data_list = execute_sql_command(connection, select_cmd);  
    329  
    330   restore_set(&data_list, vs); 
    331  
    332   free_data_list(data_list); 
    333  
    334   if (connection) 
    335     g_object_unref(G_OBJECT(connection)); 
     265  restore_set(vs); 
    336266} 
    337267 
     
    345275static int startsess (RHVServer *vs, struct task_req *req) 
    346276{ 
    347   GdaConnection *connection; 
    348   gint res; 
    349277  char startsess_cmd[512]; 
    350278  char time_str[32]; 
     
    353281  struct rahunas_member *member = NULL; 
    354282 
    355   connection = openconn (GDA_CONNECTION_OPTIONS_NONE); 
    356  
    357283  strftime(time_str, sizeof time_str, "%s", localtime(&req->session_start)); 
    358284  strftime(time_str2, sizeof time_str2, "%s", 
     
    365291  member = (struct rahunas_member *) member_node->data; 
    366292 
    367   snprintf(startsess_cmd, sizeof (startsess_cmd), "INSERT INTO dbset" 
     293  snprintf(startsess_cmd, sizeof (startsess_cmd) - 1, "INSERT INTO dbset" 
    368294         "(session_id,vserver_id,username,ip,mac,session_start," 
    369295         "session_timeout,bandwidth_slot_id,bandwidth_max_down," 
     
    382308         member->serviceclass_name, 
    383309         member->serviceclass_slot_id); 
     310  startsess_cmd[sizeof (startsess_cmd) - 1] = '\0'; 
    384311 
    385312  DP("SQL: %s", startsess_cmd); 
    386313 
    387   execute_sql(connection, startsess_cmd); 
    388  
    389   if (connection) 
    390     g_object_unref(G_OBJECT(connection)); 
    391  
    392   return 0; 
     314  return sql_execute (startsess_cmd); 
    393315} 
    394316 
     
    396318static int stopsess (RHVServer *vs, struct task_req *req) 
    397319{ 
    398   GdaConnection *connection; 
    399   gint res; 
    400320  char stopsess_cmd[256]; 
    401321  GList *member_node = NULL; 
     
    408328  member = (struct rahunas_member *) member_node->data; 
    409329 
    410   connection = openconn (GDA_CONNECTION_OPTIONS_NONE); 
    411  
    412330  DP("Username  : %s", member->username); 
    413331  DP("SessionID : %s", member->session_id); 
    414332 
    415   snprintf(stopsess_cmd, sizeof (stopsess_cmd), "DELETE FROM dbset WHERE " 
     333  snprintf(stopsess_cmd, sizeof (stopsess_cmd) - 1, "DELETE FROM dbset WHERE " 
    416334         "session_id='%s' AND username='%s' AND vserver_id='%d'", 
    417335         member->session_id,  
    418336         member->username, 
    419337         vs->vserver_config->vserver_id); 
     338  stopsess_cmd[sizeof (stopsess_cmd) - 1] = '\0'; 
    420339 
    421340  DP("SQL: %s", stopsess_cmd); 
    422341 
    423   execute_sql(connection, stopsess_cmd); 
    424  
    425   if (connection) 
    426     g_object_unref(G_OBJECT(connection)); 
    427  
    428   return 0; 
     342  return sql_execute (stopsess_cmd); 
    429343} 
    430344 
  • src/rh-task-serviceclass.c

    r4b5d05b r73da9da  
    77#include <string.h> 
    88#include <syslog.h> 
    9 #include <libgda/libgda.h> 
     9#include <sqlite3.h> 
    1010 
    1111#include "rahunasd.h" 
     
    1313#include "rh-ipset.h" 
    1414#include "rh-task.h" 
     15#include "rh-task-memset.h" 
    1516 
    1617static struct set *rh_serviceclass_set = NULL; 
     
    2223  int  retry = 30; 
    2324  char select_cmd[256]; 
    24   GdaConnection *connection = NULL; 
    25   GdaSqlParser  *parser = NULL; 
    26   GList *data_list = NULL; 
     25  sqlite3 *connection = NULL; 
     26  int  rc; 
    2727 
    2828  if (sc_config == NULL) 
    2929    return 0; 
    3030 
    31   connection = gda_connection_open_from_dsn (PROGRAM, NULL, 
    32                  GDA_CONNECTION_OPTIONS_READ_ONLY, NULL); 
    33   parser = gda_connection_create_parser (connection); 
    34   if (!parser) { 
    35     parser = gda_sql_parser_new (); 
    36   } 
    37  
    38   g_object_set_data_full (G_OBJECT (connection), "parser", parser, g_object_unref); 
     31  rc = sqlite3_open (RAHUNAS_DB, &connection); 
     32  if (rc) { 
     33    logmsg (RH_LOG_ERROR, "Task SERVICECLASS: could not open database, %s", 
     34            sqlite3_errmsg (connection)); 
     35    sqlite3_close (connection); 
     36    return -1; 
     37  } 
    3938 
    4039  while (slot_id == 0 && (--retry > 0)) { 
     40    int  rc; 
     41    char **azResult = NULL; 
     42    char *zErrMsg   = NULL; 
     43    char *colname   = NULL; 
     44    char *value     = NULL; 
     45    int  nRow       = 0; 
     46    int  nColumn    = 0; 
     47 
    4148    time(&random_time); 
    4249    srandom(random_time); 
     
    4451 
    4552    if (slot_id != 0) { 
    46       memset (&select_cmd, '\0', sizeof (select_cmd)); 
    4753      snprintf(select_cmd, sizeof (select_cmd) - 1, 
    48                "SELECT * FROM dbset WHERE service_class = '%s' " 
    49                "AND service_class_slot_id = %u", 
     54               "SELECT count(service_class_slot_id) FROM dbset WHERE " 
     55               "service_class = '%s' AND service_class_slot_id = %u", 
    5056               sc_config->serviceclass_name, slot_id); 
     57      select_cmd[sizeof (select_cmd) - 1] = '\0'; 
    5158 
    5259      DP("SQL: %s", select_cmd); 
    53       data_list = execute_sql_command(connection, select_cmd); 
    54  
    55       if (g_list_first (data_list) == NULL) { 
    56         // Available 
    57         free_data_list(data_list); 
     60      rc = sqlite3_get_table (connection, select_cmd, &azResult, &nRow, 
     61                              &nColumn, &zErrMsg); 
     62      if (rc != SQLITE_OK) { 
     63        logmsg (RH_LOG_ERROR, "Task SERVICECLASS: could not get slot id form db" 
     64                              " (%s)", zErrMsg); 
     65        sqlite3_free (zErrMsg); 
     66        sqlite3_free_table (azResult); 
     67        sqlite3_close (connection); 
     68        return 0; 
     69      } 
     70 
     71      sqlite3_free_table (azResult); 
     72 
     73      if (nRow > 0) { 
     74        slot_id = 0; 
     75        continue; 
     76      } else { 
    5877        break; 
    59       } else { 
    60         // Not available, retry 
    61         free_data_list(data_list); 
    62         slot_id = 0; 
    6378      } 
    6479    } 
    6580  } 
    6681 
    67   if (connection) 
    68     g_object_unref(G_OBJECT(connection)); 
     82  sqlite3_close (connection); 
    6983 
    7084  return slot_id;