diff options
author | Michal Čihař <michal@cihar.com> | 2011-12-21 14:26:58 +0100 |
---|---|---|
committer | Michal Čihař <michal@cihar.com> | 2011-12-21 14:26:58 +0100 |
commit | 73b42ebe697569be6e9eaeee6fd3f481af5c91f4 (patch) | |
tree | b9ff21f4f5d07eaa7b5521ce54106e408cd04a03 /smsd | |
parent | 32f1cc1d448700f86a5129c5d0ec7cacd7a0f53a (diff) |
Imported Upstream version 1.31.0
Diffstat (limited to 'smsd')
-rw-r--r-- | smsd/core.c | 4 | ||||
-rw-r--r-- | smsd/services/dbi.c | 2 | ||||
-rw-r--r-- | smsd/services/sql-core.h | 3 | ||||
-rw-r--r-- | smsd/services/sql.c | 77 |
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 |