2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
24 //#include "MsgDebug.h"
25 #include "MsgSqliteWrapper.h"
29 __thread sqlite3 *handle = NULL;
30 __thread sqlite3_stmt *stmt = NULL;
31 __thread char **result = NULL;
34 /*==================================================================================================
35 IMPLEMENTATION OF MsgDbHandler - Member Functions
36 ==================================================================================================*/
37 MsgDbHandler::MsgDbHandler()
45 MsgDbHandler::~MsgDbHandler()
58 MSG_ERROR_T MsgDbHandler::connect()
66 memset(strDBName, 0x00, sizeof(strDBName));
67 snprintf(strDBName, 64, "%s", MSGFW_DB_NAME);
69 ret = db_util_open(strDBName, &handle, DB_UTIL_REGISTER_HOOK_METHOD);
73 LogDebug("DB Connect Success : [" << handle << "]");
78 LogDebug("DB Connect Fail [" << ret << "]");
79 return MSG_ERR_DB_CONNECT;
84 LogDebug("DB Connect exist : [" << handle << "]");
91 MSG_ERROR_T MsgDbHandler::disconnect()
97 ret = db_util_close(handle);
102 LogDebug("DB Disconnect Success");
107 LogDebug("DB Disconnect Fail [" << ret << "]");
108 return MSG_ERR_DB_DISCONNECT;
116 bool MsgDbHandler::checkTableExist(const char *pTableName)
119 int nRowCnt = 0, nResult = 0;
121 /* Formulate the Query */
122 memset(strQuery, 0x00, sizeof(strQuery));
123 snprintf(strQuery, sizeof(strQuery), "select count(name) from sqlite_master where name='%s'", pTableName);
125 if (getTable(strQuery, &nRowCnt) != MSG_SUCCESS)
131 nResult = getColumnToInt(1);
132 LogDebug("Result [" << nResult << "]");
143 MSG_ERROR_T MsgDbHandler::execQuery(const char *pQuery)
148 return MSG_ERR_INVALID_PARAMETER;
150 if(connect() != MSG_SUCCESS)
151 return MSG_ERR_DB_DISCONNECT;
153 ret = sqlite3_exec(handle, pQuery, 0, 0, NULL);
155 if (ret == SQLITE_OK)
157 LogDebug("Execute Query Success");
162 LogDebug("Execute Query Fail [" << ret << "]");
164 return MSG_ERR_DB_EXEC;
171 MSG_ERROR_T MsgDbHandler::getTable(const char *pQuery, int *pRowCnt)
177 if(connect() != MSG_SUCCESS)
178 return MSG_ERR_DB_DISCONNECT;
181 ret = sqlite3_get_table(handle, pQuery, &result, pRowCnt, 0, NULL);
183 if (ret == SQLITE_OK)
185 if (*pRowCnt == 0) // when the no record return 'MSG_ERR_DB_NORECORD'
187 LogDebug("No Query Result");
188 return MSG_ERR_DB_NORECORD;
191 LogDebug("Get Table Success");
196 LogDebug("Get Table Fail [" << ret << "]");
197 return MSG_ERR_DB_GETTABLE;
204 void MsgDbHandler::freeTable()
208 sqlite3_free_table(result);
214 MSG_ERROR_T MsgDbHandler::bindText(const char *pBindStr, int index)
218 if (pBindStr != NULL)
219 ret = sqlite3_bind_text(stmt, index, pBindStr, (strlen(pBindStr) + sizeof(unsigned char)), SQLITE_STATIC);
225 MSG_ERROR_T MsgDbHandler::bindBlob(const void * pBindBlob, int size, int index)
229 ret = sqlite3_bind_blob(stmt, index, pBindBlob, size, SQLITE_STATIC);
235 MSG_ERROR_T MsgDbHandler::prepareQuery(const char *pQuery)
241 if(connect() != MSG_SUCCESS)
242 return MSG_ERR_DB_DISCONNECT;
245 if ((ret = sqlite3_prepare_v2(handle, pQuery, strlen(pQuery), &stmt, NULL)) == SQLITE_OK)
247 LogDebug("Prepare Query Success");
252 LogDebug("Prepare Query Fail [" << ret << "]");
253 return MSG_ERR_DB_PREPARE;
260 MSG_ERROR_T MsgDbHandler::stepQuery()
264 ret = sqlite3_step(stmt);
266 if (ret == SQLITE_ROW)
268 LogDebug("MsgStepQuery() SQLITE_ROW");
269 return MSG_ERR_DB_ROW;
271 else if (ret == SQLITE_DONE)
273 LogDebug("MsgStepQuery() SQLITE_DONE");
274 return MSG_ERR_DB_DONE;
278 LogDebug("MsgStepQuery() Fail [" << ret << "]");
279 return MSG_ERR_DB_STEP;
286 void MsgDbHandler::finalizeQuery()
289 sqlite3_finalize(stmt);
294 int MsgDbHandler::columnInt(int ColumnIndex)
296 return sqlite3_column_int(stmt, ColumnIndex);
300 const unsigned char* MsgDbHandler::columnText(int ColumnIndex)
302 return sqlite3_column_text(stmt, ColumnIndex);
306 const void* MsgDbHandler::columnBlob(int ColumnIndex)
308 return sqlite3_column_blob(stmt, ColumnIndex);
312 MSG_ERROR_T MsgDbHandler::beginTrans()
316 if(connect() != MSG_SUCCESS)
317 return MSG_ERR_DB_DISCONNECT;
320 ret = sqlite3_exec(handle, "BEGIN deferred;", 0, 0, NULL);
322 if (ret == SQLITE_OK)
324 LogDebug("Begin Transaction Success");
329 LogDebug("Begin Transaction Fail [" << ret << "]");
330 return MSG_ERR_DB_EXEC;
337 MSG_ERROR_T MsgDbHandler::endTrans(bool Success)
341 if(connect() != MSG_SUCCESS)
342 return MSG_ERR_DB_DISCONNECT;
347 ret = sqlite3_exec(handle, "END;", 0, 0, NULL);
351 ret = sqlite3_exec(handle, "rollback", 0, 0, NULL);
352 ret = sqlite3_exec(handle, "END;", 0, 0, NULL);
355 if (ret == SQLITE_OK)
357 LogDebug("End Transaction Success");
362 LogDebug("End Transaction Fail [" << ret << "]");
363 return MSG_ERR_DB_EXEC;
370 int MsgDbHandler::getColumnToInt(int RowIndex)
372 char* pTemp = result[RowIndex];
382 nTemp = (int)strtol(pTemp, (char**)NULL, 10);
384 // nTemp = atoi(pTemp);
390 char MsgDbHandler::getColumnToChar(int RowIndex)
392 char* pTemp = result[RowIndex];
404 void MsgDbHandler::getColumnToString(int RowIndex, int Length, char *pString)
406 char* pTemp = result[RowIndex];
414 strncpy(pString, pTemp, Length);
418 MSG_ERROR_T MsgDbHandler::getRowId(const char *pTableName, unsigned int *pRowId)
420 int ret = 0, nRowId = 0, nRowCnt = 0;
423 if (pTableName == NULL || pRowId == NULL)
424 return MSG_ERR_INVALID_PARAMETER;
426 LogDebug("Table Name [" << pTableName << "]");
428 memset(strQuery, 0x00, sizeof(strQuery));
429 snprintf(strQuery, sizeof(strQuery), "select max(rowid) from %s", pTableName);
431 ret = getTable(strQuery, &nRowCnt);
433 if (ret == SQLITE_OK)
435 nRowId = getColumnToInt(1);
437 if ((nRowCnt <= 1) && (nRowId == 0))
440 *pRowId = nRowId + 1;
444 LogDebug("MsgGetRowId failed");
447 return MSG_ERR_DB_GETTABLE;
452 LogDebug("Row ID [" << *pRowId << "]");
458 /*==================================================================================================
459 FUNCTION IMPLEMENTATION
460 ==================================================================================================*/
462 MSG_ERROR_T MsgConnectDB()
468 memset(strDBName, 0x00, sizeof(strDBName));
469 snprintf(strDBName, 64, "%s", MSGFW_DB_NAME);
471 if (gDBHandle == NULL)
474 #ifdef INCLUDE_SQLITE3
475 ret = sqlite3_open(strDBName, &gDBHandle);
477 ret = db_util_open(strDBName, &gDBHandle, DB_UTIL_REGISTER_HOOK_METHOD);
480 if (ret == SQLITE_OK)
482 LogDebug("DB Connect Success");
487 LogDebug("DB Connect Fail [" << ret "]");
488 return MSG_ERR_DB_CONNECT;
496 MSG_ERROR_T MsgDisconnectDB()
500 if (gDBHandle != NULL)
503 #ifdef INCLUDE_SQLITE3
504 ret = sqlite3_close(gDBHandle);
506 ret = db_util_close(gDBHandle);
509 if (ret == SQLITE_OK)
512 LogDebug("DB Disconnect Success");
517 LogDebug("DB Disconnect Fail [" << ret << "]");
518 return MSG_ERR_DB_DISCONNECT;
526 bool MsgIsTableExist(const char *pTableName)
529 int nRowCnt = 0, nResult = 0;
531 /* Formulate the Query */
532 memset(strQuery, 0x00, sizeof(strQuery));
533 snprintf(strQuery, sizeof(strQuery), "select count(name) from sqlite_master where name='%s'", pTableName);
535 if (MsgGetTable(strQuery, &nRowCnt) != MSG_SUCCESS)
541 nResult = MsgGetColumnToInt(1);
542 LogDebug("Result [" << nResult << "]");
553 MSG_ERROR_T MsgExecQuery(const char *pQuery)
558 return MSG_ERR_INVALID_PARAMETER;
560 ret = sqlite3_exec(gDBHandle, pQuery, 0, 0, NULL);
562 if (ret == SQLITE_OK)
564 LogDebug("Execute Query Success");
569 LogDebug("Execute Query Fail [" << ret << "]");
570 return MSG_ERR_DB_EXEC;
577 MSG_ERROR_T MsgGetTable(const char *pQuery, int *pRowCnt)
583 ret = sqlite3_get_table(gDBHandle, pQuery, &gQueryResult, pRowCnt, 0, NULL);
585 if (ret == SQLITE_OK)
587 if (*pRowCnt == 0) // when the no record return 'MSG_ERR_DB_NORECORD'
589 LogDebug("No Query Result");
590 return MSG_ERR_DB_NORECORD;
593 LogDebug("Get Table Success");
598 LogDebug("Get Table Fail [" << ret << "]");
599 return MSG_ERR_DB_GETTABLE;
610 sqlite3_free_table(gQueryResult);
615 /* End of supporting two queries simultaneously*/
617 MSG_ERROR_T MsgBindText(const char *pBindStr, int index)
621 if (pBindStr != NULL)
622 ret = sqlite3_bind_text(gStmt, index, pBindStr, (strlen(pBindStr) + sizeof(unsigned char)), SQLITE_STATIC);
628 MSG_ERROR_T MsgBindBlob(const void * pBindBlob, int size, int index)
632 ret = sqlite3_bind_blob(gStmt, index, pBindBlob, size, SQLITE_STATIC);
638 MSG_ERROR_T MsgPrepareQuery(const char *pQuery)
644 if ((ret = sqlite3_prepare_v2(gDBHandle, pQuery, strlen(pQuery), &gStmt, NULL)) == SQLITE_OK)
646 LogDebug("Prepare Query Success");
651 LogDebug("Prepare Query Fail [" << ret "]");
652 return MSG_ERR_DB_PREPARE;
659 MSG_ERROR_T MsgStepQuery()
663 ret = sqlite3_step(gStmt);
665 if (ret == SQLITE_ROW)
667 LogDebug("MsgStepQuery() SQLITE_ROW");
668 return MSG_ERR_DB_ROW;
670 else if (ret == SQLITE_DONE)
672 LogDebug("MsgStepQuery() SQLITE_DONE");
673 return MSG_ERR_DB_DONE;
677 LogDebug("MsgStepQuery() Fail [" << ret << "]");
678 return MSG_ERR_DB_STEP;
685 void MsgFinalizeQuery()
687 sqlite3_finalize(gStmt);
692 int MsgColumnInt(int ColumnIndex)
694 return sqlite3_column_int(gStmt, ColumnIndex);
698 const unsigned char* MsgColumnText(int ColumnIndex)
700 return sqlite3_column_text(gStmt, ColumnIndex);
704 const void* MsgColumnBlob(int ColumnIndex)
706 return sqlite3_column_blob(gStmt, ColumnIndex);
710 MSG_ERROR_T MsgBeginTrans()
714 ret = sqlite3_exec(gDBHandle, "BEGIN deferred;", 0, 0, NULL);
716 if (ret == SQLITE_OK)
718 LogDebug("Begin Transaction Success");
723 LogDebug("Begin Transaction Fail [" << ret "]");
724 return MSG_ERR_DB_EXEC;
731 MSG_ERROR_T MsgEndTrans(bool Success)
737 ret = sqlite3_exec(gDBHandle, "END;", 0, 0, NULL);
741 ret = sqlite3_exec(gDBHandle, "rollback", 0, 0, NULL);
742 ret = sqlite3_exec(gDBHandle, "END;", 0, 0, NULL);
745 if (ret == SQLITE_OK)
747 LogDebug("End Transaction Success");
752 LogDebug("End Transaction Fail [" << ret << "]");
753 return MSG_ERR_DB_EXEC;
760 int MsgGetColumnToInt(int RowIndex)
762 char* pTemp = gQueryResult[RowIndex];
772 nTemp = (int)strtol(pTemp, (char**)NULL, 10);
774 // nTemp = atoi(pTemp);
780 char MsgGetColumnToChar(int RowIndex)
782 char* pTemp = gQueryResult[RowIndex];
794 void MsgGetColumnToString(int RowIndex, int Length, char *pString)
796 char* pTemp = gQueryResult[RowIndex];
804 strncpy(pString, pTemp, Length);
808 MSG_ERROR_T MsgGetRowId(const char *pTableName, unsigned int *pRowId)
810 int ret = 0, nRowId = 0, nRowCnt = 0;
813 if (pTableName == NULL || pRowId == NULL)
814 return MSG_ERR_INVALID_PARAMETER;
816 LogDebug("Table Name [" << pTableName << "]");
818 memset(strQuery, 0x00, sizeof(strQuery));
819 snprintf(strQuery, sizeof(strQuery), "select max(rowid) from %s", pTableName);
821 ret = MsgGetTable(strQuery, &nRowCnt);
823 if (ret == SQLITE_OK)
825 nRowId = MsgGetColumnToInt(1);
827 if ((nRowCnt <= 1) && (nRowId == 0))
830 *pRowId = nRowId + 1;
834 LogDebug("MsgGetRowId failed");
837 return MSG_ERR_DB_GETTABLE;
842 LogDebug("Row ID [" << *pRowId << "]");
848 void MsgReleaseMemoryDB()
852 freeSize = sqlite3_release_memory(-1);
854 LogDebug("freed memory size (bytes) : [" << freeSize << "]");