@@ -116,7 +116,12 @@ namespace sqlite {
116
116
class database_binder {
117
117
118
118
public:
119
- typedef std::unique_ptr<sqlite::database_binder> chain_type;
119
+ database_binder (database_binder&& other) = default ;
120
+ // database_binder is not copyable
121
+ database_binder () = delete ;
122
+ database_binder (const database_binder& other) = delete ;
123
+ database_binder& operator =(const database_binder&) = delete ;
124
+
120
125
121
126
void reset () {
122
127
sqlite3_reset (_stmt.get ());
@@ -208,30 +213,23 @@ namespace sqlite {
208
213
> { };
209
214
210
215
211
- template <typename T> friend database_binder::chain_type & operator <<(database_binder::chain_type & db, const T& val);
216
+ template <typename T> friend database_binder& operator <<(database_binder& db, const T& val);
212
217
template <typename T> friend void get_col_from_db (database_binder& db, int inx, T& val);
213
218
/* for vector<T> support */
214
- template <typename T> friend database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::vector<T>& val);
219
+ template <typename T> friend database_binder& operator <<(database_binder& db, const std::vector<T>& val);
215
220
template <typename T> friend void get_col_from_db (database_binder& db, int inx, std::vector<T>& val);
216
221
/* for nullptr & unique_ptr support */
217
- friend database_binder::chain_type & operator <<(database_binder::chain_type & db, std::nullptr_t );
218
- template <typename T> friend database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::unique_ptr<T>& val);
222
+ friend database_binder& operator <<(database_binder& db, std::nullptr_t );
223
+ template <typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val);
219
224
template <typename T> friend void get_col_from_db (database_binder& db, int inx, std::unique_ptr<T>& val);
220
225
template <typename T> friend T operator ++(database_binder& db, int );
221
226
222
227
223
228
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
224
- template <typename BoostOptionalT> friend database_binder::chain_type & operator <<(database_binder::chain_type & db, const boost::optional<BoostOptionalT>& val);
229
+ template <typename BoostOptionalT> friend database_binder& operator <<(database_binder& db, const boost::optional<BoostOptionalT>& val);
225
230
template <typename BoostOptionalT> friend void get_col_from_db (database_binder& db, int inx, boost::optional<BoostOptionalT>& o);
226
231
#endif
227
232
228
-
229
- database_binder () = delete ;
230
- database_binder (const database_binder& other) = delete ;
231
- database_binder& operator =(const database_binder&) = delete ;
232
- database_binder (const database_binder&& other) = delete ;
233
-
234
-
235
233
public:
236
234
237
235
database_binder (std::shared_ptr<sqlite3> db, std::u16string const & sql):
@@ -299,19 +297,19 @@ namespace sqlite {
299
297
database (std::shared_ptr<sqlite3> db):
300
298
_db (db) {}
301
299
302
- database_binder::chain_type operator <<(const std::string& sql) {
303
- return database_binder::chain_type ( new database_binder ( _db, sql) );
300
+ database_binder operator <<(const std::string& sql) {
301
+ return database_binder ( _db, sql);
304
302
}
305
303
306
- database_binder::chain_type operator <<(const char * sql) {
304
+ database_binder operator <<(const char * sql) {
307
305
return *this << std::string (sql);
308
306
}
309
307
310
- database_binder::chain_type operator <<(const std::u16string& sql) {
311
- return database_binder::chain_type ( new database_binder ( _db, sql) );
308
+ database_binder operator <<(const std::u16string& sql) {
309
+ return database_binder ( _db, sql);
312
310
}
313
311
314
- database_binder::chain_type operator <<(const char16_t * sql) {
312
+ database_binder operator <<(const char16_t * sql) {
315
313
return *this << std::u16string (sql);
316
314
}
317
315
@@ -372,12 +370,12 @@ namespace sqlite {
372
370
};
373
371
374
372
// int
375
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const int & val) {
373
+ template <> inline database_binder& operator <<(database_binder& db, const int & val) {
376
374
int hresult;
377
- if ((hresult = sqlite3_bind_int (db-> _stmt .get (), db-> _inx , val)) != SQLITE_OK) {
375
+ if ((hresult = sqlite3_bind_int (db. _stmt .get (), db. _inx , val)) != SQLITE_OK) {
378
376
exceptions::throw_sqlite_error (hresult);
379
377
}
380
- ++db-> _inx ;
378
+ ++db. _inx ;
381
379
return db;
382
380
}
383
381
template <> inline void get_col_from_db (database_binder& db, int inx, int & val) {
@@ -389,13 +387,13 @@ namespace sqlite {
389
387
}
390
388
391
389
// sqlite_int64
392
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const sqlite_int64& val) {
390
+ template <> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
393
391
int hresult;
394
- if ((hresult = sqlite3_bind_int64 (db-> _stmt .get (), db-> _inx , val)) != SQLITE_OK) {
392
+ if ((hresult = sqlite3_bind_int64 (db. _stmt .get (), db. _inx , val)) != SQLITE_OK) {
395
393
exceptions::throw_sqlite_error (hresult);
396
394
}
397
395
398
- ++db-> _inx ;
396
+ ++db. _inx ;
399
397
return db;
400
398
}
401
399
template <> inline void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i) {
@@ -407,13 +405,13 @@ namespace sqlite {
407
405
}
408
406
409
407
// float
410
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const float & val) {
408
+ template <> inline database_binder& operator <<(database_binder& db, const float & val) {
411
409
int hresult;
412
- if ((hresult = sqlite3_bind_double (db-> _stmt .get (), db-> _inx , double (val))) != SQLITE_OK) {
410
+ if ((hresult = sqlite3_bind_double (db. _stmt .get (), db. _inx , double (val))) != SQLITE_OK) {
413
411
exceptions::throw_sqlite_error (hresult);
414
412
}
415
413
416
- ++db-> _inx ;
414
+ ++db. _inx ;
417
415
return db;
418
416
}
419
417
template <> inline void get_col_from_db (database_binder& db, int inx, float & f) {
@@ -425,13 +423,13 @@ namespace sqlite {
425
423
}
426
424
427
425
// double
428
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const double & val) {
426
+ template <> inline database_binder& operator <<(database_binder& db, const double & val) {
429
427
int hresult;
430
- if ((hresult = sqlite3_bind_double (db-> _stmt .get (), db-> _inx , val)) != SQLITE_OK) {
428
+ if ((hresult = sqlite3_bind_double (db. _stmt .get (), db. _inx , val)) != SQLITE_OK) {
431
429
exceptions::throw_sqlite_error (hresult);
432
430
}
433
431
434
- ++db-> _inx ;
432
+ ++db. _inx ;
435
433
return db;
436
434
}
437
435
template <> inline void get_col_from_db (database_binder& db, int inx, double & d) {
@@ -443,14 +441,14 @@ namespace sqlite {
443
441
}
444
442
445
443
// vector<T>
446
- template <typename T> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::vector<T>& vec) {
444
+ template <typename T> inline database_binder& operator <<(database_binder& db, const std::vector<T>& vec) {
447
445
void const * buf = reinterpret_cast <void const *>(vec.data ());
448
446
int bytes = vec.size () * sizeof (T);
449
447
int hresult;
450
- if ((hresult = sqlite3_bind_blob (db-> _stmt .get (), db-> _inx , buf, bytes, SQLITE_TRANSIENT)) != SQLITE_OK) {
448
+ if ((hresult = sqlite3_bind_blob (db. _stmt .get (), db. _inx , buf, bytes, SQLITE_TRANSIENT)) != SQLITE_OK) {
451
449
exceptions::throw_sqlite_error (hresult);
452
450
}
453
- ++db-> _inx ;
451
+ ++db. _inx ;
454
452
return db;
455
453
}
456
454
template <typename T> inline void get_col_from_db (database_binder& db, int inx, std::vector<T>& vec) {
@@ -464,16 +462,16 @@ namespace sqlite {
464
462
}
465
463
466
464
/* for nullptr support */
467
- inline database_binder::chain_type & operator <<(database_binder::chain_type & db, std::nullptr_t ) {
465
+ inline database_binder& operator <<(database_binder& db, std::nullptr_t ) {
468
466
int hresult;
469
- if ((hresult = sqlite3_bind_null (db-> _stmt .get (), db-> _inx )) != SQLITE_OK) {
467
+ if ((hresult = sqlite3_bind_null (db. _stmt .get (), db. _inx )) != SQLITE_OK) {
470
468
exceptions::throw_sqlite_error (hresult);
471
469
}
472
- ++db-> _inx ;
470
+ ++db. _inx ;
473
471
return db;
474
472
}
475
473
/* for nullptr support */
476
- template <typename T> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::unique_ptr<T>& val) {
474
+ template <typename T> inline database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val) {
477
475
if (val)
478
476
db << *val;
479
477
else
@@ -503,16 +501,16 @@ namespace sqlite {
503
501
}
504
502
505
503
// Convert char* to string to trigger op<<(..., const std::string )
506
- template <std::size_t N> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const char (&STR)[N]) { return db << std::string (STR); }
507
- template <std::size_t N> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const char16_t (&STR)[N]) { return db << std::u16string (STR); }
504
+ template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char (&STR)[N]) { return db << std::string (STR); }
505
+ template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t (&STR)[N]) { return db << std::u16string (STR); }
508
506
509
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::string& txt) {
507
+ template <> inline database_binder& operator <<(database_binder& db, const std::string& txt) {
510
508
int hresult;
511
- if ((hresult = sqlite3_bind_text (db-> _stmt .get (), db-> _inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
509
+ if ((hresult = sqlite3_bind_text (db. _stmt .get (), db. _inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
512
510
exceptions::throw_sqlite_error (hresult);
513
511
}
514
512
515
- ++db-> _inx ;
513
+ ++db. _inx ;
516
514
return db;
517
515
}
518
516
// std::u16string
@@ -526,27 +524,27 @@ namespace sqlite {
526
524
}
527
525
528
526
529
- template <> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const std::u16string& txt) {
527
+ template <> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
530
528
int hresult;
531
- if ((hresult = sqlite3_bind_text16 (db-> _stmt .get (), db-> _inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
529
+ if ((hresult = sqlite3_bind_text16 (db. _stmt .get (), db. _inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
532
530
exceptions::throw_sqlite_error (hresult);
533
531
}
534
532
535
- ++db-> _inx ;
533
+ ++db. _inx ;
536
534
return db;
537
535
}
538
536
// boost::optinal support for NULL values
539
537
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
540
- template <typename BoostOptionalT> inline database_binder::chain_type & operator <<(database_binder::chain_type & db, const boost::optional<BoostOptionalT>& val) {
538
+ template <typename BoostOptionalT> inline database_binder& operator <<(database_binder& db, const boost::optional<BoostOptionalT>& val) {
541
539
if (val) {
542
540
return operator << (std::move (db), std::move (*val));
543
541
}
544
542
int hresult;
545
- if ((hresult = sqlite3_bind_null (db-> _stmt .get (), db-> _inx )) != SQLITE_OK) {
543
+ if ((hresult = sqlite3_bind_null (db. _stmt .get (), db. _inx )) != SQLITE_OK) {
546
544
exceptions::throw_sqlite_error (hresult);
547
545
}
548
546
549
- ++db-> _inx ;
547
+ ++db. _inx ;
550
548
return db;
551
549
}
552
550
@@ -561,14 +559,10 @@ namespace sqlite {
561
559
}
562
560
#endif
563
561
564
- // there is too much magic here, val might be rValue or lValue
565
- template <typename T> void operator >> (database_binder::chain_type& db, T&& val) { *db >> std::forward<T>(val); }
566
- template <typename T> void operator >> (database_binder::chain_type&& db, T&& val) { db >> std::forward<T>(val); }
567
-
568
562
// Some ppl are lazy so we have a operator for proper prep. statemant handling.
569
- void inline operator ++(database_binder::chain_type & db, int ) { db-> execute (); db-> reset (); }
563
+ void inline operator ++(database_binder& db, int ) { db. execute (); db. reset (); }
570
564
571
565
// Convert the rValue binder to a reference and call first op<<, its needed for the call that creates the binder (be carfull of recursion here!)
572
- template <typename T> database_binder::chain_type & operator << (database_binder::chain_type && db, const T& val) { return db << val; }
566
+ template <typename T> database_binder& operator << (database_binder&& db, const T& val) { return db << val; }
573
567
574
568
}
0 commit comments