Common ODB Runtime Library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
database.hxx
Go to the documentation of this file.
1 // file : odb/database.hxx
2 // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
3 // license : GNU GPL v2; see accompanying LICENSE file
4 
5 #ifndef ODB_DATABASE_HXX
6 #define ODB_DATABASE_HXX
7 
8 #include <odb/pre.hxx>
9 
10 #include <odb/details/config.hxx> // ODB_CXX11
11 
12 #include <map>
13 #include <string>
14 #include <memory> // std::auto_ptr, std::unique_ptr
15 #include <cstddef> // std::size_t
16 
17 #ifdef ODB_CXX11
18 # include <functional> // std::function
19 #endif
20 
21 #include <odb/traits.hxx>
22 #include <odb/forward.hxx>
23 #include <odb/schema-version.hxx>
24 #include <odb/query.hxx>
25 #include <odb/prepared-query.hxx>
26 #include <odb/result.hxx>
27 #include <odb/connection.hxx>
28 #include <odb/exceptions.hxx>
29 
30 #include <odb/details/export.hxx>
31 #include <odb/details/mutex.hxx>
32 #include <odb/details/c-string.hxx>
33 
34 namespace odb
35 {
36  class transaction_impl;
37 
38  class LIBODB_EXPORT database
39  {
40  public:
41  virtual
42  ~database ();
43 
44  // Object persistence API.
45  //
46  public:
47 
48  // Make the object persistent.
49  //
50  template <typename T>
52  persist (T& object);
53 
54  template <typename T>
56  persist (T* obj_ptr);
57 
58  template <typename T, template <typename> class P>
60  persist (const P<T>& obj_ptr);
61 
62  template <typename T, typename A1, template <typename, typename> class P>
64  persist (const P<T, A1>& obj_ptr);
65 
66  template <typename T, template <typename> class P>
68  persist (P<T>& obj_ptr);
69 
70  template <typename T, typename A1, template <typename, typename> class P>
72  persist (P<T, A1>& obj_ptr);
73 
74  template <typename T>
76  persist (const typename object_traits<T>::pointer_type& obj_ptr);
77 
78  // Load an object. Throw object_not_persistent if not found.
79  //
80  template <typename T>
82  load (const typename object_traits<T>::id_type& id);
83 
84  template <typename T>
85  void
86  load (const typename object_traits<T>::id_type& id, T& object);
87 
88  // Load (or reload, if it is already loaded) a section of an object.
89  //
90  template <typename T>
91  void
92  load (T& object, section&);
93 
94  // Reload an object.
95  //
96  template <typename T>
97  void
98  reload (T& object);
99 
100  template <typename T>
101  void
102  reload (T* obj_ptr);
103 
104  template <typename T, template <typename> class P>
105  void
106  reload (const P<T>& obj_ptr);
107 
108  template <typename T, typename A1, template <typename, typename> class P>
109  void
110  reload (const P<T, A1>& obj_ptr);
111 
112  template <typename T, template <typename> class P>
113  void
114  reload (P<T>& obj_ptr);
115 
116  template <typename T, typename A1, template <typename, typename> class P>
117  void
118  reload (P<T, A1>& obj_ptr);
119 
120  template <typename T>
121  void
122  reload (const typename object_traits<T>::pointer_type& obj_ptr);
123 
124  // Loan an object if found. Return NULL/false if not found.
125  //
126  template <typename T>
128  find (const typename object_traits<T>::id_type& id);
129 
130  template <typename T>
131  bool
132  find (const typename object_traits<T>::id_type& id, T& object);
133 
134  // Update the state of a modified objects.
135  //
136  template <typename T>
137  void
138  update (T& object);
139 
140  template <typename T>
141  void
142  update (T* obj_ptr);
143 
144  template <typename T, template <typename> class P>
145  void
146  update (const P<T>& obj_ptr);
147 
148  template <typename T, typename A1, template <typename, typename> class P>
149  void
150  update (const P<T, A1>& obj_ptr);
151 
152  template <typename T, template <typename> class P>
153  void
154  update (P<T>& obj_ptr);
155 
156  template <typename T, typename A1, template <typename, typename> class P>
157  void
158  update (P<T, A1>& obj_ptr);
159 
160  template <typename T>
161  void
162  update (const typename object_traits<T>::pointer_type& obj_ptr);
163 
164  // Update a section of an object. Throws section_not_loaded exception
165  // if section is not loaded. Note also that this function does not
166  // clear the changed flag if it is set.
167  //
168  template <typename T>
169  void
170  update (const T& object, const section&);
171 
172  // Make the object transient. Throw object_not_persistent if not
173  // found.
174  //
175  template <typename T>
176  void
177  erase (const typename object_traits<T>::id_type& id);
178 
179  template <typename T>
180  void
181  erase (T& object);
182 
183  template <typename T>
184  void
185  erase (T* obj_ptr);
186 
187  template <typename T, template <typename> class P>
188  void
189  erase (const P<T>& obj_ptr);
190 
191  template <typename T, typename A1, template <typename, typename> class P>
192  void
193  erase (const P<T, A1>& obj_ptr);
194 
195  template <typename T, template <typename> class P>
196  void
197  erase (P<T>& obj_ptr);
198 
199  template <typename T, typename A1, template <typename, typename> class P>
200  void
201  erase (P<T, A1>& obj_ptr);
202 
203  template <typename T>
204  void
205  erase (const typename object_traits<T>::pointer_type& obj_ptr);
206 
207  // Erase multiple objects matching a query predicate.
208  //
209  template <typename T>
210  unsigned long long
211  erase_query ();
212 
213  template <typename T>
214  unsigned long long
215  erase_query (const char*);
216 
217  template <typename T>
218  unsigned long long
219  erase_query (const std::string&);
220 
221  template <typename T>
222  unsigned long long
223  erase_query (const odb::query<T>&);
224 
225  // Query API.
226  //
227  template <typename T>
228  result<T>
229  query (bool cache = true);
230 
231  template <typename T>
232  result<T>
233  query (const char*, bool cache = true);
234 
235  template <typename T>
236  result<T>
237  query (const std::string&, bool cache = true);
238 
239  template <typename T>
240  result<T>
241  query (const odb::query<T>&, bool cache = true);
242 
243  // Query preparation.
244  //
245  template <typename T>
247  prepare_query (const char* name, const char*);
248 
249  template <typename T>
251  prepare_query (const char* name, const std::string&);
252 
253  template <typename T>
255  prepare_query (const char* name, const odb::query<T>&);
256 
257  template <typename T>
258  void
259  cache_query (const prepared_query<T>&);
260 
261  template <typename T, typename P>
262  void
263  cache_query (const prepared_query<T>&, std::auto_ptr<P> params);
264 
265 #ifdef ODB_CXX11
266  template <typename T, typename P>
267  void
268  cache_query (const prepared_query<T>&, std::unique_ptr<P> params);
269 #endif
270 
271  template <typename T>
273  lookup_query (const char* name) const;
274 
275  template <typename T, typename P>
277  lookup_query (const char* name, P*& params) const;
278 
279  // Prepared query factory.
280  //
281  public:
283 
284 #ifdef ODB_CXX11
285  typedef
286  std::function<void (const char*, connection_type&)>
287  query_factory_type;
288 #else
289  typedef void (*query_factory_type) (const char*, connection_type&);
290 #endif
291 
292  void
293  query_factory (const char* name, query_factory_type);
294 
295  query_factory_type
296  lookup_query_factory (const char* name) const;
297 
298  // Native database statement execution.
299  //
300  public:
301  unsigned long long
302  execute (const char* statement);
303 
304  unsigned long long
305  execute (const std::string& statement);
306 
307  unsigned long long
308  execute (const char* statement, std::size_t length);
309 
310  // Transactions.
311  //
312  public:
313  virtual transaction_impl*
314  begin () = 0;
315 
316  // Connections.
317  //
318  public:
320  connection ();
321 
322  // SQL statement tracing.
323  //
324  public:
326 
327  void
328  tracer (tracer_type&);
329 
330  void
331  tracer (tracer_type*);
332 
333  tracer_type*
334  tracer () const;
335 
336  // Database schema version.
337  //
338  public:
341 
343  schema_version (const std::string& schema_name = "") const;
344 
345  bool
346  schema_migration (const std::string& schema_name = "") const;
347 
348  // Note that there is code that relies on the returned reference
349  // being valid until the version is changed or the database instance
350  // is destroyed.
351  //
353  schema_version_migration (const std::string& schema_name = "") const;
354 
355  // Set schema version and migration state manually.
356  //
357  // Note that the modifier API is not thread-safe. That is, you should
358  // not modify the schema version while other threads may be accessing
359  // or modifying the same information.
360  //
361  void
363  bool migration,
364  const std::string& schema_name = "");
365 
366  void
368  const std::string& schema_name = "");
369 
370  // Set default schema version table for all the schema names. The table
371  // name should already be quoted if necessary.
372  //
373  void
374  schema_version_table (const std::string& table_name);
375 
376  // Set schema version table for a specific schema.
377  //
378  void
379  schema_version_table (const std::string& table_name,
380  const std::string& schema_name);
381 
382  // Schema version sequence number. It is incremented every time the
383  // schema version or migration flag is changed and can be used to
384  // detect overall version changes. The starting value is 1.
385  //
386  unsigned int
387  schema_version_sequence () const;
388 
389  protected:
391  {
392  std::string version_table;
393  };
394 
395  virtual const schema_version_info&
396  load_schema_version (const std::string& schema_name) const = 0;
397 
398  private:
399  const schema_version_info&
400  schema_version_migration_ (const std::string& schema_name) const;
401 
402  // Database id.
403  //
404  public:
406  id () const;
407 
408  protected:
410 
411  private:
412  database (const database&);
413  database& operator= (const database&);
414 
415  protected:
416  virtual connection_type*
417  connection_ () = 0;
418 
419  protected:
420  template <typename T, database_id DB>
422  persist_ (T&);
423 
424  template <typename T, database_id DB>
426  persist_ (const typename object_traits<T>::pointer_type&);
427 
428  template <typename T, database_id DB>
430  load_ (const typename object_traits<T>::id_type&);
431 
432  template <typename T, database_id DB>
433  void
434  load_ (const typename object_traits<T>::id_type&, T&);
435 
436  template <typename T, database_id DB>
437  void
438  load_ (T&, section&);
439 
440  template <typename T, database_id DB>
441  void
442  reload_ (T&);
443 
444  template <typename T, database_id DB>
446  find_ (const typename object_traits<T>::id_type&);
447 
448  template <typename T, database_id DB>
449  bool
450  find_ (const typename object_traits<T>::id_type&, T&);
451 
452  template <typename T, database_id DB>
453  void
454  update_ (T&);
455 
456  template <typename T, database_id DB>
457  void
458  update_ (const typename object_traits<T>::pointer_type&);
459 
460  template <typename T, database_id DB>
461  void
462  update_ (const T&, const section&);
463 
464  template <typename T, database_id DB>
465  void
466  erase_ (const typename object_traits<T>::id_type&);
467 
468  template <typename T, database_id DB>
469  void
470  erase_ (T&);
471 
472  template <typename T, database_id DB>
473  void
474  erase_ (const typename object_traits<T>::pointer_type&);
475 
476  template <typename T,
477  database_id DB,
479  struct query_;
480 
481  protected:
482  typedef
483  std::map<const char*, query_factory_type, details::c_string_comparator>
485 
486  typedef std::map<std::string, schema_version_info> schema_version_map;
487 
491 
492  mutable details::mutex mutex_;
495  unsigned int schema_version_seq_;
496  };
497 }
498 
499 #include <odb/database.ixx>
500 #include <odb/database.txx>
501 
502 #include <odb/post.hxx>
503 
504 #endif // ODB_DATABASE_HXX
Definition: statement.hxx:20
Definition: database.hxx:390
Definition: database.hxx:479
details::shared_ptr< connection > connection_ptr
Definition: connection.hxx:30
odb::tracer tracer_type
Definition: database.hxx:325
odb::schema_version_migration schema_version_migration_type
Definition: database.hxx:340
odb::schema_version schema_version_type
Definition: database.hxx:339
schema_version_map schema_version_map_
Definition: database.hxx:493
std::map< const char *, query_factory_type, details::c_string_comparator > query_factory_map
Definition: database.hxx:479
tracer_type * tracer_
Definition: database.hxx:489
query_factory_map query_factory_map_
Definition: database.hxx:490
std::string schema_version_table_
Definition: database.hxx:494
class_kind
Definition: traits.hxx:77
database_id id_
Definition: database.hxx:488
Definition: query.hxx:110
Definition: forward.hxx:123
Definition: prepared-query.hxx:55
odb::connection connection_type
Definition: database.hxx:282
std::string version_table
Definition: database.hxx:392
Definition: transaction.hxx:216
details::mutex mutex_
Definition: database.hxx:492
unsigned long long schema_version
Definition: forward.hxx:30
Definition: database.hxx:38
Definition: connection.hxx:33
Definition: tracer.hxx:15
database_id
Definition: forward.hxx:74
Definition: schema-version.hxx:15
Definition: section.hxx:15
Definition: result.hxx:75
unsigned int schema_version_seq_
Definition: database.hxx:495
access::object_traits< T >::pointer_type pointer_type
Definition: traits.hxx:116
std::map< std::string, schema_version_info > schema_version_map
Definition: database.hxx:486
Definition: traits.hxx:85