diff --git a/hdr/sqlite_modern_cpp.h b/hdr/sqlite_modern_cpp.h index 054d9c26..961485c9 100644 --- a/hdr/sqlite_modern_cpp.h +++ b/hdr/sqlite_modern_cpp.h @@ -223,6 +223,19 @@ namespace sqlite { template<typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val); template<typename T> friend void get_col_from_db(database_binder& db, int inx, std::unique_ptr<T>& val); template<typename T> friend T operator++(database_binder& db, int); + // Overload instead of specializing function templates (http://www.gotw.ca/publications/mill17.htm) + friend database_binder& operator<<(database_binder& db, const int& val); + friend void get_col_from_db(database_binder& db, int inx, int& val); + friend database_binder& operator <<(database_binder& db, const sqlite_int64& val); + friend void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i); + friend database_binder& operator <<(database_binder& db, const float& val); + friend void get_col_from_db(database_binder& db, int inx, float& f); + friend database_binder& operator <<(database_binder& db, const double& val); + friend void get_col_from_db(database_binder& db, int inx, double& d); + friend void get_col_from_db(database_binder& db, int inx, std::string & s); + friend database_binder& operator <<(database_binder& db, const std::string& txt); + friend void get_col_from_db(database_binder& db, int inx, std::u16string & w); + friend database_binder& operator <<(database_binder& db, const std::u16string& txt); #ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT @@ -370,7 +383,7 @@ namespace sqlite { }; // int - template<> inline database_binder& operator<<(database_binder& db, const int& val) { + inline database_binder& operator<<(database_binder& db, const int& val) { int hresult; if((hresult = sqlite3_bind_int(db._stmt.get(), db._inx, val)) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); @@ -378,7 +391,7 @@ namespace sqlite { ++db._inx; return db; } - template<> inline void get_col_from_db(database_binder& db, int inx, int& val) { + inline void get_col_from_db(database_binder& db, int inx, int& val) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { val = 0; } else { @@ -387,7 +400,7 @@ namespace sqlite { } // sqlite_int64 - template<> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) { + inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) { int hresult; if((hresult = sqlite3_bind_int64(db._stmt.get(), db._inx, val)) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); @@ -396,7 +409,7 @@ namespace sqlite { ++db._inx; return db; } - template<> inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) { + inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { i = 0; } else { @@ -405,7 +418,7 @@ namespace sqlite { } // float - template<> inline database_binder& operator <<(database_binder& db, const float& val) { + inline database_binder& operator <<(database_binder& db, const float& val) { int hresult; if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, double(val))) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); @@ -414,7 +427,7 @@ namespace sqlite { ++db._inx; return db; } - template<> inline void get_col_from_db(database_binder& db, int inx, float& f) { + inline void get_col_from_db(database_binder& db, int inx, float& f) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { f = 0; } else { @@ -423,7 +436,7 @@ namespace sqlite { } // double - template<> inline database_binder& operator <<(database_binder& db, const double& val) { + inline database_binder& operator <<(database_binder& db, const double& val) { int hresult; if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, val)) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); @@ -432,7 +445,7 @@ namespace sqlite { ++db._inx; return db; } - template<> inline void get_col_from_db(database_binder& db, int inx, double& d) { + inline void get_col_from_db(database_binder& db, int inx, double& d) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { d = 0; } else { @@ -491,7 +504,7 @@ namespace sqlite { } // std::string - template<> inline void get_col_from_db(database_binder& db, int inx, std::string & s) { + inline void get_col_from_db(database_binder& db, int inx, std::string & s) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { s = std::string(); } else { @@ -504,7 +517,7 @@ namespace sqlite { template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char(&STR)[N]) { return db << std::string(STR); } template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t(&STR)[N]) { return db << std::u16string(STR); } - template<> inline database_binder& operator <<(database_binder& db, const std::string& txt) { + inline database_binder& operator <<(database_binder& db, const std::string& txt) { int hresult; if((hresult = sqlite3_bind_text(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); @@ -514,7 +527,7 @@ namespace sqlite { return db; } // std::u16string - template<> inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) { + inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) { if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) { w = std::u16string(); } else { @@ -524,7 +537,7 @@ namespace sqlite { } - template<> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) { + inline database_binder& operator <<(database_binder& db, const std::u16string& txt) { int hresult; if((hresult = sqlite3_bind_text16(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) { exceptions::throw_sqlite_error(hresult); diff --git a/tests/boost_optional.cc b/tests/boost_optional.cc index 72b3b3e4..1d05540d 100644 --- a/tests/boost_optional.cc +++ b/tests/boost_optional.cc @@ -16,8 +16,7 @@ void insert(database& db, bool is_null) { } void select(database& db, bool should_be_null) { - db << "select id,val from test" >> [&](long long id, boost::optional<int> val) { - id = id; + db << "select id,val from test" >> [&](long long, boost::optional<int> val) { if(should_be_null) { if(val) exit(EXIT_FAILURE); } else { diff --git a/tests/nullptr_uniqueptr.cc b/tests/nullptr_uniqueptr.cc index 7bc193ae..70294f8d 100644 --- a/tests/nullptr_uniqueptr.cc +++ b/tests/nullptr_uniqueptr.cc @@ -21,7 +21,9 @@ int main() { } cout << "age:" << *age_p << " name:" << *name_p << " img:"; - for(auto i : *img_p) cout << i << ","; cout << endl; + for(auto i : *img_p) + cout << i << ","; + cout << endl; }; db << "select age,name,img from tbl where id = 2" >> [](unique_ptr<int> age_p, unique_ptr<string> name_p, unique_ptr<vector<int>> img_p) { diff --git a/tests/readme_example.cc b/tests/readme_example.cc index 7a09af11..e903a85f 100644 --- a/tests/readme_example.cc +++ b/tests/readme_example.cc @@ -30,7 +30,7 @@ int main() { << u"bob" << 83.25; - int age = 21; + int age = 22; float weight = 68.5; string name = "jack"; db << u"insert into user (age,name,weight) values (?,?,?);" // utf16 query string @@ -43,9 +43,11 @@ int main() { // slects from user table on a condition ( age > 18 ) and executes // the lambda for each row returned . db << "select age,name,weight from user where age > ? ;" - << 18 - >> [&](int age, string name, double weight) { - cout << age << ' ' << name << ' ' << weight << endl; + << 21 + >> [&](int _age, string _name, double _weight) { + if(_age != age || _name != name) + exit(EXIT_FAILURE); + cout << _age << ' ' << _name << ' ' << _weight << endl; }; // selects the count(*) from user table