summaryrefslogtreecommitdiff
path: root/smsd
diff options
context:
space:
mode:
authorMichal Čihař <michal@cihar.com>2011-12-21 14:26:58 +0100
committerMichal Čihař <michal@cihar.com>2011-12-21 14:26:58 +0100
commit73b42ebe697569be6e9eaeee6fd3f481af5c91f4 (patch)
treeb9ff21f4f5d07eaa7b5521ce54106e408cd04a03 /smsd
parent32f1cc1d448700f86a5129c5d0ec7cacd7a0f53a (diff)
Imported Upstream version 1.31.0
Diffstat (limited to 'smsd')
-rw-r--r--smsd/core.c4
-rw-r--r--smsd/services/dbi.c2
-rw-r--r--smsd/services/sql-core.h3
-rw-r--r--smsd/services/sql.c77
4 files changed, 45 insertions, 41 deletions
diff --git a/smsd/core.c b/smsd/core.c
index 76607ed..3fd1d45 100644
--- a/smsd/core.c
+++ b/smsd/core.c
@@ -778,6 +778,10 @@ GSM_Error SMSD_ReadConfig(const char *filename, GSM_SMSDConfig *Config, gboolean
Config->multiparttimeout = INI_GetInt(Config->smsdcfgfile, "smsd", "multiparttimeout", 600);
Config->maxretries = INI_GetInt(Config->smsdcfgfile, "smsd", "maxretries", 1);
Config->backend_retries = INI_GetInt(Config->smsdcfgfile, "smsd", "backendretries", 10);
+ if (Config->backend_retries < 1) {
+ SMSD_Log(DEBUG_NOTICE, Config, "BackendRetries too low, forcing to 1");
+ Config->backend_retries = 1;
+ }
SMSD_Log(DEBUG_NOTICE, Config, "CommTimeout=%i, SendTimeout=%i, ReceiveFrequency=%i, ResetFrequency=%i, HardResetFrequency=%i",
Config->commtimeout, Config->sendtimeout, Config->receivefrequency, Config->resetfrequency, Config->hardresetfrequency);
diff --git a/smsd/services/dbi.c b/smsd/services/dbi.c
index 11bb20a..d204a96 100644
--- a/smsd/services/dbi.c
+++ b/smsd/services/dbi.c
@@ -265,7 +265,7 @@ static SQL_Error SMSDDBI_Query(GSM_SMSDConfig * Config, const char *query, SQL_r
return SQL_TIMEOUT;
}
}
- return ERR_TIMEOUT;
+ return SQL_TIMEOUT;
}
/* free sql results */
diff --git a/smsd/services/sql-core.h b/smsd/services/sql-core.h
index d2551dc..204c7ad 100644
--- a/smsd/services/sql-core.h
+++ b/smsd/services/sql-core.h
@@ -85,7 +85,8 @@ typedef enum {
SQL_OK, /* all ok */
SQL_TIMEOUT, /* query or connection timeout */
SQL_FAIL, /* query failed */
- SQL_LOCKED /* locked table - currently unused */
+ SQL_LOCKED, /* locked table - currently unused */
+ SQL_BUG /* Internal error */
} SQL_Error;
/* types passed to NamedQuery */
diff --git a/smsd/services/sql.c b/smsd/services/sql.c
index e255917..be3e81d 100644
--- a/smsd/services/sql.c
+++ b/smsd/services/sql.c
@@ -215,32 +215,28 @@ static const char *SMSDSQL_Now(GSM_SMSDConfig * Config)
return now_fallback;
}
}
-static GSM_Error SMSDSQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * res)
+static SQL_Error SMSDSQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * res)
{
- SQL_Error error;
+ SQL_Error error = SQL_TIMEOUT;
int attempts = 1;
struct GSM_SMSDdbobj *db = Config->db;
- for (attempts = 1; attempts < Config->backend_retries; attempts++) {
+ for (attempts = 1; attempts <= Config->backend_retries; attempts++) {
SMSD_Log(DEBUG_SQL, Config, "Execute SQL: %s", query);
error = db->Query(Config, query, res);
- if (error == SQL_OK)
- return ERR_NONE;
+ if (error == SQL_OK) {
+ return error;
+ }
if (error != SQL_TIMEOUT){
SMSD_Log(DEBUG_INFO, Config, "SQL failure: %d", error);
- sleep(attempts * attempts);
- continue;
+ return error;
}
SMSD_Log(DEBUG_INFO, Config, "SQL failed (timeout): %s", query);
- if (attempts >= Config->backend_retries) {
- return ERR_TIMEOUT;
- }
/* We will try to reconnect */
SMSD_Log(DEBUG_INFO, Config, "reconnecting to database!");
- error = SQL_TIMEOUT;
- while (error != SQL_OK && attempts <= Config->backend_retries) {
+ while (error != SQL_OK && attempts < Config->backend_retries) {
SMSD_Log(DEBUG_INFO, Config, "Reconnecting after %d seconds...", attempts * attempts);
sleep(attempts * attempts);
db->Free(Config);
@@ -248,7 +244,7 @@ static GSM_Error SMSDSQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_r
attempts++;
}
}
- return ERR_TIMEOUT;
+ return error;
}
void SMSDSQL_Time2String(GSM_SMSDConfig * Config, time_t timestamp, char *static_buff, size_t size)
@@ -279,7 +275,7 @@ void SMSDSQL_Time2String(GSM_SMSDConfig * Config, time_t timestamp, char *static
}
}
-static GSM_Error SMSDSQL_NamedQuery(GSM_SMSDConfig * Config, const char *sql_query, GSM_SMSMessage *sms,
+static SQL_Error SMSDSQL_NamedQuery(GSM_SMSDConfig * Config, const char *sql_query, GSM_SMSMessage *sms,
const SQL_Var *params, SQL_result * res)
{
char buff[65536], *ptr, c, static_buff[8192];
@@ -317,12 +313,12 @@ static GSM_Error SMSDSQL_NamedQuery(GSM_SMSDConfig * Config, const char *sql_que
break;
default:
SMSD_Log(DEBUG_ERROR, Config, "SQL: unknown type: %i (application bug) in query: `%s`", params[n].type, sql_query);
- return ERR_BUG;
+ return SQL_BUG;
break;
}
} else {
SMSD_Log(DEBUG_ERROR, Config, "SQL: wrong number of parameter: %i (max %i) in query: `%s`", n+1, argc, sql_query);
- return ERR_UNKNOWN;
+ return SQL_BUG;
}
q = end - 1;
continue;
@@ -422,12 +418,12 @@ static GSM_Error SMSDSQL_NamedQuery(GSM_SMSDConfig * Config, const char *sql_que
break;
default:
SMSD_Log(DEBUG_ERROR, Config, "SQL: uexpected char '%c' in query: %s", c, sql_query);
- return ERR_UNKNOWN;
+ return SQL_BUG;
} /* end of switch */
} else {
SMSD_Log(DEBUG_ERROR, Config, "Syntax error in query.. uexpected char '%c' in query: %s", c, sql_query);
- return ERR_UNKNOWN;
+ return SQL_BUG;
}
break;
} /* end of switch */
@@ -452,7 +448,7 @@ static GSM_Error SMSDSQL_CheckTable(GSM_SMSDConfig * Config, const char *table)
{
SQL_result res;
char buffer[200];
- GSM_Error error;
+ SQL_Error error;
struct GSM_SMSDdbobj *db = Config->db;
const char *escape_char;
@@ -460,7 +456,7 @@ static GSM_Error SMSDSQL_CheckTable(GSM_SMSDConfig * Config, const char *table)
sprintf(buffer, "SELECT %s %sID%s FROM %s %s", SMSDSQL_TopClause(Config, "1"), escape_char, escape_char, table, SMSDSQL_LimitClause(Config, "1"));
error = SMSDSQL_Query(Config, buffer, &res);
- if (error != ERR_NONE) {
+ if (error != SQL_OK) {
SMSD_Log(DEBUG_ERROR, Config, "Table %s not found, disconnecting!", table);
db->Free(Config);
return ERR_UNKNOWN;
@@ -520,7 +516,7 @@ static GSM_Error SMSDSQL_Init(GSM_SMSDConfig * Config)
escape_char = SMSDSQL_EscapeChar(Config);
sprintf(buffer, "SELECT %sVersion%s FROM gammu", escape_char, escape_char);
- if (SMSDSQL_Query(Config, buffer, &res) != ERR_NONE) {
+ if (SMSDSQL_Query(Config, buffer, &res) != SQL_OK) {
db->Free(Config);
return ERR_UNKNOWN;
}
@@ -548,7 +544,7 @@ static GSM_Error SMSDSQL_InitAfterConnect(GSM_SMSDConfig * Config)
struct GSM_SMSDdbobj *db = Config->db;
SQL_Var vars[3] = {{SQL_TYPE_STRING, {NULL}}, {SQL_TYPE_STRING, {NULL}}, {SQL_TYPE_NONE, {NULL}}};
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_PHONE], NULL, NULL, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_PHONE], NULL, NULL, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -558,7 +554,7 @@ static GSM_Error SMSDSQL_InitAfterConnect(GSM_SMSDConfig * Config)
vars[0].v.s = Config->enable_send ? "yes" : "no";
vars[1].v.s = Config->enable_receive ? "yes" : "no";
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_INSERT_PHONE], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_INSERT_PHONE], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error inserting into database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -595,7 +591,7 @@ static GSM_Error SMSDSQL_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
EncodeUTF8(smstext, sms->SMS[i].Text);
SMSD_Log(DEBUG_INFO, Config, "Delivery report: %s to %s", smstext, destinationnumber);
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_SELECT], &sms->SMS[i], NULL, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_SELECT], &sms->SMS[i], NULL, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error reading from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -656,7 +652,7 @@ static GSM_Error SMSDSQL_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
vars[1].v.i = (long)db->GetNumber(Config, &res, 0); /* ID */
vars[2].type = SQL_TYPE_NONE;
- if (SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res2) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res2) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -669,7 +665,7 @@ static GSM_Error SMSDSQL_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
if (sms->SMS[i].PDU != SMS_Deliver)
continue;
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_INSERT], &sms->SMS[i], NULL, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_INSERT], &sms->SMS[i], NULL, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -695,7 +691,7 @@ static GSM_Error SMSDSQL_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
locations_pos += sprintf((*Locations) + locations_pos, "%lu ", (long)new_id);
}
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_UPDATE_RECEIVED], &sms->SMS[i], NULL, &res2) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_UPDATE_RECEIVED], &sms->SMS[i], NULL, &res2) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error updating number of received messages (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -714,7 +710,7 @@ static GSM_Error SMSDSQL_RefreshSendStatus(GSM_SMSDConfig * Config, char *ID)
{SQL_TYPE_STRING, {ID}},
{SQL_TYPE_NONE, {NULL}}};
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_REFRESH_SEND_STATUS], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_REFRESH_SEND_STATUS], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -758,7 +754,7 @@ static GSM_Error SMSDSQL_FindOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
vars[0].v.i = limit;
vars[1].type = SQL_TYPE_NONE;
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_SMS_ID], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_SMS_ID], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error reading from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -804,7 +800,7 @@ static GSM_Error SMSDSQL_FindOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig
} else {
q = SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_MULTIPART];
}
- if (SMSDSQL_NamedQuery(Config, q, NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, q, NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_ERROR, Config, "Error reading from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -918,13 +914,13 @@ static GSM_Error SMSDSQL_MoveSMS(GSM_MultiSMSMessage * sms UNUSED, GSM_SMSDConfi
vars[0].v.s = ID;
vars[1].type = SQL_TYPE_NONE;
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
db->FreeResult(Config, &res);
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX_MULTIPART], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX_MULTIPART], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -967,7 +963,7 @@ static GSM_Error SMSDSQL_CreateOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConf
vars[4].v.i = ID;
vars[5].type = SQL_TYPE_NONE;
- if (SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -1032,13 +1028,13 @@ static GSM_Error SMSDSQL_AddSentSMSInfo(GSM_MultiSMSMessage * sms, GSM_SMSDConfi
vars[4].v.s = Config->DT;
vars[5].type = SQL_TYPE_NONE;
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_ADD_SENT_INFO], &sms->SMS[Part - 1], vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_ADD_SENT_INFO], &sms->SMS[Part - 1], vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
db->FreeResult(Config, &res);
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_UPDATE_SENT], &sms->SMS[Part - 1], NULL, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_UPDATE_SENT], &sms->SMS[Part - 1], NULL, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error updating number of sent messages (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -1058,7 +1054,7 @@ static GSM_Error SMSDSQL_RefreshPhoneStatus(GSM_SMSDConfig * Config)
vars[0].v.i = Config->Status->Charge.BatteryPercent;
vars[1].v.i = Config->Status->Network.SignalPercent;
- if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_REFRESH_PHONE_STATUS], NULL, vars, &res) != ERR_NONE) {
+ if (SMSDSQL_NamedQuery(Config, SMSDSQL_queries[SQL_QUERY_REFRESH_PHONE_STATUS], NULL, vars, &res) != SQL_OK) {
SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
return ERR_UNKNOWN;
}
@@ -1166,19 +1162,22 @@ GSM_Error SMSDSQL_ReadConfiguration(GSM_SMSDConfig *Config)
Config->db = NULL;
#ifdef HAVE_MYSQL_MYSQL_H
- if (!strcasecmp(Config->driver, "native_mysql"))
+ if (!strcasecmp(Config->driver, "native_mysql")) {
Config->db = &SMSDMySQL;
+ }
#endif
#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
- if (!strcasecmp(Config->driver, "native_pgsql"))
+ if (!strcasecmp(Config->driver, "native_pgsql")) {
Config->db = &SMSDPgSQL;
+ }
#endif
#ifdef ODBC_FOUND
- if (!strcasecmp(Config->driver, "odbc"))
+ if (!strcasecmp(Config->driver, "odbc")) {
Config->db = &SMSDODBC;
if (Config->sql == NULL) {
SMSD_Log(DEBUG_INFO, Config, "Using generic SQL for ODBC, this might fail. In such case please set SQL configuration option.");
}
+ }
#endif
if (Config->db == NULL) {
#ifdef LIBDBI_FOUND