| container-statements.hxx | | container-statements.hxx | |
| | | | |
| skipping to change at line 27 | | skipping to change at line 27 | |
| #include <odb/sqlite/binding.hxx> | | #include <odb/sqlite/binding.hxx> | |
| #include <odb/sqlite/statement.hxx> | | #include <odb/sqlite/statement.hxx> | |
| #include <odb/sqlite/details/export.hxx> | | #include <odb/sqlite/details/export.hxx> | |
| | | | |
| namespace odb | | namespace odb | |
| { | | { | |
| namespace sqlite | | namespace sqlite | |
| { | | { | |
| class connection; | | class connection; | |
| | | | |
|
| // Template argument is the generated container traits type. | | // Template argument is the generated abstract container traits type. | |
| | | // That is, it doesn't need to provide column counts and statements. | |
| // | | // | |
| template <typename T> | | template <typename T> | |
| class container_statements | | class container_statements | |
| { | | { | |
| public: | | public: | |
| typedef T traits; | | typedef T traits; | |
| | | | |
|
| typedef typename traits::id_image_type id_image_type; | | | |
| typedef typename traits::data_image_type data_image_type; | | typedef typename traits::data_image_type data_image_type; | |
| typedef typename traits::cond_image_type cond_image_type; | | typedef typename traits::cond_image_type cond_image_type; | |
| | | | |
| typedef typename traits::functions_type functions_type; | | typedef typename traits::functions_type functions_type; | |
| | | | |
| typedef sqlite::insert_statement insert_statement_type; | | typedef sqlite::insert_statement insert_statement_type; | |
| typedef sqlite::select_statement select_statement_type; | | typedef sqlite::select_statement select_statement_type; | |
| typedef sqlite::delete_statement delete_statement_type; | | typedef sqlite::delete_statement delete_statement_type; | |
| | | | |
| typedef sqlite::connection connection_type; | | typedef sqlite::connection connection_type; | |
| | | | |
| skipping to change at line 63 | | skipping to change at line 63 | |
| } | | } | |
| | | | |
| // Functions. | | // Functions. | |
| // | | // | |
| functions_type& | | functions_type& | |
| functions () | | functions () | |
| { | | { | |
| return functions_; | | return functions_; | |
| } | | } | |
| | | | |
|
| // Id image (external). | | // Id image binding (external). | |
| // | | // | |
|
| id_image_type& | | const binding& | |
| id_image () | | id_binding () | |
| { | | { | |
|
| return *id_image_; | | return *id_binding_; | |
| } | | } | |
| | | | |
| void | | void | |
|
| id_image (id_image_type& i) | | id_binding (const binding& b) | |
| { | | { | |
|
| id_image_ = &i; | | id_binding_ = &b; | |
| } | | } | |
| | | | |
| // Condition image. | | // Condition image. | |
| // | | // | |
| cond_image_type& | | cond_image_type& | |
| cond_image () | | cond_image () | |
| { | | { | |
| return cond_image_; | | return cond_image_; | |
| } | | } | |
| | | | |
|
| std::size_t | | std::size_t | |
| cond_image_version () const | | cond_image_version () const | |
| { | | { | |
| return cond_image_version_; | | return cond_image_version_; | |
| } | | } | |
| | | | |
| void | | void | |
| cond_image_version (std::size_t v) | | cond_image_version (std::size_t v) | |
| { | | { | |
| cond_image_version_ = v; | | cond_image_version_ = v; | |
| } | | } | |
| | | | |
| std::size_t | | std::size_t | |
|
| cond_id_image_version () const | | cond_id_binding_version () const | |
| { | | { | |
|
| return cond_id_image_version_; | | return cond_id_binding_version_; | |
| } | | } | |
| | | | |
| void | | void | |
|
| cond_id_image_version (std::size_t v) | | cond_id_binding_version (std::size_t v) | |
| { | | { | |
|
| cond_id_image_version_ = v; | | cond_id_binding_version_ = v; | |
| } | | } | |
| | | | |
| binding& | | binding& | |
| cond_image_binding () | | cond_image_binding () | |
| { | | { | |
| return cond_image_binding_; | | return cond_image_binding_; | |
| } | | } | |
| | | | |
| // Data image. | | // Data image. | |
| // | | // | |
| | | | |
| skipping to change at line 136 | | skipping to change at line 136 | |
| return data_image_version_; | | return data_image_version_; | |
| } | | } | |
| | | | |
| void | | void | |
| data_image_version (std::size_t v) | | data_image_version (std::size_t v) | |
| { | | { | |
| data_image_version_ = v; | | data_image_version_ = v; | |
| } | | } | |
| | | | |
| std::size_t | | std::size_t | |
|
| data_id_image_version () const | | data_id_binding_version () const | |
| { | | { | |
|
| return data_id_image_version_; | | return data_id_binding_version_; | |
| } | | } | |
| | | | |
| void | | void | |
|
| data_id_image_version (std::size_t v) | | data_id_binding_version (std::size_t v) | |
| { | | { | |
|
| data_id_image_version_ = v; | | data_id_binding_version_ = v; | |
| } | | } | |
| | | | |
| binding& | | binding& | |
| data_image_binding () | | data_image_binding () | |
| { | | { | |
| return data_image_binding_; | | return data_image_binding_; | |
| } | | } | |
| | | | |
| bool* | | bool* | |
| data_image_truncated () | | data_image_truncated () | |
| | | | |
| skipping to change at line 170 | | skipping to change at line 170 | |
| // Statements. | | // Statements. | |
| // | | // | |
| | | | |
| insert_statement_type& | | insert_statement_type& | |
| insert_one_statement () | | insert_one_statement () | |
| { | | { | |
| if (insert_one_ == 0) | | if (insert_one_ == 0) | |
| { | | { | |
| insert_one_.reset ( | | insert_one_.reset ( | |
| new (details::shared) insert_statement_type ( | | new (details::shared) insert_statement_type ( | |
|
| conn_, traits::insert_one_statement, data_image_binding_)); | | conn_, insert_one_text_, data_image_binding_)); | |
| | | | |
| insert_one_->cached (true); | | insert_one_->cached (true); | |
| } | | } | |
| | | | |
| return *insert_one_; | | return *insert_one_; | |
| } | | } | |
| | | | |
| select_statement_type& | | select_statement_type& | |
| select_all_statement () | | select_all_statement () | |
| { | | { | |
| if (select_all_ == 0) | | if (select_all_ == 0) | |
| { | | { | |
| select_all_.reset ( | | select_all_.reset ( | |
| new (details::shared) select_statement_type ( | | new (details::shared) select_statement_type ( | |
| conn_, | | conn_, | |
|
| traits::select_all_statement, | | select_all_text_, | |
| cond_image_binding_, | | cond_image_binding_, | |
| data_image_binding_)); | | data_image_binding_)); | |
| | | | |
| select_all_->cached (true); | | select_all_->cached (true); | |
| } | | } | |
| | | | |
| return *select_all_; | | return *select_all_; | |
| } | | } | |
| | | | |
| delete_statement_type& | | delete_statement_type& | |
| delete_all_statement () | | delete_all_statement () | |
| { | | { | |
| if (delete_all_ == 0) | | if (delete_all_ == 0) | |
| { | | { | |
| delete_all_.reset ( | | delete_all_.reset ( | |
| new (details::shared) delete_statement_type ( | | new (details::shared) delete_statement_type ( | |
|
| conn_, traits::delete_all_statement, cond_image_binding_)); | | conn_, delete_all_text_, cond_image_binding_)); | |
| | | | |
| delete_all_->cached (true); | | delete_all_->cached (true); | |
| } | | } | |
| | | | |
| return *delete_all_; | | return *delete_all_; | |
| } | | } | |
| | | | |
| private: | | private: | |
| container_statements (const container_statements&); | | container_statements (const container_statements&); | |
| container_statements& operator= (const container_statements&); | | container_statements& operator= (const container_statements&); | |
| | | | |
|
| private: | | protected: | |
| connection_type& conn_; | | connection_type& conn_; | |
| functions_type functions_; | | functions_type functions_; | |
| | | | |
|
| id_image_type* id_image_; | | const binding* id_binding_; | |
| | | | |
| cond_image_type cond_image_; | | cond_image_type cond_image_; | |
| std::size_t cond_image_version_; | | std::size_t cond_image_version_; | |
|
| std::size_t cond_id_image_version_; | | std::size_t cond_id_binding_version_; | |
| binding cond_image_binding_; | | binding cond_image_binding_; | |
|
| bind cond_image_bind_[traits::cond_column_count]; | | bind* cond_image_bind_; | |
| | | | |
| data_image_type data_image_; | | data_image_type data_image_; | |
| std::size_t data_image_version_; | | std::size_t data_image_version_; | |
|
| std::size_t data_id_image_version_; | | std::size_t data_id_binding_version_; | |
| binding data_image_binding_; | | binding data_image_binding_; | |
|
| bind data_image_bind_[traits::data_column_count]; | | bind* data_image_bind_; | |
| bool data_image_truncated_[traits::data_column_count]; | | bool* data_image_truncated_; | |
| | | | |
| | | const char* insert_one_text_; | |
| | | const char* select_all_text_; | |
| | | const char* delete_all_text_; | |
| | | | |
| details::shared_ptr<insert_statement_type> insert_one_; | | details::shared_ptr<insert_statement_type> insert_one_; | |
| details::shared_ptr<select_statement_type> select_all_; | | details::shared_ptr<select_statement_type> select_all_; | |
| details::shared_ptr<delete_statement_type> delete_all_; | | details::shared_ptr<delete_statement_type> delete_all_; | |
| }; | | }; | |
|
| | | | |
| | | // Template argument is the generated concrete container traits type. | |
| | | // | |
| | | template <typename T> | |
| | | class container_statements_impl: public T::statements_type | |
| | | { | |
| | | public: | |
| | | typedef T traits; | |
| | | typedef typename T::statements_type base; | |
| | | typedef sqlite::connection connection_type; | |
| | | | |
| | | container_statements_impl (connection_type&); | |
| | | | |
| | | private: | |
| | | container_statements_impl (const container_statements_impl&); | |
| | | container_statements_impl& operator= (const container_statements_impl | |
| | | &); | |
| | | | |
| | | private: | |
| | | bind cond_image_bind_array_[traits::cond_column_count]; | |
| | | bind data_image_bind_array_[traits::data_column_count]; | |
| | | bool data_image_truncated_array_[traits::data_column_count]; | |
| | | }; | |
| } | | } | |
| } | | } | |
| | | | |
| #include <odb/sqlite/container-statements.txx> | | #include <odb/sqlite/container-statements.txx> | |
| | | | |
| #include <odb/post.hxx> | | #include <odb/post.hxx> | |
| | | | |
| #endif // ODB_SQLITE_CONTAINER_STATEMENTS_HXX | | #endif // ODB_SQLITE_CONTAINER_STATEMENTS_HXX | |
| | | | |
End of changes. 26 change blocks. |
| 27 lines changed or deleted | | 54 lines changed or added | |
|
| container-statements.txx | | container-statements.txx | |
| | | | |
| skipping to change at line 24 | | skipping to change at line 24 | |
| // | | // | |
| | | | |
| template <typename T> | | template <typename T> | |
| container_statements<T>:: | | container_statements<T>:: | |
| container_statements (connection_type& conn) | | container_statements (connection_type& conn) | |
| : conn_ (conn), | | : conn_ (conn), | |
| functions_ (this, | | functions_ (this, | |
| &traits::insert_one, | | &traits::insert_one, | |
| &traits::load_all, | | &traits::load_all, | |
| &traits::delete_all), | | &traits::delete_all), | |
|
| id_image_ (0), | | id_binding_ (0), | |
| cond_image_binding_ (cond_image_bind_, traits::cond_column_count) | | cond_image_binding_ (0, 0), // Initialized by impl. | |
| , | | data_image_binding_ (0, 0) // Initialized by impl. | |
| data_image_binding_ (data_image_bind_, traits::data_column_count) | | | |
| { | | { | |
| cond_image_.version = 0; | | cond_image_.version = 0; | |
| cond_image_version_ = 0; | | cond_image_version_ = 0; | |
|
| cond_id_image_version_ = 0; | | cond_id_binding_version_ = 0; | |
| | | | |
| data_image_.version = 0; | | data_image_.version = 0; | |
| data_image_version_ = 0; | | data_image_version_ = 0; | |
|
| data_id_image_version_ = 0; | | data_id_binding_version_ = 0; | |
| | | } | |
| | | | |
| | | template <typename T> | |
| | | container_statements_impl<T>:: | |
| | | container_statements_impl (connection_type& conn) | |
| | | : base (conn) | |
| | | { | |
| | | this->cond_image_bind_ = cond_image_bind_array_; | |
| | | this->data_image_bind_ = data_image_bind_array_; | |
| | | this->data_image_truncated_ = data_image_truncated_array_; | |
| | | | |
|
| std::memset (cond_image_bind_, 0, sizeof (cond_image_bind_)); | | this->cond_image_binding_.bind = this->cond_image_bind_; | |
| std::memset (data_image_bind_, 0, sizeof (data_image_bind_)); | | this->cond_image_binding_.count = traits::cond_column_count; | |
| std::memset (data_image_truncated_, 0, sizeof (data_image_truncated_) | | | |
| ); | | this->data_image_binding_.bind = this->data_image_bind_; | |
| | | this->data_image_binding_.count = traits::data_column_count; | |
| | | | |
| | | std::memset (cond_image_bind_array_, 0, sizeof (cond_image_bind_array | |
| | | _)); | |
| | | std::memset (data_image_bind_array_, 0, sizeof (data_image_bind_array | |
| | | _)); | |
| | | std::memset (data_image_truncated_array_, | |
| | | 0, | |
| | | sizeof (data_image_truncated_array_)); | |
| | | | |
| for (std::size_t i (0); i < traits::data_column_count; ++i) | | for (std::size_t i (0); i < traits::data_column_count; ++i) | |
|
| data_image_bind_[i].truncated = data_image_truncated_ + i; | | data_image_bind_array_[i].truncated = data_image_truncated_array_ + | |
| | | i; | |
| | | | |
| | | this->insert_one_text_ = traits::insert_one_statement; | |
| | | this->select_all_text_ = traits::select_all_statement; | |
| | | this->delete_all_text_ = traits::delete_all_statement; | |
| } | | } | |
| } | | } | |
| } | | } | |
| | | | |
End of changes. 5 change blocks. |
| 11 lines changed or deleted | | 34 lines changed or added | |
|
| query.hxx | | query.hxx | |
| | | | |
| skipping to change at line 1062 | | skipping to change at line 1062 | |
| { | | { | |
| b->type = sqlite::bind::integer; | | b->type = sqlite::bind::integer; | |
| b->buffer = &image_; | | b->buffer = &image_; | |
| } | | } | |
| | | | |
| private: | | private: | |
| void | | void | |
| init (const T& v) | | init (const T& v) | |
| { | | { | |
| bool dummy; | | bool dummy; | |
|
| value_traits<T, long long, id_integer>::set_image (image_, dummy, v
); | | value_traits<T, id_integer>::set_image (image_, dummy, v); | |
| } | | } | |
| | | | |
| private: | | private: | |
| long long image_; | | long long image_; | |
| }; | | }; | |
| | | | |
| // REAL | | // REAL | |
| // | | // | |
| template <typename T> | | template <typename T> | |
| struct query_param_impl<T, id_real>: query_param | | struct query_param_impl<T, id_real>: query_param | |
| | | | |
| skipping to change at line 1096 | | skipping to change at line 1096 | |
| { | | { | |
| b->type = sqlite::bind::real; | | b->type = sqlite::bind::real; | |
| b->buffer = &image_; | | b->buffer = &image_; | |
| } | | } | |
| | | | |
| private: | | private: | |
| void | | void | |
| init (const T& v) | | init (const T& v) | |
| { | | { | |
| bool dummy; | | bool dummy; | |
|
| value_traits<T, double, id_real>::set_image (image_, dummy, v); | | value_traits<T, id_real>::set_image (image_, dummy, v); | |
| } | | } | |
| | | | |
| private: | | private: | |
| double image_; | | double image_; | |
| }; | | }; | |
| | | | |
| // TEXT | | // TEXT | |
| // | | // | |
| template <typename T> | | template <typename T> | |
| struct query_param_impl<T, id_text>: query_param | | struct query_param_impl<T, id_text>: query_param | |
| | | | |
| skipping to change at line 1131 | | skipping to change at line 1131 | |
| b->buffer = buffer_.data (); | | b->buffer = buffer_.data (); | |
| b->size = &size_; | | b->size = &size_; | |
| } | | } | |
| | | | |
| private: | | private: | |
| bool | | bool | |
| init (const T& v) | | init (const T& v) | |
| { | | { | |
| bool dummy; | | bool dummy; | |
| std::size_t cap (buffer_.capacity ()); | | std::size_t cap (buffer_.capacity ()); | |
|
| value_traits<T, details::buffer, id_text>::set_image ( | | value_traits<T, id_text>::set_image (buffer_, size_, dummy, v); | |
| buffer_, size_, dummy, v); | | | |
| return cap != buffer_.capacity (); | | return cap != buffer_.capacity (); | |
| } | | } | |
| | | | |
| private: | | private: | |
| details::buffer buffer_; | | details::buffer buffer_; | |
| std::size_t size_; | | std::size_t size_; | |
| }; | | }; | |
| | | | |
| // BLOB | | // BLOB | |
| // | | // | |
| | | | |
| skipping to change at line 1169 | | skipping to change at line 1168 | |
| b->buffer = buffer_.data (); | | b->buffer = buffer_.data (); | |
| b->size = &size_; | | b->size = &size_; | |
| } | | } | |
| | | | |
| private: | | private: | |
| bool | | bool | |
| init (const T& v) | | init (const T& v) | |
| { | | { | |
| bool dummy; | | bool dummy; | |
| std::size_t cap (buffer_.capacity ()); | | std::size_t cap (buffer_.capacity ()); | |
|
| value_traits<T, details::buffer, id_blob>::set_image ( | | value_traits<T, id_blob>::set_image (buffer_, size_, dummy, v); | |
| buffer_, size_, dummy, v); | | | |
| return cap != buffer_.capacity (); | | return cap != buffer_.capacity (); | |
| } | | } | |
| | | | |
| private: | | private: | |
| details::buffer buffer_; | | details::buffer buffer_; | |
| std::size_t size_; | | std::size_t size_; | |
| }; | | }; | |
| } | | } | |
| } | | } | |
| | | | |
| | | | |
End of changes. 4 change blocks. |
| 6 lines changed or deleted | | 4 lines changed or added | |
|
| result.txx | | result.txx | |
| | | | |
| skipping to change at line 40 | | skipping to change at line 40 | |
| void result_impl<T>:: | | void result_impl<T>:: | |
| load (object_type& obj) | | load (object_type& obj) | |
| { | | { | |
| load_image (); | | load_image (); | |
| | | | |
| // This is a top-level call so the statements cannot be locked. | | // This is a top-level call so the statements cannot be locked. | |
| // | | // | |
| assert (!statements_.locked ()); | | assert (!statements_.locked ()); | |
| typename object_statements<object_type>::auto_lock l (statements_); | | typename object_statements<object_type>::auto_lock l (statements_); | |
| | | | |
|
| typename object_traits::image_type& im (statements_.image ()); | | typename object_traits::image_type& i (statements_.image ()); | |
| object_traits::init (obj, im, this->database ()); | | object_traits::init (obj, i, this->database ()); | |
| | | | |
|
| // Initialize the id image and load the rest of the object | | // Initialize the id image and binding and load the rest of the objec
t | |
| // (containers, etc). | | // (containers, etc). | |
| // | | // | |
|
| object_traits::init (statements_.id_image (), object_traits::id (im)) | | typename object_traits::id_image_type& idi (statements_.id_image ()); | |
| ; | | object_traits::init (idi, object_traits::id (i)); | |
| | | | |
| | | binding& idb (statements_.id_image_binding ()); | |
| | | if (idi.version != statements_.id_image_version () || idb.version == | |
| | | 0) | |
| | | { | |
| | | object_traits::bind (idb.bind, idi); | |
| | | statements_.id_image_version (idi.version); | |
| | | idb.version++; | |
| | | } | |
| | | | |
| object_traits::load_ (statements_, obj); | | object_traits::load_ (statements_, obj); | |
| | | | |
| statements_.load_delayed (); | | statements_.load_delayed (); | |
| l.unlock (); | | l.unlock (); | |
| } | | } | |
| | | | |
| template <typename T> | | template <typename T> | |
| typename result_impl<T>::id_type result_impl<T>:: | | typename result_impl<T>::id_type result_impl<T>:: | |
| load_id () | | load_id () | |
| { | | { | |
| | | | |
| skipping to change at line 92 | | skipping to change at line 102 | |
| binding& b (statements_.out_image_binding ()); | | binding& b (statements_.out_image_binding ()); | |
| object_traits::bind (b.bind, im, true); | | object_traits::bind (b.bind, im, true); | |
| statements_.out_image_version (im.version); | | statements_.out_image_version (im.version); | |
| b.version++; | | b.version++; | |
| } | | } | |
| | | | |
| select_statement::result r (statement_->load ()); | | select_statement::result r (statement_->load ()); | |
| | | | |
| if (r == select_statement::truncated) | | if (r == select_statement::truncated) | |
| { | | { | |
|
| object_traits::grow (im, statements_.out_image_truncated ()); | | if (object_traits::grow (im, statements_.out_image_truncated ())) | |
| | | im.version++; | |
| | | | |
| if (im.version != statements_.out_image_version ()) | | if (im.version != statements_.out_image_version ()) | |
| { | | { | |
| binding& b (statements_.out_image_binding ()); | | binding& b (statements_.out_image_binding ()); | |
| object_traits::bind (b.bind, im, true); | | object_traits::bind (b.bind, im, true); | |
| statements_.out_image_version (im.version); | | statements_.out_image_version (im.version); | |
| b.version++; | | b.version++; | |
| statement_->reload (); | | statement_->reload (); | |
| } | | } | |
| } | | } | |
| | | | |
End of changes. 4 change blocks. |
| 6 lines changed or deleted | | 17 lines changed or added | |
|
| traits.hxx | | traits.hxx | |
| | | | |
| skipping to change at line 33 | | skipping to change at line 33 | |
| { | | { | |
| enum database_type_id | | enum database_type_id | |
| { | | { | |
| id_integer, | | id_integer, | |
| id_real, | | id_real, | |
| id_text, | | id_text, | |
| id_blob | | id_blob | |
| }; | | }; | |
| | | | |
| // | | // | |
|
| | | // image_traits | |
| | | // | |
| | | | |
| | | template <database_type_id> | |
| | | struct image_traits; | |
| | | | |
| | | template <> | |
| | | struct image_traits<id_integer> {typedef long long image_type;}; | |
| | | | |
| | | template <> | |
| | | struct image_traits<id_real> {typedef double image_type;}; | |
| | | | |
| | | template <> | |
| | | struct image_traits<id_text> {typedef details::buffer image_type;}; | |
| | | | |
| | | template <> | |
| | | struct image_traits<id_blob> {typedef details::buffer image_type;}; | |
| | | | |
| | | // | |
| // value_traits | | // value_traits | |
| // | | // | |
| | | | |
|
| template <typename T, typename I, database_type_id> | | template <typename T, database_type_id> | |
| struct default_value_traits; | | struct default_value_traits; | |
| | | | |
|
| template <typename T, typename I, database_type_id ID> | | template <typename T, database_type_id ID> | |
| class value_traits: public default_value_traits<T, I, ID> | | class value_traits: public default_value_traits<T, ID> | |
| { | | { | |
| }; | | }; | |
| | | | |
|
| template <typename T, typename I, database_type_id> | | template <typename T, database_type_id ID> | |
| struct default_value_traits | | struct default_value_traits | |
| { | | { | |
| typedef T value_type; | | typedef T value_type; | |
| typedef T query_type; | | typedef T query_type; | |
|
| typedef I image_type; | | typedef typename image_traits<ID>::image_type image_type; | |
| | | | |
| static void | | static void | |
|
| set_value (T& v, I i, bool is_null) | | set_value (T& v, const image_type& i, bool is_null) | |
| { | | { | |
| if (!is_null) | | if (!is_null) | |
| v = T (i); | | v = T (i); | |
| else | | else | |
| v = T (); | | v = T (); | |
| } | | } | |
| | | | |
| static void | | static void | |
|
| set_image (I& i, bool& is_null, T v) | | set_image (image_type& i, bool& is_null, T v) | |
| { | | { | |
| is_null = false; | | is_null = false; | |
|
| i = I (v); | | i = image_type (v); | |
| } | | } | |
| }; | | }; | |
| | | | |
| // std::string specialization. | | // std::string specialization. | |
| // | | // | |
| template <> | | template <> | |
|
| struct LIBODB_SQLITE_EXPORT default_value_traits< | | struct LIBODB_SQLITE_EXPORT default_value_traits<std::string, id_text> | |
| std::string, details::buffer, id_text> | | | |
| { | | { | |
| typedef std::string value_type; | | typedef std::string value_type; | |
| typedef std::string query_type; | | typedef std::string query_type; | |
| typedef details::buffer image_type; | | typedef details::buffer image_type; | |
| | | | |
| static void | | static void | |
| set_value (std::string& v, | | set_value (std::string& v, | |
| const details::buffer& b, | | const details::buffer& b, | |
| std::size_t n, | | std::size_t n, | |
| bool is_null) | | bool is_null) | |
| | | | |
| skipping to change at line 104 | | skipping to change at line 122 | |
| const std::string&); | | const std::string&); | |
| }; | | }; | |
| | | | |
| // const char* specialization | | // const char* specialization | |
| // | | // | |
| // Specialization for const char* which only supports initialization | | // Specialization for const char* which only supports initialization | |
| // of an image from the value but not the other way around. This way | | // of an image from the value but not the other way around. This way | |
| // we can pass such values to the queries. | | // we can pass such values to the queries. | |
| // | | // | |
| template <> | | template <> | |
|
| struct LIBODB_SQLITE_EXPORT default_value_traits< | | struct LIBODB_SQLITE_EXPORT default_value_traits<const char*, id_text> | |
| const char*, details::buffer, id_text> | | | |
| { | | { | |
| typedef const char* value_type; | | typedef const char* value_type; | |
| typedef const char* query_type; | | typedef const char* query_type; | |
| typedef details::buffer image_type; | | typedef details::buffer image_type; | |
| | | | |
| static void | | static void | |
| set_image (details::buffer&, | | set_image (details::buffer&, | |
| std::size_t& n, | | std::size_t& n, | |
| bool& is_null, | | bool& is_null, | |
| const char*); | | const char*); | |
| | | | |
End of changes. 10 change blocks. |
| 12 lines changed or deleted | | 29 lines changed or added | |
|