Changeset 73da9daaa0c2bbf2116a51186a27efaa4618d41d
- Timestamp:
- 09/29/11 00:27:38 (8 months ago)
- Children:
- dc6cdce2418f218dcb7797fb6efecfe424d83b0d
- Parents:
- 3b60405304d9d393a2ed0d36f9e43f539f961c44
- git-committer:
- Neutron Soutmun <neo.neutron@…> (09/29/11 00:27:38)
- Files:
-
- 4 modified
-
configure.ac (modified) (1 diff)
-
src/Makefile.am (modified) (3 diffs)
-
src/rh-task-dbset.c (modified) (13 diffs)
-
src/rh-task-serviceclass.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
configure.ac
rcb53713 r73da9da 29 29 AC_SUBST(LIBGNET_LIBS) 30 30 31 dnl Check for LibGDA 4.x32 LIB GDA_REQ=4.033 PKG_CHECK_MODULES(LIB GDA, [ libgda-4.0 >= $LIBGDA_REQ ], , [ AC_MSG_ERROR([LibGDAis required]) ])31 dnl Check for Sqlite3 32 LIBSQLITE3_REQ=3.7.3 33 PKG_CHECK_MODULES(LIBSQLITE3, [ sqlite3 >= $LIBSQLITE3_REQ ], , [ AC_MSG_ERROR([libsqlite3 is required]) ]) 34 34 35 AC_SUBST(LIB GDA_CFLAGS)36 AC_SUBST(LIB GDA_LIBS)35 AC_SUBST(LIBSQLITE3_CFLAGS) 36 AC_SUBST(LIBSQLITE3_LIBS) 37 37 38 38 # Checks for header files. -
src/Makefile.am
r4b5d05b r73da9da 7 7 AM_CFLAGS = \ 8 8 $(LIBGNET_CFLAGS) \ 9 $(LIB GDA_CFLAGS) \9 $(LIBSQLITE3_CFLAGS) \ 10 10 -I$(top_srcdir)/src/ \ 11 11 -DRAHUNAS_VERSION=\"$(RAHUNAS_VERSION)\" \ … … 13 13 -DIPSET_VERSION=\"$(IPSET_VERSION)\" \ 14 14 -DRAHUNAS_CONF_DIR=\"$(sysconfdir)/rahunas/\" \ 15 -DRAHUNAS_DB _DIR=\"$(localstatedir)/lib/rahunas/\" \15 -DRAHUNAS_DB=\"$(localstatedir)/lib/rahunas/rahunas.db\" \ 16 16 -DRAHUNAS_LOG_DIR=\"$(localstatedir)/log/rahunas/\" \ 17 17 -DRAHUNAS_RUN_DIR=\"$(localstatedir)/run/\" \ … … 62 62 $(top_builddir)/lcfg/liblcfg.a \ 63 63 $(LIBGNET_LIBS) \ 64 $(LIB GDA_LIBS)64 $(LIBSQLITE3_LIBS) -
src/rh-task-dbset.c
rcb53713 r73da9da 9 9 #include <time.h> 10 10 #include <string.h> 11 #include < libgda/libgda.h>11 #include <sqlite3.h> 12 12 #include "rahunasd.h" 13 13 #include "rh-task.h" … … 15 15 #include "rh-utils.h" 16 16 #include "rh-task-memset.h" 17 18 #define COLNAME_MATCH(a, b) (strncmp(a, b, strlen(a)) == 0) 17 19 18 20 struct dbset_row { … … 31 33 }; 32 34 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); 35 static void 36 free_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 49 static sqlite3 * 50 openconn (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 66 static void 67 closeconn (sqlite3 *connection) 68 { 69 if (connection) 70 sqlite3_close (connection); 71 } 72 73 static int 74 sql_execute_cb (void *NotUsed, int argc, char **argv, char **azColName) 75 { 76 /* Do nothing */ 77 return 0; 78 } 79 80 static int 81 sql_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 105 static int 106 restore_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); 113 189 } 114 190 } 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, ¶ms, 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, ¶ms, 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); 230 197 231 198 if (id < 0) 232 continue;199 goto skip; 233 200 234 201 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); 239 206 memcpy(req.mac_address, ethernet, ETH_ALEN); 240 207 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; 250 217 251 218 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 220 skip: 221 free_dbset_row (&row); 222 rowOffset++; 223 } 224 225 sqlite3_free_table (azResult); 226 closeconn (connection); 227 return 0; 271 228 } 272 229 … … 274 231 static int startservice () 275 232 { 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; 283 234 284 235 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); 294 245 295 246 return 0; … … 299 250 static int stopservice () 300 251 { 301 gda_config_remove_dsn (PROGRAM, NULL);252 /* Do nothing */ 302 253 return 0; 303 254 } … … 306 257 static void init (RHVServer *vs) 307 258 { 308 GdaConnection *connection;309 GList *data_list;310 GList *node;311 struct dbset_row *row;312 char select_cmd[256];313 314 259 if (vs->vserver_config->init_flag == VS_RELOAD) 315 260 return; … … 318 263 vs->vserver_config->vserver_name); 319 264 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); 336 266 } 337 267 … … 345 275 static int startsess (RHVServer *vs, struct task_req *req) 346 276 { 347 GdaConnection *connection;348 gint res;349 277 char startsess_cmd[512]; 350 278 char time_str[32]; … … 353 281 struct rahunas_member *member = NULL; 354 282 355 connection = openconn (GDA_CONNECTION_OPTIONS_NONE);356 357 283 strftime(time_str, sizeof time_str, "%s", localtime(&req->session_start)); 358 284 strftime(time_str2, sizeof time_str2, "%s", … … 365 291 member = (struct rahunas_member *) member_node->data; 366 292 367 snprintf(startsess_cmd, sizeof (startsess_cmd) , "INSERT INTO dbset"293 snprintf(startsess_cmd, sizeof (startsess_cmd) - 1, "INSERT INTO dbset" 368 294 "(session_id,vserver_id,username,ip,mac,session_start," 369 295 "session_timeout,bandwidth_slot_id,bandwidth_max_down," … … 382 308 member->serviceclass_name, 383 309 member->serviceclass_slot_id); 310 startsess_cmd[sizeof (startsess_cmd) - 1] = '\0'; 384 311 385 312 DP("SQL: %s", startsess_cmd); 386 313 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); 393 315 } 394 316 … … 396 318 static int stopsess (RHVServer *vs, struct task_req *req) 397 319 { 398 GdaConnection *connection;399 gint res;400 320 char stopsess_cmd[256]; 401 321 GList *member_node = NULL; … … 408 328 member = (struct rahunas_member *) member_node->data; 409 329 410 connection = openconn (GDA_CONNECTION_OPTIONS_NONE);411 412 330 DP("Username : %s", member->username); 413 331 DP("SessionID : %s", member->session_id); 414 332 415 snprintf(stopsess_cmd, sizeof (stopsess_cmd) , "DELETE FROM dbset WHERE "333 snprintf(stopsess_cmd, sizeof (stopsess_cmd) - 1, "DELETE FROM dbset WHERE " 416 334 "session_id='%s' AND username='%s' AND vserver_id='%d'", 417 335 member->session_id, 418 336 member->username, 419 337 vs->vserver_config->vserver_id); 338 stopsess_cmd[sizeof (stopsess_cmd) - 1] = '\0'; 420 339 421 340 DP("SQL: %s", stopsess_cmd); 422 341 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); 429 343 } 430 344 -
src/rh-task-serviceclass.c
r4b5d05b r73da9da 7 7 #include <string.h> 8 8 #include <syslog.h> 9 #include < libgda/libgda.h>9 #include <sqlite3.h> 10 10 11 11 #include "rahunasd.h" … … 13 13 #include "rh-ipset.h" 14 14 #include "rh-task.h" 15 #include "rh-task-memset.h" 15 16 16 17 static struct set *rh_serviceclass_set = NULL; … … 22 23 int retry = 30; 23 24 char select_cmd[256]; 24 GdaConnection *connection = NULL; 25 GdaSqlParser *parser = NULL; 26 GList *data_list = NULL; 25 sqlite3 *connection = NULL; 26 int rc; 27 27 28 28 if (sc_config == NULL) 29 29 return 0; 30 30 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 } 39 38 40 39 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 41 48 time(&random_time); 42 49 srandom(random_time); … … 44 51 45 52 if (slot_id != 0) { 46 memset (&select_cmd, '\0', sizeof (select_cmd));47 53 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", 50 56 sc_config->serviceclass_name, slot_id); 57 select_cmd[sizeof (select_cmd) - 1] = '\0'; 51 58 52 59 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 { 58 77 break; 59 } else {60 // Not available, retry61 free_data_list(data_list);62 slot_id = 0;63 78 } 64 79 } 65 80 } 66 81 67 if (connection) 68 g_object_unref(G_OBJECT(connection)); 82 sqlite3_close (connection); 69 83 70 84 return slot_id;
