Skip to content

Commit 5910571

Browse files
authored
Merge pull request #56 from aminroosta/gcc611
fix #55
2 parents 186d087 + 3079eaf commit 5910571

File tree

4 files changed

+35
-19
lines changed

4 files changed

+35
-19
lines changed

hdr/sqlite_modern_cpp.h

+25-12
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,19 @@ namespace sqlite {
223223
template<typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val);
224224
template<typename T> friend void get_col_from_db(database_binder& db, int inx, std::unique_ptr<T>& val);
225225
template<typename T> friend T operator++(database_binder& db, int);
226+
// Overload instead of specializing function templates (http://www.gotw.ca/publications/mill17.htm)
227+
friend database_binder& operator<<(database_binder& db, const int& val);
228+
friend void get_col_from_db(database_binder& db, int inx, int& val);
229+
friend database_binder& operator <<(database_binder& db, const sqlite_int64& val);
230+
friend void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i);
231+
friend database_binder& operator <<(database_binder& db, const float& val);
232+
friend void get_col_from_db(database_binder& db, int inx, float& f);
233+
friend database_binder& operator <<(database_binder& db, const double& val);
234+
friend void get_col_from_db(database_binder& db, int inx, double& d);
235+
friend void get_col_from_db(database_binder& db, int inx, std::string & s);
236+
friend database_binder& operator <<(database_binder& db, const std::string& txt);
237+
friend void get_col_from_db(database_binder& db, int inx, std::u16string & w);
238+
friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
226239

227240

228241
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -370,15 +383,15 @@ namespace sqlite {
370383
};
371384

372385
// int
373-
template<> inline database_binder& operator<<(database_binder& db, const int& val) {
386+
inline database_binder& operator<<(database_binder& db, const int& val) {
374387
int hresult;
375388
if((hresult = sqlite3_bind_int(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
376389
exceptions::throw_sqlite_error(hresult);
377390
}
378391
++db._inx;
379392
return db;
380393
}
381-
template<> inline void get_col_from_db(database_binder& db, int inx, int& val) {
394+
inline void get_col_from_db(database_binder& db, int inx, int& val) {
382395
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
383396
val = 0;
384397
} else {
@@ -387,7 +400,7 @@ namespace sqlite {
387400
}
388401

389402
// sqlite_int64
390-
template<> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
403+
inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
391404
int hresult;
392405
if((hresult = sqlite3_bind_int64(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
393406
exceptions::throw_sqlite_error(hresult);
@@ -396,7 +409,7 @@ namespace sqlite {
396409
++db._inx;
397410
return db;
398411
}
399-
template<> inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) {
412+
inline void get_col_from_db(database_binder& db, int inx, sqlite3_int64& i) {
400413
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
401414
i = 0;
402415
} else {
@@ -405,7 +418,7 @@ namespace sqlite {
405418
}
406419

407420
// float
408-
template<> inline database_binder& operator <<(database_binder& db, const float& val) {
421+
inline database_binder& operator <<(database_binder& db, const float& val) {
409422
int hresult;
410423
if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, double(val))) != SQLITE_OK) {
411424
exceptions::throw_sqlite_error(hresult);
@@ -414,7 +427,7 @@ namespace sqlite {
414427
++db._inx;
415428
return db;
416429
}
417-
template<> inline void get_col_from_db(database_binder& db, int inx, float& f) {
430+
inline void get_col_from_db(database_binder& db, int inx, float& f) {
418431
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
419432
f = 0;
420433
} else {
@@ -423,7 +436,7 @@ namespace sqlite {
423436
}
424437

425438
// double
426-
template<> inline database_binder& operator <<(database_binder& db, const double& val) {
439+
inline database_binder& operator <<(database_binder& db, const double& val) {
427440
int hresult;
428441
if((hresult = sqlite3_bind_double(db._stmt.get(), db._inx, val)) != SQLITE_OK) {
429442
exceptions::throw_sqlite_error(hresult);
@@ -432,7 +445,7 @@ namespace sqlite {
432445
++db._inx;
433446
return db;
434447
}
435-
template<> inline void get_col_from_db(database_binder& db, int inx, double& d) {
448+
inline void get_col_from_db(database_binder& db, int inx, double& d) {
436449
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
437450
d = 0;
438451
} else {
@@ -491,7 +504,7 @@ namespace sqlite {
491504
}
492505

493506
// std::string
494-
template<> inline void get_col_from_db(database_binder& db, int inx, std::string & s) {
507+
inline void get_col_from_db(database_binder& db, int inx, std::string & s) {
495508
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
496509
s = std::string();
497510
} else {
@@ -504,7 +517,7 @@ namespace sqlite {
504517
template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char(&STR)[N]) { return db << std::string(STR); }
505518
template<std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t(&STR)[N]) { return db << std::u16string(STR); }
506519

507-
template<> inline database_binder& operator <<(database_binder& db, const std::string& txt) {
520+
inline database_binder& operator <<(database_binder& db, const std::string& txt) {
508521
int hresult;
509522
if((hresult = sqlite3_bind_text(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) {
510523
exceptions::throw_sqlite_error(hresult);
@@ -514,7 +527,7 @@ namespace sqlite {
514527
return db;
515528
}
516529
// std::u16string
517-
template<> inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) {
530+
inline void get_col_from_db(database_binder& db, int inx, std::u16string & w) {
518531
if(sqlite3_column_type(db._stmt.get(), inx) == SQLITE_NULL) {
519532
w = std::u16string();
520533
} else {
@@ -524,7 +537,7 @@ namespace sqlite {
524537
}
525538

526539

527-
template<> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
540+
inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
528541
int hresult;
529542
if((hresult = sqlite3_bind_text16(db._stmt.get(), db._inx, txt.data(), -1, SQLITE_TRANSIENT)) != SQLITE_OK) {
530543
exceptions::throw_sqlite_error(hresult);

tests/boost_optional.cc

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ void insert(database& db, bool is_null) {
1616
}
1717

1818
void select(database& db, bool should_be_null) {
19-
db << "select id,val from test" >> [&](long long id, boost::optional<int> val) {
20-
id = id;
19+
db << "select id,val from test" >> [&](long long, boost::optional<int> val) {
2120
if(should_be_null) {
2221
if(val) exit(EXIT_FAILURE);
2322
} else {

tests/nullptr_uniqueptr.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ int main() {
2121
}
2222

2323
cout << "age:" << *age_p << " name:" << *name_p << " img:";
24-
for(auto i : *img_p) cout << i << ","; cout << endl;
24+
for(auto i : *img_p)
25+
cout << i << ",";
26+
cout << endl;
2527
};
2628

2729
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) {

tests/readme_example.cc

+6-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int main() {
3030
<< u"bob"
3131
<< 83.25;
3232

33-
int age = 21;
33+
int age = 22;
3434
float weight = 68.5;
3535
string name = "jack";
3636
db << u"insert into user (age,name,weight) values (?,?,?);" // utf16 query string
@@ -43,9 +43,11 @@ int main() {
4343
// slects from user table on a condition ( age > 18 ) and executes
4444
// the lambda for each row returned .
4545
db << "select age,name,weight from user where age > ? ;"
46-
<< 18
47-
>> [&](int age, string name, double weight) {
48-
cout << age << ' ' << name << ' ' << weight << endl;
46+
<< 21
47+
>> [&](int _age, string _name, double _weight) {
48+
if(_age != age || _name != name)
49+
exit(EXIT_FAILURE);
50+
cout << _age << ' ' << _name << ' ' << _weight << endl;
4951
};
5052

5153
// selects the count(*) from user table

0 commit comments

Comments
 (0)