SQLiteConnection.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /*
  2. * SQLiteConnection.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "SQLiteConnection.h"
  12. #include <sqlite3.h>
  13. static void on_sqlite_error( sqlite3 * connection, [[maybe_unused]] int result )
  14. {
  15. if ( result != SQLITE_OK )
  16. {
  17. printf( "sqlite error: %s\n", sqlite3_errmsg( connection ) );
  18. }
  19. assert( result == SQLITE_OK );
  20. }
  21. SQLiteStatement::SQLiteStatement( SQLiteInstance & instance, sqlite3_stmt * statement ):
  22. m_instance( instance ),
  23. m_statement( statement )
  24. { }
  25. SQLiteStatement::~SQLiteStatement( )
  26. {
  27. int result = sqlite3_finalize( m_statement );
  28. on_sqlite_error( m_instance.m_connection, result );
  29. }
  30. bool SQLiteStatement::execute( )
  31. {
  32. int result = sqlite3_step( m_statement );
  33. switch ( result )
  34. {
  35. case SQLITE_DONE:
  36. return false;
  37. case SQLITE_ROW:
  38. return true;
  39. default:
  40. on_sqlite_error( m_instance.m_connection, result );
  41. return false;
  42. }
  43. }
  44. void SQLiteStatement::reset( )
  45. {
  46. int result = sqlite3_reset( m_statement );
  47. on_sqlite_error( m_instance.m_connection, result );
  48. }
  49. void SQLiteStatement::clear()
  50. {
  51. int result = sqlite3_clear_bindings(m_statement);
  52. on_sqlite_error(m_instance.m_connection, result);
  53. }
  54. void SQLiteStatement::setBindSingle( size_t index, double const & value )
  55. {
  56. int result = sqlite3_bind_double( m_statement, static_cast<int>(index), value );
  57. on_sqlite_error( m_instance.m_connection, result );
  58. }
  59. void SQLiteStatement::setBindSingle(size_t index, uint8_t const & value)
  60. {
  61. int result = sqlite3_bind_int(m_statement, static_cast<int>(index), value);
  62. on_sqlite_error(m_instance.m_connection, result);
  63. }
  64. void SQLiteStatement::setBindSingle(size_t index, uint16_t const & value)
  65. {
  66. int result = sqlite3_bind_int(m_statement, static_cast<int>(index), value);
  67. on_sqlite_error(m_instance.m_connection, result);
  68. }
  69. void SQLiteStatement::setBindSingle(size_t index, uint32_t const & value)
  70. {
  71. int result = sqlite3_bind_int(m_statement, static_cast<int>(index), value);
  72. on_sqlite_error(m_instance.m_connection, result);
  73. }
  74. void SQLiteStatement::setBindSingle( size_t index, int32_t const & value )
  75. {
  76. int result = sqlite3_bind_int( m_statement, static_cast<int>( index ), value );
  77. on_sqlite_error( m_instance.m_connection, result );
  78. }
  79. void SQLiteStatement::setBindSingle( size_t index, int64_t const & value )
  80. {
  81. int result = sqlite3_bind_int64( m_statement, static_cast<int>( index ), value );
  82. on_sqlite_error( m_instance.m_connection, result );
  83. }
  84. void SQLiteStatement::setBindSingle( size_t index, std::string const & value )
  85. {
  86. int result = sqlite3_bind_text( m_statement, static_cast<int>( index ), value.data(), static_cast<int>( value.size() ), SQLITE_STATIC );
  87. on_sqlite_error( m_instance.m_connection, result );
  88. }
  89. void SQLiteStatement::setBindSingle( size_t index, char const * value )
  90. {
  91. int result = sqlite3_bind_text( m_statement, static_cast<int>( index ), value, -1, SQLITE_STATIC );
  92. on_sqlite_error( m_instance.m_connection, result );
  93. }
  94. void SQLiteStatement::getColumnSingle( size_t index, double & value )
  95. {
  96. value = sqlite3_column_double( m_statement, static_cast<int>( index ) );
  97. }
  98. void SQLiteStatement::getColumnSingle( size_t index, uint8_t & value )
  99. {
  100. value = static_cast<uint8_t>(sqlite3_column_int( m_statement, static_cast<int>( index ) ));
  101. }
  102. void SQLiteStatement::getColumnSingle(size_t index, uint16_t & value)
  103. {
  104. value = static_cast<uint16_t>(sqlite3_column_int(m_statement, static_cast<int>(index)));
  105. }
  106. void SQLiteStatement::getColumnSingle( size_t index, int32_t & value )
  107. {
  108. value = sqlite3_column_int( m_statement, static_cast<int>( index ) );
  109. }
  110. void SQLiteStatement::getColumnSingle(size_t index, uint32_t & value)
  111. {
  112. value = sqlite3_column_int(m_statement, static_cast<int>(index));
  113. }
  114. void SQLiteStatement::getColumnSingle( size_t index, int64_t & value )
  115. {
  116. value = sqlite3_column_int64( m_statement, static_cast<int>( index ) );
  117. }
  118. void SQLiteStatement::getColumnSingle( size_t index, std::string & value )
  119. {
  120. auto value_raw = sqlite3_column_text(m_statement, static_cast<int>(index));
  121. value = reinterpret_cast<char const*>( value_raw );
  122. }
  123. void SQLiteStatement::getColumnBlob(size_t index, std::byte * value, [[maybe_unused]] size_t capacity)
  124. {
  125. auto * blob_data = sqlite3_column_blob(m_statement, static_cast<int>(index));
  126. size_t blob_size = sqlite3_column_bytes(m_statement, static_cast<int>(index));
  127. assert(blob_size < capacity);
  128. std::copy_n(static_cast<std::byte const*>(blob_data), blob_size, value);
  129. value[blob_size] = std::byte(0);
  130. }
  131. SQLiteInstancePtr SQLiteInstance::open( std::string const & db_path, bool allow_write)
  132. {
  133. int flags = allow_write ? (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) : SQLITE_OPEN_READONLY;
  134. sqlite3 * connection;
  135. int result = sqlite3_open_v2( db_path.c_str( ), &connection, flags, nullptr );
  136. on_sqlite_error( connection, result );
  137. assert(result == SQLITE_OK);
  138. if ( result == SQLITE_OK )
  139. return SQLiteInstancePtr( new SQLiteInstance( connection ) );
  140. sqlite3_close( connection );
  141. return SQLiteInstancePtr( );
  142. }
  143. SQLiteInstance::SQLiteInstance( sqlite3 * connection ):
  144. m_connection( connection )
  145. { }
  146. SQLiteInstance::~SQLiteInstance( )
  147. {
  148. int result = sqlite3_close( m_connection );
  149. on_sqlite_error( m_connection, result );
  150. }
  151. SQLiteStatementPtr SQLiteInstance::prepare( std::string const & sql_text )
  152. {
  153. sqlite3_stmt * statement;
  154. int result = sqlite3_prepare_v2( m_connection, sql_text.data(), static_cast<int>( sql_text.size()), &statement, nullptr );
  155. on_sqlite_error( m_connection, result );
  156. if ( result == SQLITE_OK )
  157. return SQLiteStatementPtr( new SQLiteStatement( *this, statement ) );
  158. sqlite3_finalize( statement );
  159. return SQLiteStatementPtr( );
  160. }