summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libs/zbxdbhigh/db.c90
-rw-r--r--src/zabbix_server/server.c65
2 files changed, 60 insertions, 95 deletions
diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c
index 695042c5..12ae9e4f 100644
--- a/src/libs/zbxdbhigh/db.c
+++ b/src/libs/zbxdbhigh/db.c
@@ -35,6 +35,7 @@
#ifdef HAVE_SQLITE3
sqlite3 *sqlite;
+ ZBX_MUTEX sqlite_access;
#endif
#ifdef HAVE_MYSQL
@@ -70,6 +71,7 @@ void DBclose(void)
#endif
}
+
/*
* Connect to the database.
* If fails, program terminates.
@@ -147,6 +149,14 @@ void DBconnect(void)
/* Do not return SQLITE_BUSY immediately, wait for N ms */
sqlite3_busy_timeout(sqlite, 60*1000);
+
+ if(ZBX_MUTEX_ERROR == zbx_mutex_create(&sqlite_access, "sqlite"))
+ {
+ zbx_error("Unable to create mutex for sqlite");
+ exit(FAIL);
+ }
+
+
#endif
}
@@ -241,6 +251,7 @@ int DBexecute(const char *fmt, ...)
#endif
#ifdef HAVE_SQLITE3
int ret = SUCCEED;
+ int sql_ret = SUCCEED;
char *error=0;
#endif
@@ -294,13 +305,17 @@ int DBexecute(const char *fmt, ...)
return ret;
#endif
#ifdef HAVE_SQLITE3
- if(SQLITE_OK != sqlite3_exec(sqlite, sql, NULL, 0, &error))
+ zbx_mutex_lock(&sqlite_access);
+
+ if(SQLITE_OK != (sql_ret = sqlite3_exec(sqlite, sql, NULL, 0, &error)))
{
zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql);
- zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", error);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed [%i]:%s", sql_ret, error);
sqlite3_free(error);
ret = FAIL;
}
+
+ zbx_mutex_unlock(&sqlite_access);
return ret;
#endif
}
@@ -321,6 +336,8 @@ int DBis_null(char *field)
/* in db.h - #define DBfree_result PG_DBfree_result */
void PG_DBfree_result(DB_RESULT result)
{
+ if(!result) return;
+
/* free old data */
if(result->values)
{
@@ -337,17 +354,13 @@ void PG_DBfree_result(DB_RESULT result)
/* in db.h - #define DBfree_result SQ_DBfree_result */
void SQ_DBfree_result(DB_RESULT result)
{
- int i = 0;
-
- /* free old data */
- if(result->values)
+ if(!result) return;
+
+ if(result->data)
{
- result->fld_num = 0;
- free(result->values);
- result->values = NULL;
+ sqlite3_free_table(result->data);
}
- sqlite3_finalize(result->sq_result);
free(result);
}
#endif
@@ -416,29 +429,13 @@ DB_ROW DBfetch(DB_RESULT result)
if(!result) return NULL;
/* EOF */
- if(sqlite3_step(result->sq_result) != SQLITE_ROW) return NULL;
+ if(result->curow >= result->nrow) return NULL;
- /* free old data */
- if(result->values)
- {
- result->fld_num = 0;
- free(result->values);
- result->values = NULL;
- }
+ if(!result->data) return NULL;
- /* init result */
- result->fld_num = sqlite3_column_count(result->sq_result);
-
- if(result->fld_num > 0)
- {
- result->values = malloc(sizeof(char*) * result->fld_num);
- for(i = 0; i < result->fld_num; i++)
- {
- result->values[i] = (char*)sqlite3_column_text(result->sq_result, i);
- }
- }
+ result->curow++; /* NOTE: First row == header row */
- return result->values;
+ return &(result->data[result->curow * result->ncolumn]);
#endif
}
@@ -457,6 +454,10 @@ DB_RESULT DBselect(const char *fmt, ...)
#ifdef HAVE_ORACLE
sqlo_stmt_handle_t sth;
#endif
+#ifdef HAVE_SQLITE3
+ int sql_ret = SUCCEED;
+ char *error=0;
+#endif
va_start(args, fmt);
vsnprintf(sql, ZBX_MAX_SQL_LEN-1, fmt, args);
@@ -512,18 +513,21 @@ DB_RESULT DBselect(const char *fmt, ...)
return sth;
#endif
#ifdef HAVE_SQLITE3
+ zbx_mutex_lock(&sqlite_access);
+
result = malloc(sizeof(ZBX_SQ_DB_RESULT));
- result->sq_result = NULL;
- result->values = NULL;
- result->fld_num = 0;
+ result->curow = 0;
- if(SQLITE_OK != sqlite3_prepare(sqlite, sql, -1, &result->sq_result, 0))
+ if(SQLITE_OK != (sql_ret = sqlite3_get_table(sqlite,sql,&result->data,&result->nrow, &result->ncolumn, &error)))
{
- zabbix_log(LOG_LEVEL_ERR, "Query::%s",sql);
- zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", sqlite3_errmsg(sqlite));
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed [%i]:%s", sql_ret, error);
+ sqlite3_free(error);
+ zbx_mutex_unlock(&sqlite_access);
exit(FAIL);
}
-
+
+ zbx_mutex_unlock(&sqlite_access);
return result;
#endif
}
@@ -1906,7 +1910,7 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
char *s;
ZBX_STR2UINT64(item->itemid, row[0]);
-// item->itemid=atoi(row[0]);
+/* item->itemid=atoi(row[0]); */
strscpy(item->key,row[1]);
item->host=row[2];
item->port=atoi(row[3]);
@@ -1941,7 +1945,7 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
item->prevvalue_str=s;
item->prevvalue=atof(s);
}
-// item->hostid=atoi(row[15]);
+/* item->hostid=atoi(row[15]); */
ZBX_STR2UINT64(item->hostid, row[15]);
item->host_status=atoi(row[16]);
item->value_type=atoi(row[17]);
@@ -1983,7 +1987,7 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
item->trapper_hosts=row[32];
item->logtimefmt=row[33];
ZBX_STR2UINT64(item->valuemapid, row[34]);
-// item->valuemapid=atoi(row[34]);
+/* item->valuemapid=atoi(row[34]); */
item->delay_flex=row[35];
}
@@ -2005,7 +2009,7 @@ zbx_uint64_t DBget_nextid(char *table, char *field)
max = (zbx_uint64_t)__UINT64_C(100000000000000)*(zbx_uint64_t)(CONFIG_NODEID+1)-1;
result = DBselect("select max(%s) from %s where %s>=" ZBX_FS_UI64 " and %s<=" ZBX_FS_UI64, field, table, field, min, field, max);
-// zabbix_log(LOG_LEVEL_WARNING, "select max(%s) from %s where %s>=" ZBX_FS_UI64 " and %s<=" ZBX_FS_UI64, field, table, field, min, field, max);
+/* zabbix_log(LOG_LEVEL_WARNING, "select max(%s) from %s where %s>=" ZBX_FS_UI64 " and %s<=" ZBX_FS_UI64, field, table, field, min, field, max); */
row=DBfetch(result);
@@ -2017,11 +2021,11 @@ zbx_uint64_t DBget_nextid(char *table, char *field)
}
else
{
-// zabbix_log(LOG_LEVEL_WARNING,"4");
+/* zabbix_log(LOG_LEVEL_WARNING,"4"); */
res=(zbx_uint64_t)__UINT64_C(100000000000000)*(zbx_uint64_t)CONFIG_NODEID+1;
}
DBfree_result(result);
-// zabbix_log(LOG_LEVEL_WARNING, ZBX_FS_UI64, res);
+/* zabbix_log(LOG_LEVEL_WARNING, ZBX_FS_UI64, res); */
return res;
}
diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c
index c43a4890..bdd4844c 100644
--- a/src/zabbix_server/server.c
+++ b/src/zabbix_server/server.c
@@ -320,58 +320,15 @@ int tcp_listen(const char *host, int port, socklen_t *addrlenp)
* *
******************************************************************************/
-//#define TEST
+/* #define TEST */
#ifdef TEST
-void run_commands(DB_TRIGGER *trigger,DB_ACTION *action);
-
void test()
{
- DB_RESULT result;
- DB_ROW row;
-
- char *data;
- int offset=0;
- int allocated=1024;
- int i;
-
- data=malloc(allocated);
-
-// zbx_snprintf_alloc(&data, &allocated, &offset, 128, "Test");
- zbx_snprintf_alloc(&data, &allocated, &offset, 128, "%s", "\n");
- printf("[%s]\n",data);
- printf("Allocated %d Offset %d\n",allocated, offset);
-
- i = zbx_snprintf(data, 128,"test");
- printf("[%s]\n",data);
- printf("Written %d\n", i);
-
- return;
-
-
-
printf("-= Test Started =-\n");
- result = DBselect("select hostid,host from hosts");
-
- while((row=DBfetch(result)))
- {
- printf("[%s|%s]\n",row[0],row[1]);
- }
- DBfree_result(result);
-
- result = DBselect("select * from users");
-
- while((row=DBfetch(result)))
- {
- printf("[%s|%s]\n",row[0],row[3]);
- }
- DBfree_result(result);
-
- printf("-= Test completed =-\n");
-
- return 0;
+ printf("\n-= Test completed =-\n");
}
#endif /* TEST */
@@ -503,7 +460,7 @@ int MAIN_ZABBIX_ENTRY(void)
zabbix_open_log(LOG_TYPE_FILE,CONFIG_LOG_LEVEL,CONFIG_LOG_FILE);
}
-// zabbix_log( LOG_LEVEL_WARNING, "INFO [%s]", ZBX_SQL_MOD(a,%d));
+/* zabbix_log( LOG_LEVEL_WARNING, "INFO [%s]", ZBX_SQL_MOD(a,%d)); */
zabbix_log( LOG_LEVEL_WARNING, "Starting zabbix_server. ZABBIX %s.", ZABBIX_VERSION);
DBconnect();
@@ -560,13 +517,13 @@ int MAIN_ZABBIX_ENTRY(void)
}
}
-// zabbix_log( LOG_LEVEL_WARNING, "zabbix_server #%d started",server_num);
+/* zabbix_log( LOG_LEVEL_WARNING, "zabbix_server #%d started",server_num); */
/* Main process */
if(server_num == 0)
{
init_main_process();
zabbix_log( LOG_LEVEL_WARNING, "server #%d started [Main]",server_num);
- for(;;) sleep(3600);
+ for(;;) zbx_sleep(3600);
}
@@ -590,8 +547,8 @@ int MAIN_ZABBIX_ENTRY(void)
}
child_trapper_main(server_num, listenfd, addrlen);
-// threads[i] = child_trapper_make(i, listenfd, addrlen);
-// child_trapper_make(server_num, listenfd, addrlen);
+/* threads[i] = child_trapper_make(i, listenfd, addrlen); */
+/* child_trapper_make(server_num, listenfd, addrlen); */
}
else if(server_num <= CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS)
{
@@ -618,14 +575,14 @@ int MAIN_ZABBIX_ENTRY(void)
else if(server_num <= CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS)
{
-// zabbix_log( LOG_LEVEL_WARNING, "%d<=%d",server_num, CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS);
+/* zabbix_log( LOG_LEVEL_WARNING, "%d<=%d",server_num, CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS); */
#ifdef HAVE_SNMP
init_snmp("zabbix_server");
zabbix_log( LOG_LEVEL_WARNING, "server #%d started [Poller for unreachable hosts. SNMP:ON]",server_num);
#else
zabbix_log( LOG_LEVEL_WARNING, "server #%d started [Poller for unreachable hosts. SNMP:OFF]",server_num);
#endif
-// zabbix_log( LOG_LEVEL_WARNING, "Before main_poller_loop(%d,%d)",ZBX_POLLER_TYPE_UNREACHABLE,server_num - (CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS +CONFIG_ALERTER_FORKS+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS));
+/* zabbix_log( LOG_LEVEL_WARNING, "Before main_poller_loop(%d,%d)",ZBX_POLLER_TYPE_UNREACHABLE,server_num - (CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS +CONFIG_ALERTER_FORKS+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS)); */
main_poller_loop(ZBX_POLLER_TYPE_UNREACHABLE,
server_num - (CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS+CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS));
}
@@ -744,6 +701,10 @@ void zbx_on_exit()
zabbix_log(LOG_LEVEL_INFORMATION, "ZABBIX Server stopped");
zabbix_close_log();
+
+#ifdef HAVE_SQLITE3
+ zbx_mutex_destroy(&sqlite_access);
+#endif /* HAVE_SQLITE3 */
exit(SUCCEED);
}