diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index e8cae8d5f..f21df0982 100755 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -155,7 +155,6 @@ - diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index f4d9e5d76..81dc09fd0 100755 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -123,9 +123,6 @@ src\db - - src\db - src\db diff --git a/src/core/db/Connection.cpp b/src/core/db/Connection.cpp index 0a80fe3fb..dc0f05edb 100644 --- a/src/core/db/Connection.cpp +++ b/src/core/db/Connection.cpp @@ -49,218 +49,135 @@ Connection::Connection() this->UpdateReferenceCount(true); } -Connection::~Connection(){ +Connection::~Connection() { this->Close(); this->UpdateReferenceCount(false); } -////////////////////////////////////////// -///\brief -///Open a connection to the database -/// -///\param database -///Connection string. In SQLite this is the filename -/// -///\param options -///Bit options. Unused at the moment -/// -///\param cache -///Cachesize in KB -/// -///\returns -///Error code returned by SQLite -////////////////////////////////////////// int Connection::Open(const char *database, unsigned int options, unsigned int cache) { int error; #ifdef UTF_WIDECHAR - error = sqlite3_open16(database,&this->connection); + error = sqlite3_open16(database, &this->connection); #else - error = sqlite3_open(database,&this->connection); + error = sqlite3_open(database, &this->connection); #endif - if (error==SQLITE_OK) { + if (error == SQLITE_OK) { this->Initialize(cache); } return error; } -////////////////////////////////////////// -///\brief -///Open a connection to the database -/// -///\param database -///Connection string. In SQLite this is the filename -/// -///\param options -///Bit options. Unused at the moment -/// -///\param cache -///Cachesize in KB -/// -///\returns -///Error code returned by SQLite -////////////////////////////////////////// -int Connection::Open(const std::string &database,unsigned int options,unsigned int cache){ +int Connection::Open(const std::string &database, unsigned int options, unsigned int cache) { int error; + #ifdef WIN32 std::wstring wdatabase = u8to16(database); - error = sqlite3_open16(wdatabase.c_str(),&this->connection); + error = sqlite3_open16(wdatabase.c_str(), &this->connection); #else - error = sqlite3_open(database.c_str(),&this->connection); + error = sqlite3_open(database.c_str(), &this->connection); #endif - if (error==SQLITE_OK) { + if (error == SQLITE_OK) { this->Initialize(cache); } return error; } -////////////////////////////////////////// -///\brief -///Close connection to the database -/// -///\returns -///Errorcode ( musik::core::db::ReturnCode ) -////////////////////////////////////////// int Connection::Close() { if (sqlite3_close(this->connection) == SQLITE_OK) { this->connection = 0; - return musik::core::db::Okay; + return Okay; } - return musik::core::db::Error; + return Error; } -////////////////////////////////////////// -///\brief -///Execute a SQL string -/// -///\param sql -///SQL to execute -/// -///\returns -///Errorcode musik::core::db::ReturnCode -/// -///\see -///musik::core::db::ReturnCode -////////////////////////////////////////// int Connection::Execute(const char* sql) { - sqlite3_stmt *stmt = NULL; + sqlite3_stmt *stmt = nullptr; - // Prepaire seems to give errors when interrupted + /* prepare seems to give errors when interrupted */ { boost::mutex::scoped_lock lock(this->mutex); - if(sqlite3_prepare_v2(this->connection,sql,-1,&stmt,NULL)!=SQLITE_OK){ + + if (sqlite3_prepare_v2(this->connection, sql, -1, &stmt, nullptr) != SQLITE_OK) { sqlite3_finalize(stmt); - return db::Error; + return Error; } } - // Execute the statement - int error = this->StepStatement(stmt); - if(error!=SQLITE_OK && error!=SQLITE_DONE){ + int error = this->StepStatement(stmt); + if (error != SQLITE_OK && error != SQLITE_DONE){ sqlite3_finalize(stmt); - return db::Error; + return Error; } sqlite3_reset(stmt); sqlite3_finalize(stmt); - return musik::core::db::Okay; + return Okay; } - -////////////////////////////////////////// -///\brief -///Execute a SQL string -/// -///\param sql -///SQL to execute -/// -///\returns -///Errorcode musik::core::db::ReturnCode -/// -///\see -///musik::core::db::ReturnCode -////////////////////////////////////////// int Connection::Execute(const wchar_t* sql) { - sqlite3_stmt *stmt = NULL; + sqlite3_stmt *stmt = nullptr; + { boost::mutex::scoped_lock lock(this->mutex); - int err = sqlite3_prepare16_v2(this->connection,sql,-1,&stmt,NULL); - if(err!=SQLITE_OK){ + + int err = sqlite3_prepare16_v2(this->connection, sql, -1, &stmt, nullptr); + + if (err != SQLITE_OK) { sqlite3_finalize(stmt); - return db::Error; + return Error; } } - // Execute the statement int error = this->StepStatement(stmt); - if(error!=SQLITE_OK && error!=SQLITE_DONE){ + + if (error != SQLITE_OK && error != SQLITE_DONE) { sqlite3_finalize(stmt); - return db::Error; + return Error; } sqlite3_reset(stmt); sqlite3_finalize(stmt); - return musik::core::db::Okay; + return Okay; } void Connection::Checkpoint() { sqlite3_wal_checkpoint(this->connection, nullptr); } -////////////////////////////////////////// -///\brief -///Get the last inserted row ID -/// -///\returns -///Last inserted row ID -/// -///\see -///http://www.sqlite.org/c3ref/last_insert_rowid.html -////////////////////////////////////////// int Connection::LastInsertedId(){ return (int) sqlite3_last_insert_rowid(this->connection); } -////////////////////////////////////////// -///\brief -///Initializes the database. -/// -///\param cache -///Size of the cache to use in kilobytes -/// -///This will set all the initial PRAGMAS -////////////////////////////////////////// void Connection::Initialize(unsigned int cache) { -// sqlite3_enable_shared_cache(1); sqlite3_busy_timeout(this->connection, 10000); - sqlite3_exec(this->connection, "PRAGMA synchronous=OFF", NULL, NULL, NULL); // Not a critical DB. Sync set to OFF - sqlite3_exec(this->connection, "PRAGMA page_size=4096", NULL, NULL, NULL); // According to windows standard page size - sqlite3_exec(this->connection, "PRAGMA auto_vacuum=0", NULL, NULL, NULL); // No autovaccum. - sqlite3_exec(this->connection, "PRAGMA auto_vacuum=0", NULL, NULL, NULL); // No autovaccum. - sqlite3_exec(this->connection, "PRAGMA journal_mode=WAL", NULL, NULL, NULL); // Allow reading while writing (write-ahead-logging) + sqlite3_exec(this->connection, "PRAGMA synchronous=OFF", nullptr, nullptr, nullptr); // Not a critical DB. Sync set to OFF + sqlite3_exec(this->connection, "PRAGMA page_size=4096", nullptr, nullptr, nullptr); // According to windows standard page size + sqlite3_exec(this->connection, "PRAGMA auto_vacuum=0", nullptr, nullptr, nullptr); // No autovaccum. + sqlite3_exec(this->connection, "PRAGMA journal_mode=WAL", nullptr, nullptr, nullptr); // Allow reading while writing (write-ahead-logging) if (cache != 0) { // Divide by 4 to since the page_size is 4096 // Total cache is the same as page_size*cache_size cache = cache / 4; std::string cacheSize("PRAGMA cache_size=" + boost::lexical_cast(cache)); - sqlite3_exec(this->connection,cacheSize.c_str(), NULL, NULL, NULL); // size * 1.5kb = 6Mb cache + sqlite3_exec(this->connection,cacheSize.c_str(), nullptr, nullptr, nullptr); // size * 1.5kb = 6Mb cache } - sqlite3_exec(this->connection, "PRAGMA case_sensitive_like=0", NULL, NULL, NULL); // More speed if case insensitive - sqlite3_exec(this->connection, "PRAGMA count_changes=0", NULL, NULL, NULL); // If set it counts changes on SQL UPDATE. More speed when not. - sqlite3_exec(this->connection, "PRAGMA legacy_file_format=OFF", NULL, NULL, NULL); // No reason to be backwards compatible :) - sqlite3_exec(this->connection, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL); // MEMORY, not file. More speed. + sqlite3_exec(this->connection, "PRAGMA case_sensitive_like=0", nullptr, nullptr, nullptr); // More speed if case insensitive + sqlite3_exec(this->connection, "PRAGMA count_changes=0", nullptr, nullptr, nullptr); // If set it counts changes on SQL UPDATE. More speed when not. + sqlite3_exec(this->connection, "PRAGMA legacy_file_format=OFF", nullptr, nullptr, nullptr); // No reason to be backwards compatible :) + sqlite3_exec(this->connection, "PRAGMA temp_store=MEMORY", nullptr, nullptr, nullptr); // MEMORY, not file. More speed. } -void Connection::Interrupt(){ +void Connection::Interrupt() { boost::mutex::scoped_lock lock(this->mutex); sqlite3_interrupt(this->connection); } @@ -279,7 +196,7 @@ void Connection::UpdateReferenceCount(bool init) { } else { --count; - if (count <= 0){ + if (count <= 0) { sqlite3_shutdown(); count = 0; } diff --git a/src/core/db/Connection.h b/src/core/db/Connection.h index d771bb707..78a497f84 100644 --- a/src/core/db/Connection.h +++ b/src/core/db/Connection.h @@ -35,7 +35,6 @@ #pragma once #include -#include #include #include @@ -48,6 +47,13 @@ struct sqlite3_stmt; namespace musik { namespace core { namespace db { + typedef enum { + Okay = 0, + Row = 100, + Done = 101, + Error = 1 + } ReturnCode; + class Connection : boost::noncopyable { public: Connection(); diff --git a/src/core/db/ScopedTransaction.cpp b/src/core/db/ScopedTransaction.cpp index 523d8db00..2b6ca5c34 100644 --- a/src/core/db/ScopedTransaction.cpp +++ b/src/core/db/ScopedTransaction.cpp @@ -58,7 +58,7 @@ void ScopedTransaction::CommitAndRestart() { this->Begin(); } -void ScopedTransaction::Begin(){ +void ScopedTransaction::Begin() { /* we use an IMMEDIATE transaction because we have write-ahead-logging enabled on this instance, this generally results in faster queries and also allows reads while writing */ @@ -81,4 +81,6 @@ void ScopedTransaction::End() { this->connection->Checkpoint(); } } + + this->canceled = false; } diff --git a/src/core/db/Statement.cpp b/src/core/db/Statement.cpp index 1e29f8bf9..631bd4e56 100644 --- a/src/core/db/Statement.cpp +++ b/src/core/db/Statement.cpp @@ -40,229 +40,97 @@ using namespace musik::core::db; -////////////////////////////////////////// -///\brief -///Constructor -/// -///\param sql -///SQL to be precomiled -/// -///\param connection -///database Connection -////////////////////////////////////////// -Statement::Statement(const char* sql,Connection &connection) +Statement::Statement(const char* sql, Connection &connection) : connection(&connection) -, stmt(NULL) -{ +, stmt(nullptr) { boost::mutex::scoped_lock lock(connection.mutex); int err = sqlite3_prepare_v2( - this->connection->connection, sql, -1, &this->stmt, NULL); + this->connection->connection, sql, -1, &this->stmt, nullptr); if (err!=SQLITE_OK) { return; } } -////////////////////////////////////////// -///\brief -///Constructor used by the CachedStatement -////////////////////////////////////////// -Statement::Statement(Connection &connection) : connection(&connection),stmt(NULL) { +Statement::Statement(Connection &connection) +: connection(&connection) +, stmt(nullptr) { } -////////////////////////////////////////// -///\brief -///Destructor that will finalize the statement -////////////////////////////////////////// -Statement::~Statement(){ - int err=sqlite3_finalize(this->stmt); +Statement::~Statement() { + int err = sqlite3_finalize(this->stmt); } -////////////////////////////////////////// -///\brief -///Reset a statment to be able to re-execute it later -////////////////////////////////////////// -void Statement::Reset(){ - int err = sqlite3_reset(this->stmt); +void Statement::Reset() { + int err = sqlite3_reset(this->stmt); } -////////////////////////////////////////// -///\brief -///Unbinds all previously binded parameters -////////////////////////////////////////// -void Statement::UnBindAll(){ - DB_ASSERT(sqlite3_clear_bindings(this->stmt)); +void Statement::UnbindAll() { + sqlite3_clear_bindings(this->stmt); } -////////////////////////////////////////// -///\brief -///Execute/Step through the statment -/// -///\returns -///musik::core::db::ReturnCode -////////////////////////////////////////// -int Statement::Step(){ +int Statement::Step() { return this->connection->StepStatement(this->stmt); } -////////////////////////////////////////// -///\brief -///Bind a integer to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindInt -///Integer to bind -////////////////////////////////////////// -void Statement::BindInt(int position,int bindInt){ - DB_ASSERT(sqlite3_bind_int(this->stmt, position + 1, bindInt)); +void Statement::BindInt(int position,int bindInt) { + sqlite3_bind_int(this->stmt, position + 1, bindInt); } -////////////////////////////////////////// -///\brief -///Bind a 64bit integer to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindInt -///Integer to bind -////////////////////////////////////////// -void Statement::BindInt(int position, uint64 bindInt){ - DB_ASSERT(sqlite3_bind_int64(this->stmt, position + 1, bindInt)); +void Statement::BindInt(int position, uint64 bindInt) { + sqlite3_bind_int64(this->stmt, position + 1, bindInt); } -////////////////////////////////////////// -///\brief -///Bind a text to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindText -///Text to bind -////////////////////////////////////////// void Statement::BindText(int position, const char* bindText) { - DB_ASSERT(sqlite3_bind_text( + sqlite3_bind_text( this->stmt, position + 1, bindText, -1, - SQLITE_STATIC)); + SQLITE_STATIC); } -////////////////////////////////////////// -///\brief -///Bind a text to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindText -///Text to bind -////////////////////////////////////////// void Statement::BindText(int position ,const std::string &bindText) { - DB_ASSERT(sqlite3_bind_text( + sqlite3_bind_text( this->stmt, position + 1, bindText.c_str(), -1, - SQLITE_TRANSIENT)); + SQLITE_TRANSIENT); } -////////////////////////////////////////// -///\brief -///Bind a text to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindText -///Text to bind -////////////////////////////////////////// void Statement::BindTextW(int position,const wchar_t* bindText){ - DB_ASSERT(sqlite3_bind_text16( + sqlite3_bind_text16( this->stmt, position + 1, bindText, -1, - SQLITE_STATIC)); + SQLITE_STATIC); } -////////////////////////////////////////// -///\brief -///Bind a text to a statment parameter -/// -///\param position -///Position of the parameter (0 is the first) -/// -///\param bindText -///Text to bind -////////////////////////////////////////// void Statement::BindTextW(int position,const std::wstring &bindText){ - DB_ASSERT(sqlite3_bind_text16( + sqlite3_bind_text16( this->stmt, position + 1, bindText.c_str(), -1, - SQLITE_TRANSIENT)); + SQLITE_TRANSIENT); } -////////////////////////////////////////// -///\brief -///Get the results of a column if Step() return a musik::core::db::Row -/// -///\param column -///Column to get (0 is the first) -/// -///\returns -///Column data -////////////////////////////////////////// -int Statement::ColumnInt(int column){ - return sqlite3_column_int(this->stmt,column); +int Statement::ColumnInt(int column) { + return sqlite3_column_int(this->stmt, column); } -////////////////////////////////////////// -///\brief -///Get the results of a column if Step() return a musik::core::db::Row -/// -///\param column -///Column to get (0 is the first) -/// -///\returns -///Column data -////////////////////////////////////////// -uint64 Statement::ColumnInt64(int column){ - return sqlite3_column_int64(this->stmt,column); +uint64 Statement::ColumnInt64(int column) { + return sqlite3_column_int64(this->stmt, column); } -////////////////////////////////////////// -///\brief -///Get the results of a column if Step() return a musik::core::db::Row -/// -///\param column -///Column to get (0 is the first) -/// -///\returns -///Column data -////////////////////////////////////////// -const char* Statement::ColumnText(int column){ +const char* Statement::ColumnText(int column) { const char* text = (char*) sqlite3_column_text(this->stmt, column); return text ? text : ""; } -////////////////////////////////////////// -///\brief -///Get the results of a column if Step() return a musik::core::db::Row -/// -///\param column -///Column to get (0 is the first) -/// -///\returns -///Column data -////////////////////////////////////////// -const wchar_t* Statement::ColumnTextW(int column){ - const wchar_t* text = (wchar_t*) sqlite3_column_text16(this->stmt,column); +const wchar_t* Statement::ColumnTextW(int column) { + const wchar_t* text = (wchar_t*) sqlite3_column_text16(this->stmt, column); return text ? text : L""; } diff --git a/src/core/db/Statement.h b/src/core/db/Statement.h index 1dd3185a9..60afddb35 100644 --- a/src/core/db/Statement.h +++ b/src/core/db/Statement.h @@ -45,18 +45,15 @@ struct sqlite3_stmt; ////////////////////////////////////////// -namespace musik{ namespace core{ namespace db{ +namespace musik { namespace core { namespace db { class Connection; - ////////////////////////////////////////// - ///\brief - ///Class for precompiling SQL statements - ////////////////////////////////////////// - class Statement : boost::noncopyable{ + class Statement : boost::noncopyable { public: Statement(const char* sql,Connection &connection); virtual ~Statement(); + void Reset(); int Step(); @@ -72,7 +69,7 @@ namespace musik{ namespace core{ namespace db{ const char* ColumnText(int column); const wchar_t* ColumnTextW(int column); - void UnBindAll(); + void UnbindAll(); private: friend class Connection; diff --git a/src/core/db/dbconfig.h b/src/core/db/dbconfig.h deleted file mode 100644 index d9f682002..000000000 --- a/src/core/db/dbconfig.h +++ /dev/null @@ -1,62 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2007-2016 musikcube team -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// * Neither the name of the author nor the names of other contributors may -// be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -////////////////////////////////////////////////////////////////////////////// - -#pragma once - -#ifdef _DEBUG -#ifdef __MSVC__ - #define DB_ASSERT(x) _ASSERT(x==0) -#else //__MSVC__ - #define DB_ASSERT(x) x -#endif//__MSVC -#else - #define DB_ASSERT(x) x -#endif - -namespace musik{ namespace core{ namespace db{ - - ////////////////////////////////////////// - ///\brief - ///The ReturnCode is used by several method to return the status of a execution - ////////////////////////////////////////// - typedef enum { - Okay = 0, - Row = 100, - Done = 101, - Error = 1 - } ReturnCode; - -} } } - - diff --git a/src/core/library/Indexer.cpp b/src/core/library/Indexer.cpp index fff4e47e0..0a0784df0 100644 --- a/src/core/library/Indexer.cpp +++ b/src/core/library/Indexer.cpp @@ -620,7 +620,7 @@ void Indexer::RunAnalyzers() { trackId = getNextTrack.ColumnInt(0); getNextTrack.Reset(); - getNextTrack.UnBindAll(); + getNextTrack.UnbindAll(); IndexerTrack track(trackId);