diff options
Diffstat (limited to 'src/dpl/db/src/sql_connection.cpp')
-rw-r--r-- | src/dpl/db/src/sql_connection.cpp | 1169 |
1 files changed, 576 insertions, 593 deletions
diff --git a/src/dpl/db/src/sql_connection.cpp b/src/dpl/db/src/sql_connection.cpp index 4bee5de..3cd274e 100644 --- a/src/dpl/db/src/sql_connection.cpp +++ b/src/dpl/db/src/sql_connection.cpp @@ -35,834 +35,817 @@ namespace CCHECKER { namespace DB { -namespace // anonymous -{ +namespace { // anonymous class ScopedNotifyAll : - public Noncopyable -{ - private: - SqlConnection::SynchronizationObject *m_synchronizationObject; - - public: - explicit ScopedNotifyAll( - SqlConnection::SynchronizationObject *synchronizationObject) : - m_synchronizationObject(synchronizationObject) - {} - - ~ScopedNotifyAll() - { - if (!m_synchronizationObject) { - return; - } - - LogDebug("Notifying after successful synchronize"); - m_synchronizationObject->NotifyAll(); - } + public Noncopyable { +private: + SqlConnection::SynchronizationObject *m_synchronizationObject; + +public: + explicit ScopedNotifyAll( + SqlConnection::SynchronizationObject *synchronizationObject) : + m_synchronizationObject(synchronizationObject) + {} + + ~ScopedNotifyAll() + { + if (!m_synchronizationObject) { + return; + } + + LogDebug("Notifying after successful synchronize"); + m_synchronizationObject->NotifyAll(); + } }; } // namespace anonymous SqlConnection::DataCommand::DataCommand(SqlConnection *connection, - const char *buffer) : - m_masterConnection(connection), - m_stmt(NULL) -{ - Assert(connection != NULL); - - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get()); - - for (;;) { - int ret = sqlite3_prepare_v2(connection->m_connection, - buffer, strlen(buffer), - &m_stmt, NULL); - - if (ret == SQLITE_OK) { - LogDebug("Data command prepared successfuly"); - break; - } else if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while preparing SQL command"); - - // Synchronize if synchronization object is available - if (connection->m_synchronizationObject) { - LogDebug("Performing synchronization"); - connection->m_synchronizationObject->Synchronize(); - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - const char *error = sqlite3_errmsg(m_masterConnection->m_connection); - - LogDebug("SQL prepare data command failed"); - LogDebug(" Statement: " << buffer); - LogDebug(" Error: " << error); - - ThrowMsg(Exception::SyntaxError, error); - } - - LogDebug("Prepared data command: " << buffer); - - // Increment stored data command count - ++m_masterConnection->m_dataCommandsCount; + const char *buffer) : + m_masterConnection(connection), + m_stmt(NULL) +{ + Assert(connection != NULL); + // Notify all after potentially synchronized database connection access + ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get()); + + for (;;) { + int ret = sqlite3_prepare_v2(connection->m_connection, + buffer, strlen(buffer), + &m_stmt, NULL); + + if (ret == SQLITE_OK) { + LogDebug("Data command prepared successfuly"); + break; + } else if (ret == SQLITE_BUSY) { + LogDebug("Collision occurred while preparing SQL command"); + + // Synchronize if synchronization object is available + if (connection->m_synchronizationObject) { + LogDebug("Performing synchronization"); + connection->m_synchronizationObject->Synchronize(); + continue; + } + + // No synchronization object defined. Fail. + } + + // Fatal error + const char *error = sqlite3_errmsg(m_masterConnection->m_connection); + LogDebug("SQL prepare data command failed"); + LogDebug(" Statement: " << buffer); + LogDebug(" Error: " << error); + ThrowMsg(Exception::SyntaxError, error); + } + + LogDebug("Prepared data command: " << buffer); + // Increment stored data command count + ++m_masterConnection->m_dataCommandsCount; } SqlConnection::DataCommand::~DataCommand() { - LogDebug("SQL data command finalizing"); + LogDebug("SQL data command finalizing"); - if (sqlite3_finalize(m_stmt) != SQLITE_OK) { - LogDebug("Failed to finalize data command"); - } + if (sqlite3_finalize(m_stmt) != SQLITE_OK) { + LogDebug("Failed to finalize data command"); + } - // Decrement stored data command count - --m_masterConnection->m_dataCommandsCount; + // Decrement stored data command count + --m_masterConnection->m_dataCommandsCount; } void SqlConnection::DataCommand::CheckBindResult(int result) { - if (result != SQLITE_OK) { - const char *error = sqlite3_errmsg( - m_masterConnection->m_connection); - - LogDebug("Failed to bind SQL statement parameter"); - LogDebug(" Error: " << error); - - ThrowMsg(Exception::SyntaxError, error); - } + if (result != SQLITE_OK) { + const char *error = sqlite3_errmsg( + m_masterConnection->m_connection); + LogDebug("Failed to bind SQL statement parameter"); + LogDebug(" Error: " << error); + ThrowMsg(Exception::SyntaxError, error); + } } void SqlConnection::DataCommand::BindNull( - SqlConnection::ArgumentIndex position) + SqlConnection::ArgumentIndex position) { - CheckBindResult(sqlite3_bind_null(m_stmt, position)); - LogDebug("SQL data command bind null: [" - << position << "]"); + CheckBindResult(sqlite3_bind_null(m_stmt, position)); + LogDebug("SQL data command bind null: [" + << position << "]"); } void SqlConnection::DataCommand::BindInteger( - SqlConnection::ArgumentIndex position, - int value) + SqlConnection::ArgumentIndex position, + int value) { - CheckBindResult(sqlite3_bind_int(m_stmt, position, value)); - LogDebug("SQL data command bind integer: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_int(m_stmt, position, value)); + LogDebug("SQL data command bind integer: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindInt8( - SqlConnection::ArgumentIndex position, - int8_t value) + SqlConnection::ArgumentIndex position, + int8_t value) { - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast<int>(value))); - LogDebug("SQL data command bind int8: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_int(m_stmt, position, + static_cast<int>(value))); + LogDebug("SQL data command bind int8: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindInt16( - SqlConnection::ArgumentIndex position, - int16_t value) + SqlConnection::ArgumentIndex position, + int16_t value) { - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast<int>(value))); - LogDebug("SQL data command bind int16: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_int(m_stmt, position, + static_cast<int>(value))); + LogDebug("SQL data command bind int16: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindInt32( - SqlConnection::ArgumentIndex position, - int32_t value) + SqlConnection::ArgumentIndex position, + int32_t value) { - CheckBindResult(sqlite3_bind_int(m_stmt, position, - static_cast<int>(value))); - LogDebug("SQL data command bind int32: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_int(m_stmt, position, + static_cast<int>(value))); + LogDebug("SQL data command bind int32: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindInt64( - SqlConnection::ArgumentIndex position, - int64_t value) + SqlConnection::ArgumentIndex position, + int64_t value) { - CheckBindResult(sqlite3_bind_int64(m_stmt, position, - static_cast<sqlite3_int64>(value))); - LogDebug("SQL data command bind int64: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_int64(m_stmt, position, + static_cast<sqlite3_int64>(value))); + LogDebug("SQL data command bind int64: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindFloat( - SqlConnection::ArgumentIndex position, - float value) + SqlConnection::ArgumentIndex position, + float value) { - CheckBindResult(sqlite3_bind_double(m_stmt, position, - static_cast<double>(value))); - LogDebug("SQL data command bind float: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_double(m_stmt, position, + static_cast<double>(value))); + LogDebug("SQL data command bind float: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindDouble( - SqlConnection::ArgumentIndex position, - double value) + SqlConnection::ArgumentIndex position, + double value) { - CheckBindResult(sqlite3_bind_double(m_stmt, position, value)); - LogDebug("SQL data command bind double: [" - << position << "] -> " << value); + CheckBindResult(sqlite3_bind_double(m_stmt, position, value)); + LogDebug("SQL data command bind double: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const char *value) + SqlConnection::ArgumentIndex position, + const char *value) { - if (!value) { - BindNull(position); - return; - } + if (!value) { + BindNull(position); + return; + } - // Assume that text may disappear - CheckBindResult(sqlite3_bind_text(m_stmt, position, - value, strlen(value), - SQLITE_TRANSIENT)); - - LogDebug("SQL data command bind string: [" - << position << "] -> " << value); + // Assume that text may disappear + CheckBindResult(sqlite3_bind_text(m_stmt, position, + value, strlen(value), + SQLITE_TRANSIENT)); + LogDebug("SQL data command bind string: [" + << position << "] -> " << value); } void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const String &value) + SqlConnection::ArgumentIndex position, + const String &value) { - BindString(position, ToUTF8String(value).c_str()); + BindString(position, ToUTF8String(value).c_str()); } void SqlConnection::DataCommand::BindInteger( - SqlConnection::ArgumentIndex position, - const Optional<int> &value) + SqlConnection::ArgumentIndex position, + const Optional<int> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindInteger(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindInteger(position, *value); + } } void SqlConnection::DataCommand::BindInt8( - SqlConnection::ArgumentIndex position, - const Optional<int8_t> &value) + SqlConnection::ArgumentIndex position, + const Optional<int8_t> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindInt8(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindInt8(position, *value); + } } void SqlConnection::DataCommand::BindInt16( - SqlConnection::ArgumentIndex position, - const Optional<int16_t> &value) + SqlConnection::ArgumentIndex position, + const Optional<int16_t> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindInt16(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindInt16(position, *value); + } } void SqlConnection::DataCommand::BindInt32( - SqlConnection::ArgumentIndex position, - const Optional<int32_t> &value) + SqlConnection::ArgumentIndex position, + const Optional<int32_t> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindInt32(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindInt32(position, *value); + } } void SqlConnection::DataCommand::BindInt64( - SqlConnection::ArgumentIndex position, - const Optional<int64_t> &value) + SqlConnection::ArgumentIndex position, + const Optional<int64_t> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindInt64(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindInt64(position, *value); + } } void SqlConnection::DataCommand::BindFloat( - SqlConnection::ArgumentIndex position, - const Optional<float> &value) + SqlConnection::ArgumentIndex position, + const Optional<float> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindFloat(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindFloat(position, *value); + } } void SqlConnection::DataCommand::BindDouble( - SqlConnection::ArgumentIndex position, - const Optional<double> &value) + SqlConnection::ArgumentIndex position, + const Optional<double> &value) { - if (value.IsNull()) { - BindNull(position); - } else { - BindDouble(position, *value); - } + if (value.IsNull()) { + BindNull(position); + } else { + BindDouble(position, *value); + } } void SqlConnection::DataCommand::BindString( - SqlConnection::ArgumentIndex position, - const Optional<String> &value) + SqlConnection::ArgumentIndex position, + const Optional<String> &value) { - if (!!value) { - BindString(position, ToUTF8String(*value).c_str()); - } else { - BindNull(position); - } + if (!!value) { + BindString(position, ToUTF8String(*value).c_str()); + } else { + BindNull(position); + } } bool SqlConnection::DataCommand::Step() { - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll( - m_masterConnection->m_synchronizationObject.get()); - - for (;;) { - int ret = sqlite3_step(m_stmt); - - if (ret == SQLITE_ROW) { - LogDebug("SQL data command step ROW"); - return true; - } else if (ret == SQLITE_DONE) { - LogDebug("SQL data command step DONE"); - return false; - } else if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while executing SQL command"); - - // Synchronize if synchronization object is available - if (m_masterConnection->m_synchronizationObject) { - LogDebug("Performing synchronization"); - - m_masterConnection-> - m_synchronizationObject->Synchronize(); - - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - const char *error = sqlite3_errmsg(m_masterConnection->m_connection); - - LogDebug("SQL step data command failed"); - LogDebug(" Error: " << error); - - ThrowMsg(Exception::InternalError, error); - } + // Notify all after potentially synchronized database connection access + ScopedNotifyAll notifyAll( + m_masterConnection->m_synchronizationObject.get()); + + for (;;) { + int ret = sqlite3_step(m_stmt); + + if (ret == SQLITE_ROW) { + LogDebug("SQL data command step ROW"); + return true; + } else if (ret == SQLITE_DONE) { + LogDebug("SQL data command step DONE"); + return false; + } else if (ret == SQLITE_BUSY) { + LogDebug("Collision occurred while executing SQL command"); + + // Synchronize if synchronization object is available + if (m_masterConnection->m_synchronizationObject) { + LogDebug("Performing synchronization"); + m_masterConnection-> + m_synchronizationObject->Synchronize(); + continue; + } + + // No synchronization object defined. Fail. + } + + // Fatal error + const char *error = sqlite3_errmsg(m_masterConnection->m_connection); + LogDebug("SQL step data command failed"); + LogDebug(" Error: " << error); + ThrowMsg(Exception::InternalError, error); + } } void SqlConnection::DataCommand::Reset() { - /* - * According to: - * http://www.sqlite.org/c3ref/stmt.html - * - * if last sqlite3_step command on this stmt returned an error, - * then sqlite3_reset will return that error, althought it is not an error. - * So sqlite3_reset allways succedes. - */ - sqlite3_reset(m_stmt); - - LogDebug("SQL data command reset"); + /* + * According to: + * http://www.sqlite.org/c3ref/stmt.html + * + * if last sqlite3_step command on this stmt returned an error, + * then sqlite3_reset will return that error, althought it is not an error. + * So sqlite3_reset allways succedes. + */ + sqlite3_reset(m_stmt); + LogDebug("SQL data command reset"); } void SqlConnection::DataCommand::CheckColumnIndex( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - if (column < 0 || column >= sqlite3_column_count(m_stmt)) { - ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds"); - } + if (column < 0 || column >= sqlite3_column_count(m_stmt)) { + ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds"); + } } bool SqlConnection::DataCommand::IsColumnNull( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column type: [" << column << "]"); - CheckColumnIndex(column); - return sqlite3_column_type(m_stmt, column) == SQLITE_NULL; + LogDebug("SQL data command get column type: [" << column << "]"); + CheckColumnIndex(column); + return sqlite3_column_type(m_stmt, column) == SQLITE_NULL; } int SqlConnection::DataCommand::GetColumnInteger( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column integer: [" << column << "]"); - CheckColumnIndex(column); - int value = sqlite3_column_int(m_stmt, column); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column integer: [" << column << "]"); + CheckColumnIndex(column); + int value = sqlite3_column_int(m_stmt, column); + LogDebug(" Value: " << value); + return value; } int8_t SqlConnection::DataCommand::GetColumnInt8( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column int8: [" << column << "]"); - CheckColumnIndex(column); - int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column int8: [" << column << "]"); + CheckColumnIndex(column); + int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return value; } int16_t SqlConnection::DataCommand::GetColumnInt16( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column int16: [" << column << "]"); - CheckColumnIndex(column); - int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column int16: [" << column << "]"); + CheckColumnIndex(column); + int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return value; } int32_t SqlConnection::DataCommand::GetColumnInt32( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column int32: [" << column << "]"); - CheckColumnIndex(column); - int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column int32: [" << column << "]"); + CheckColumnIndex(column); + int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return value; } int64_t SqlConnection::DataCommand::GetColumnInt64( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column int64: [" << column << "]"); - CheckColumnIndex(column); - int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column)); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column int64: [" << column << "]"); + CheckColumnIndex(column); + int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column)); + LogDebug(" Value: " << value); + return value; } float SqlConnection::DataCommand::GetColumnFloat( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column float: [" << column << "]"); - CheckColumnIndex(column); - float value = static_cast<float>(sqlite3_column_double(m_stmt, column)); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column float: [" << column << "]"); + CheckColumnIndex(column); + float value = static_cast<float>(sqlite3_column_double(m_stmt, column)); + LogDebug(" Value: " << value); + return value; } double SqlConnection::DataCommand::GetColumnDouble( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column double: [" << column << "]"); - CheckColumnIndex(column); - double value = sqlite3_column_double(m_stmt, column); - LogDebug(" Value: " << value); - return value; + LogDebug("SQL data command get column double: [" << column << "]"); + CheckColumnIndex(column); + double value = sqlite3_column_double(m_stmt, column); + LogDebug(" Value: " << value); + return value; } std::string SqlConnection::DataCommand::GetColumnString( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column string: [" << column << "]"); - CheckColumnIndex(column); - - const char *value = reinterpret_cast<const char *>( - sqlite3_column_text(m_stmt, column)); - - LogDebug("Value: " << (value ? value : "NULL")); + LogDebug("SQL data command get column string: [" << column << "]"); + CheckColumnIndex(column); + const char *value = reinterpret_cast<const char *>( + sqlite3_column_text(m_stmt, column)); + LogDebug("Value: " << (value ? value : "NULL")); - if (value == NULL) { - return std::string(); - } + if (value == NULL) { + return std::string(); + } - return std::string(value); + return std::string(value); } Optional<int> SqlConnection::DataCommand::GetColumnOptionalInteger( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional integer: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<int>::Null; - } - int value = sqlite3_column_int(m_stmt, column); - LogDebug(" Value: " << value); - return Optional<int>(value); + LogDebug("SQL data command get column optional integer: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<int>::Null; + } + + int value = sqlite3_column_int(m_stmt, column); + LogDebug(" Value: " << value); + return Optional<int>(value); } Optional<int8_t> SqlConnection::DataCommand::GetColumnOptionalInt8( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional int8: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<int8_t>::Null; - } - int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return Optional<int8_t>(value); + LogDebug("SQL data command get column optional int8: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<int8_t>::Null; + } + + int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return Optional<int8_t>(value); } Optional<int16_t> SqlConnection::DataCommand::GetColumnOptionalInt16( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional int16: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<int16_t>::Null; - } - int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return Optional<int16_t>(value); + LogDebug("SQL data command get column optional int16: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<int16_t>::Null; + } + + int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return Optional<int16_t>(value); } Optional<int32_t> SqlConnection::DataCommand::GetColumnOptionalInt32( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional int32: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<int32_t>::Null; - } - int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column)); - LogDebug(" Value: " << value); - return Optional<int32_t>(value); + LogDebug("SQL data command get column optional int32: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<int32_t>::Null; + } + + int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column)); + LogDebug(" Value: " << value); + return Optional<int32_t>(value); } Optional<int64_t> SqlConnection::DataCommand::GetColumnOptionalInt64( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional int64: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<int64_t>::Null; - } - int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column)); - LogDebug(" Value: " << value); - return Optional<int64_t>(value); + LogDebug("SQL data command get column optional int64: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<int64_t>::Null; + } + + int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column)); + LogDebug(" Value: " << value); + return Optional<int64_t>(value); } Optional<float> SqlConnection::DataCommand::GetColumnOptionalFloat( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional float: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<float>::Null; - } - float value = static_cast<float>(sqlite3_column_double(m_stmt, column)); - LogDebug(" Value: " << value); - return Optional<float>(value); + LogDebug("SQL data command get column optional float: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<float>::Null; + } + + float value = static_cast<float>(sqlite3_column_double(m_stmt, column)); + LogDebug(" Value: " << value); + return Optional<float>(value); } Optional<double> SqlConnection::DataCommand::GetColumnOptionalDouble( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional double: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<double>::Null; - } - double value = sqlite3_column_double(m_stmt, column); - LogDebug(" Value: " << value); - return Optional<double>(value); + LogDebug("SQL data command get column optional double: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<double>::Null; + } + + double value = sqlite3_column_double(m_stmt, column); + LogDebug(" Value: " << value); + return Optional<double>(value); } Optional<String> SqlConnection::DataCommand::GetColumnOptionalString( - SqlConnection::ColumnIndex column) + SqlConnection::ColumnIndex column) { - LogDebug("SQL data command get column optional string: [" - << column << "]"); - CheckColumnIndex(column); - if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { - return Optional<String>::Null; - } - const char *value = reinterpret_cast<const char *>( - sqlite3_column_text(m_stmt, column)); - LogDebug("Value: " << value); - String s = FromUTF8String(value); - return Optional<String>(s); + LogDebug("SQL data command get column optional string: [" + << column << "]"); + CheckColumnIndex(column); + + if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) { + return Optional<String>::Null; + } + + const char *value = reinterpret_cast<const char *>( + sqlite3_column_text(m_stmt, column)); + LogDebug("Value: " << value); + String s = FromUTF8String(value); + return Optional<String>(s); } void SqlConnection::Connect(const std::string &address, - Flag::Type type, - Flag::Option flag) -{ - if (m_connection != NULL) { - LogDebug("Already connected."); - return; - } - LogDebug("Connecting to DB: " << address << "..."); - - // Connect to database - int result; - if (type & Flag::UseLucene) { - result = db_util_open_with_options( - address.c_str(), - &m_connection, - flag, - NULL); - - m_usingLucene = true; - LogDebug("Lucene index enabled"); - } else { - result = sqlite3_open_v2( - address.c_str(), - &m_connection, - flag, - NULL); - - m_usingLucene = false; - LogDebug("Lucene index disabled"); - } - - if (result == SQLITE_OK) { - LogDebug("Connected to DB"); - } else { - LogDebug("Failed to connect to DB!"); - ThrowMsg(Exception::ConnectionBroken, address); - } - - // Enable foreign keys - TurnOnForeignKeys(); + Flag::Type type, + Flag::Option flag) +{ + if (m_connection != NULL) { + LogDebug("Already connected."); + return; + } + + LogDebug("Connecting to DB: " << address << "..."); + // Connect to database + int result; + + if (type & Flag::UseLucene) { + result = db_util_open_with_options( + address.c_str(), + &m_connection, + flag, + NULL); + m_usingLucene = true; + LogDebug("Lucene index enabled"); + } else { + result = sqlite3_open_v2( + address.c_str(), + &m_connection, + flag, + NULL); + m_usingLucene = false; + LogDebug("Lucene index disabled"); + } + + if (result == SQLITE_OK) { + LogDebug("Connected to DB"); + } else { + LogDebug("Failed to connect to DB!"); + ThrowMsg(Exception::ConnectionBroken, address); + } + + // Enable foreign keys + TurnOnForeignKeys(); } void SqlConnection::Disconnect() { - if (m_connection == NULL) { - LogDebug("Already disconnected."); - return; - } - - LogDebug("Disconnecting from DB..."); + if (m_connection == NULL) { + LogDebug("Already disconnected."); + return; + } - // All stored data commands must be deleted before disconnect - Assert(m_dataCommandsCount == 0 && - "All stored procedures must be deleted" - " before disconnecting SqlConnection"); + LogDebug("Disconnecting from DB..."); + // All stored data commands must be deleted before disconnect + Assert(m_dataCommandsCount == 0 && + "All stored procedures must be deleted" + " before disconnecting SqlConnection"); + int result; - int result; + if (m_usingLucene) { + result = db_util_close(m_connection); + } else { + result = sqlite3_close(m_connection); + } - if (m_usingLucene) { - result = db_util_close(m_connection); - } else { - result = sqlite3_close(m_connection); - } + if (result != SQLITE_OK) { + const char *error = sqlite3_errmsg(m_connection); + LogDebug("SQL close failed"); + LogDebug(" Error: " << error); + Throw(Exception::InternalError); + } - if (result != SQLITE_OK) { - const char *error = sqlite3_errmsg(m_connection); - LogDebug("SQL close failed"); - LogDebug(" Error: " << error); - Throw(Exception::InternalError); - } - - m_connection = NULL; - - LogDebug("Disconnected from DB"); + m_connection = NULL; + LogDebug("Disconnected from DB"); } bool SqlConnection::CheckTableExist(const char *tableName) { - if (m_connection == NULL) { - LogDebug("Cannot execute command. Not connected to DB!"); - return false; - } - - DataCommandAutoPtr command = - PrepareDataCommand("select tbl_name from sqlite_master where name=?;"); + if (m_connection == NULL) { + LogDebug("Cannot execute command. Not connected to DB!"); + return false; + } - command->BindString(1, tableName); + DataCommandAutoPtr command = + PrepareDataCommand("select tbl_name from sqlite_master where name=?;"); + command->BindString(1, tableName); - if (!command->Step()) { - LogDebug("No matching records in table"); - return false; - } + if (!command->Step()) { + LogDebug("No matching records in table"); + return false; + } - return command->GetColumnString(0) == tableName; + return command->GetColumnString(0) == tableName; } SqlConnection::SqlConnection(const std::string &address, - Flag::Type flag, - Flag::Option option, - SynchronizationObject *synchronizationObject) : - m_connection(NULL), - m_usingLucene(false), - m_dataCommandsCount(0), - m_synchronizationObject(synchronizationObject) + Flag::Type flag, + Flag::Option option, + SynchronizationObject *synchronizationObject) : + m_connection(NULL), + m_usingLucene(false), + m_dataCommandsCount(0), + m_synchronizationObject(synchronizationObject) { - LogDebug("Opening database connection to: " << address); + LogDebug("Opening database connection to: " << address); + // Connect to DB + SqlConnection::Connect(address, flag, option); - // Connect to DB - SqlConnection::Connect(address, flag, option); - - if (!m_synchronizationObject) { - LogDebug("No synchronization object defined"); - } + if (!m_synchronizationObject) { + LogDebug("No synchronization object defined"); + } } SqlConnection::~SqlConnection() { - LogDebug("Closing database connection"); - - // Disconnect from DB - Try - { - SqlConnection::Disconnect(); - } - Catch(Exception::Base) - { - LogDebug("Failed to disconnect from database"); - } + LogDebug("Closing database connection"); + // Disconnect from DB + Try { + SqlConnection::Disconnect(); + } + Catch(Exception::Base) { + LogDebug("Failed to disconnect from database"); + } } void SqlConnection::ExecCommand(const char *format, ...) { - if (m_connection == NULL) { - LogDebug("Cannot execute command. Not connected to DB!"); - return; - } - - if (format == NULL) { - LogDebug("Null query!"); - ThrowMsg(Exception::SyntaxError, "Null statement"); - } - - char *rawBuffer; - - va_list args; - va_start(args, format); - - if (vasprintf(&rawBuffer, format, args) == -1) { - rawBuffer = NULL; - } - - va_end(args); - - ScopedFree<char> buffer(rawBuffer); - - if (!buffer) { - LogDebug("Failed to allocate statement string"); - return; - } - - LogDebug("Executing SQL command: " << buffer.Get()); - - // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(m_synchronizationObject.get()); - - for (;;) { - char *errorBuffer; - - int ret = sqlite3_exec(m_connection, - buffer.Get(), - NULL, - NULL, - &errorBuffer); - - std::string errorMsg; - - // Take allocated error buffer - if (errorBuffer != NULL) { - errorMsg = errorBuffer; - sqlite3_free(errorBuffer); - } - - if (ret == SQLITE_OK) { - return; - } - - if (ret == SQLITE_BUSY) { - LogDebug("Collision occurred while executing SQL command"); - - // Synchronize if synchronization object is available - if (m_synchronizationObject) { - LogDebug("Performing synchronization"); - m_synchronizationObject->Synchronize(); - continue; - } - - // No synchronization object defined. Fail. - } - - // Fatal error - LogDebug("Failed to execute SQL command. Error: " << errorMsg); - ThrowMsg(Exception::SyntaxError, errorMsg); - } + if (m_connection == NULL) { + LogDebug("Cannot execute command. Not connected to DB!"); + return; + } + + if (format == NULL) { + LogDebug("Null query!"); + ThrowMsg(Exception::SyntaxError, "Null statement"); + } + + char *rawBuffer; + va_list args; + va_start(args, format); + + if (vasprintf(&rawBuffer, format, args) == -1) { + rawBuffer = NULL; + } + + va_end(args); + ScopedFree<char> buffer(rawBuffer); + + if (!buffer) { + LogDebug("Failed to allocate statement string"); + return; + } + + LogDebug("Executing SQL command: " << buffer.Get()); + // Notify all after potentially synchronized database connection access + ScopedNotifyAll notifyAll(m_synchronizationObject.get()); + + for (;;) { + char *errorBuffer; + int ret = sqlite3_exec(m_connection, + buffer.Get(), + NULL, + NULL, + &errorBuffer); + std::string errorMsg; + + // Take allocated error buffer + if (errorBuffer != NULL) { + errorMsg = errorBuffer; + sqlite3_free(errorBuffer); + } + + if (ret == SQLITE_OK) { + return; + } + + if (ret == SQLITE_BUSY) { + LogDebug("Collision occurred while executing SQL command"); + + // Synchronize if synchronization object is available + if (m_synchronizationObject) { + LogDebug("Performing synchronization"); + m_synchronizationObject->Synchronize(); + continue; + } + + // No synchronization object defined. Fail. + } + + // Fatal error + LogDebug("Failed to execute SQL command. Error: " << errorMsg); + ThrowMsg(Exception::SyntaxError, errorMsg); + } } SqlConnection::DataCommandAutoPtr SqlConnection::PrepareDataCommand( - const char *format, - ...) + const char *format, + ...) { - if (m_connection == NULL) { - LogDebug("Cannot execute data command. Not connected to DB!"); - return DataCommandAutoPtr(); - } - - char *rawBuffer; - - va_list args; - va_start(args, format); - - if (vasprintf(&rawBuffer, format, args) == -1) { - rawBuffer = NULL; - } + if (m_connection == NULL) { + LogDebug("Cannot execute data command. Not connected to DB!"); + return DataCommandAutoPtr(); + } - va_end(args); + char *rawBuffer; + va_list args; + va_start(args, format); - ScopedFree<char> buffer(rawBuffer); + if (vasprintf(&rawBuffer, format, args) == -1) { + rawBuffer = NULL; + } - if (!buffer) { - LogDebug("Failed to allocate statement string"); - return DataCommandAutoPtr(); - } + va_end(args); + ScopedFree<char> buffer(rawBuffer); - LogDebug("Executing SQL data command: " << buffer.Get()); + if (!buffer) { + LogDebug("Failed to allocate statement string"); + return DataCommandAutoPtr(); + } - return DataCommandAutoPtr(new DataCommand(this, buffer.Get())); + LogDebug("Executing SQL data command: " << buffer.Get()); + return DataCommandAutoPtr(new DataCommand(this, buffer.Get())); } SqlConnection::RowID SqlConnection::GetLastInsertRowID() const { - return static_cast<RowID>(sqlite3_last_insert_rowid(m_connection)); + return static_cast<RowID>(sqlite3_last_insert_rowid(m_connection)); } void SqlConnection::TurnOnForeignKeys() { - ExecCommand("PRAGMA foreign_keys = ON;"); + ExecCommand("PRAGMA foreign_keys = ON;"); } SqlConnection::SynchronizationObject * SqlConnection::AllocDefaultSynchronizationObject() { - return new NaiveSynchronizationObject(); + return new NaiveSynchronizationObject(); } void SqlConnection::BeginTransaction() { - ExecCommand("BEGIN;"); + ExecCommand("BEGIN;"); } void SqlConnection::RollbackTransaction() { - ExecCommand("ROLLBACK;"); + ExecCommand("ROLLBACK;"); } void SqlConnection::CommitTransaction() { - ExecCommand("COMMIT;"); + ExecCommand("COMMIT;"); } } // namespace DB |