1 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2 
3 #ifdef _ODBC  // Enable Nanodbc only if an odbc driver was found
4 
5 //! \file nanodbc.h The entirety of nanodbc can be found within this file and nanodbc.cpp.
6 
7 //! \mainpage
8 //!
9 //! \section synopsis Synopsis
10 //! This library provides a wrapper API for the native ODBC API. It aims to do everything ODBC does, but with a \b much nicer interface.
11 //! Anything it doesn't (yet) do can be done by retrieving the native ODBC handles and dropping down to straight ODBC C API code.
12 //! For more propaganda, please see the <a href="http://lexicalunit.github.com/nanodbc/">project homepage</a>.
13 //!
14 //! \section toc Table of Contents
15 //! - \ref license "License"
16 //! - \ref credits "Credits"
17 //! - Source level documentation:
18 //!     - \ref nanodbc "nanodbc namespace"
19 //!     - \ref exceptions
20 //!     - \ref utility
21 //!     - \ref mainc
22 //!     - \ref mainf
23 //!     - \ref binding
24 //!     - \ref bind_multi
25 //!     - \ref bind_strings
26 //!
27 //! \section license License
28 //! <div class="license">
29 //! Copyright (c) 2013 lexicalunit <lexicalunit@lexicalunit.com>
30 //!
31 //! The MIT License
32 //!
33 //! Permission is hereby granted, free of charge, to any person obtaining a copy
34 //! of this software and associated documentation files (the "Software"), to deal
35 //! in the Software without restriction, including without limitation the rights
36 //! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37 //! copies of the Software, and to permit persons to whom the Software is
38 //! furnished to do so, subject to the following conditions:
39 //!
40 //! The above copyright notice and this permission notice shall be included in
41 //! all copies or substantial portions of the Software.
42 //!
43 //! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44 //! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45 //! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46 //! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47 //! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48 //! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49 //! THE SOFTWARE.
50 //! </div>
51 //!
52 //! \section credits Credits
53 //! <div class="license">
54 //! Much of the code in this file was originally derived from TinyODBC.
55 //! TinyODBC is hosted at http://code.google.com/p/tiodbc/
56 //! Copyright (c) 2008 SqUe squarious@gmail.com
57 //! License: The MIT License
58 //!
59 //! The idea for using RAII for transactions was inspired by SimpleDB: C++ ODBC database API,
60 //! however the code in nanodbc is original and not derived from SimpleDB. Therefore
61 //! the LGPL license under which SimpleDB is distributed does NOT apply to nanodbc.
62 //! SimpleDB is hosted at http://simpledb.sourceforge.net
63 //! Copyright (c) 2006 Eminence Technology Pty Ltd
64 //! Copyright (c) 2008-2010,2012 Russell Kliese russell@kliese.id.au
65 //! License: GNU Lesser General Public version 2.1
66 //!
67 //! Some improvements and features are based on The Python ODBC Library.
68 //! The Python ODBC Library is hosted at http://code.google.com/p/pyodbc/
69 //! License: The MIT License
70 //!
71 //! Implementation of column binding inspired by Nick E. Geht's source code posted to on CodeGuru.
72 //! GSODBC hosted at http://www.codeguru.com/mfc_database/gsodbc.html
73 //! Copyright (c) 2002 Nick E. Geht
74 //! License: Perpetual license to reproduce, distribute, adapt, perform, display, and sublicense.
75 //! See http://www.codeguru.com/submission-guidelines.php for details.
76 //! </div>
77 
78 #ifndef NANODBC_H
79 #define NANODBC_H
80 
81 #include <functional>
82 #include <memory>
83 #include <stdexcept>
84 #include <string>
85 #include <vector>
86 
87 #ifndef  __clang__
88     #include <cstdint>
89 #endif
90 
91 //! \brief The entirety of nanodbc can be found within this one namespace.
92 //! \note This library does not make any exception safety guarantees, but should work just fine with a threading enabled ODBC driver. If you want to use nanodbc objects in threads I recommend each thread keep their own connection to the database. Otherwise you must synchronize any access to nanodbc objects.
93 namespace nanodbc
94 {
95 
96 //  .d8888b.                     .d888 d8b                                   888    d8b
97 // d88P  Y88b                   d88P"  Y8P                                   888    Y8P
98 // 888    888                   888                                          888
99 // 888         .d88b.  88888b.  888888 888  .d88b.  888  888 888d888 8888b.  888888 888  .d88b.  88888b.
100 // 888        d88""88b 888 "88b 888    888 d88P"88b 888  888 888P"      "88b 888    888 d88""88b 888 "88b
101 // 888    888 888  888 888  888 888    888 888  888 888  888 888    .d888888 888    888 888  888 888  888
102 // Y88b  d88P Y88..88P 888  888 888    888 Y88b 888 Y88b 888 888    888  888 Y88b.  888 Y88..88P 888  888
103 //  "Y8888P"   "Y88P"  888  888 888    888  "Y88888  "Y88888 888    "Y888888  "Y888 888  "Y88P"  888  888
104 //                                              888
105 //                                         Y8b d88P
106 //                                          "Y88P"
107 // MARK: Configuration -
108 
109 //! \addtogroup macros Macros
110 //! \brief Macros that nanodbc uses, can be overriden by users.
111 //!
112 //! @{
113 
114 #ifdef DOXYGEN
115     //! \def NANODBC_ASSERT(expression)
116     //! \brief Assertion.
117     //!
118     //! By default, nanodbc uses C \c assert() for internal assertions.
119     //! User can override it by defining \c NANODBC_ASSERT(expr) macro
120     //! in the nanodbc.h file and customizing it as desired,
121     //! before building the library.
122     //!
123     //! \code{.cpp}
124     //! #ifdef _DEBUG
125     //!     #include <crtdbg.h>
126     //!     #define NANODBC_ASSERT _ASSERTE
127     //! #endif
128     //! \endcode
129     #define NANODBC_ASSERT(expression) assert(expression)
130 #endif
131 
132 //! @}
133 
134 // You must explicitly request Unicode support by defining NANODBC_USE_UNICODE at compile time.
135 #ifndef DOXYGEN
136     #ifdef NANODBC_USE_UNICODE
137         #ifdef NANODBC_USE_IODBC_WIDE_STRINGS
138             typedef std::u32string string_type;
139         #else
140             typedef std::u16string string_type;
141         #endif
142     #else
143         typedef std::string string_type;
144     #endif // NANODBC_USE_UNICODE
145 
146     #if defined(_WIN64)
147         // LLP64 machine: Windows
148         typedef std::int64_t null_type;
149     #elif !defined(_WIN64) && defined( __LP64__)
150         // LP64 machine: OS X or Linux
151         typedef long null_type;
152     #else
153         // 32-bit machine
154         typedef long null_type;
155     #endif
156 #else
157     //! \c string_type will be \c std::u16string or \c std::32string if \c NANODBC_USE_UNICODE is defined, otherwise \c std::string.
158     typedef unspecified-type string_type;
159     //! \c null_type will be \c int64_t for 64-bit compilations, otherwise \c long.
160     typedef unspecified-type null_type;
161 #endif // DOXYGEN
162 
163 #if defined(_MSC_VER) && _MSC_VER <= 1800
164     // These versions of Visual C++ do not yet support \c noexcept or \c std::move.
165     #define NANODBC_NOEXCEPT
166     #define NANODBC_NO_MOVE_CTOR
167 #else
168     #define NANODBC_NOEXCEPT noexcept
169 #endif
170 
171 // 8888888888                                      888    888                        888 888 d8b
172 // 888                                             888    888                        888 888 Y8P
173 // 888                                             888    888                        888 888
174 // 8888888    888d888 888d888 .d88b.  888d888      8888888888  8888b.  88888b.   .d88888 888 888 88888b.   .d88b.
175 // 888        888P"   888P"  d88""88b 888P"        888    888     "88b 888 "88b d88" 888 888 888 888 "88b d88P"88b
176 // 888        888     888    888  888 888          888    888 .d888888 888  888 888  888 888 888 888  888 888  888
177 // 888        888     888    Y88..88P 888          888    888 888  888 888  888 Y88b 888 888 888 888  888 Y88b 888
178 // 8888888888 888     888     "Y88P"  888          888    888 "Y888888 888  888  "Y88888 888 888 888  888  "Y88888
179 //                                                                                                             888
180 //                                                                                                        Y8b d88P
181 //                                                                                                         "Y88P"
182 // MARK: Error Handling -
183 
184 //! \addtogroup exceptions Exception types
185 //! \brief Possible error conditions.
186 //!
187 //! Specific errors such as \c type_incompatible_error, \c null_access_error, and \c index_range_error can arise
188 //! from improper use of the nanodbc library. The general \c database_error is for all other situations
189 //! in which the ODBC driver or C API reports an error condition. The explanatory string for database_error
190 //! will, if possible, contain a diagnostic message obtained from \c SQLGetDiagRec().
191 //! @{
192 
193 //! \brief Type incompatible.
194 //! \see exceptions
195 class type_incompatible_error : public std::runtime_error
196 {
197 public:
198     type_incompatible_error();
199     const char* what() const NANODBC_NOEXCEPT;
200 };
201 
202 //! \brief Accessed null data.
203 //! \see exceptions
204 class null_access_error : public std::runtime_error
205 {
206 public:
207     null_access_error();
208     const char* what() const NANODBC_NOEXCEPT;
209 };
210 
211 //! \brief Index out of range.
212 //! \see exceptions
213 class index_range_error : public std::runtime_error
214 {
215 public:
216     index_range_error();
217     const char* what() const NANODBC_NOEXCEPT;
218 };
219 
220 //! \brief Programming logic error.
221 //! \see exceptions
222 class programming_error : public std::runtime_error
223 {
224 public:
225     explicit programming_error(const std::string& info);
226     const char* what() const NANODBC_NOEXCEPT;
227 };
228 
229 //! \brief General database error.
230 //! \see exceptions
231 class database_error : public std::runtime_error
232 {
233 public:
234     //! \brief Creates a runtime_error with a message describing the last ODBC error generated for the given handle and handle_type.
235     //! \param handle The native ODBC statement or connection handle.
236     //! \param handle_type The native ODBC handle type code for the given handle.
237     //! \param info Additional information that will be appended to the beginning of the error message.
238     database_error(void* handle, short handle_type, const std::string& info = "");
239     const char* what() const NANODBC_NOEXCEPT;
240     const long native() const NANODBC_NOEXCEPT;
241     const std::string state() const NANODBC_NOEXCEPT;
242 private:
243     long native_error;
244     std::string sql_state;
245     std::string message;
246 };
247 
248 //! @}
249 
250 // 888     888 888    d8b 888 d8b 888    d8b
251 // 888     888 888    Y8P 888 Y8P 888    Y8P
252 // 888     888 888        888     888
253 // 888     888 888888 888 888 888 888888 888  .d88b.  .d8888b
254 // 888     888 888    888 888 888 888    888 d8P  Y8b 88K
255 // 888     888 888    888 888 888 888    888 88888888 "Y8888b.
256 // Y88b. .d88P Y88b.  888 888 888 Y88b.  888 Y8b.          X88
257 //  "Y88888P"   "Y888 888 888 888  "Y888 888  "Y8888   88888P'
258 // MARK: Utilities -
259 
260 //! \addtogroup utility Utilities
261 //! \brief Additional nanodbc utility classes and functions.
262 //!
263 //! \{
264 
265 //! \brief A type for representing date data.
266 struct date
267 {
268     std::int16_t year; //!< Year [0-inf).
269     std::int16_t month; //!< Month of the year [1-12].
270     std::int16_t day; //!< Day of the month [1-31].
271 };
272 
273 //! \brief A type for representing timestamp data.
274 struct timestamp
275 {
276     std::int16_t year;   //!< Year [0-inf).
277     std::int16_t month;  //!< Month of the year [1-12].
278     std::int16_t day;    //!< Day of the month [1-31].
279     std::int16_t hour;   //!< Hours since midnight [0-23].
280     std::int16_t min;    //!< Minutes after the hour [0-59].
281     std::int16_t sec;    //!< Seconds after the minute.
282     std::int32_t fract;  //!< Fractional seconds.
283 };
284 
285 //! \}
286 
287 //! \addtogroup mainc Main classes
288 //! \brief Main nanodbc classes.
289 //!
290 //! @{
291 
292 // 88888888888                                                  888    d8b
293 //     888                                                      888    Y8P
294 //     888                                                      888
295 //     888  888d888 8888b.  88888b.  .d8888b   8888b.   .d8888b 888888 888  .d88b.  88888b.
296 //     888  888P"      "88b 888 "88b 88K          "88b d88P"    888    888 d88""88b 888 "88b
297 //     888  888    .d888888 888  888 "Y8888b. .d888888 888      888    888 888  888 888  888
298 //     888  888    888  888 888  888      X88 888  888 Y88b.    Y88b.  888 Y88..88P 888  888
299 //     888  888    "Y888888 888  888  88888P' "Y888888  "Y8888P  "Y888 888  "Y88P"  888  888
300 // MARK: Transaction -
301 
302 //! \brief A resource for managing transaction commits and rollbacks.
303 //!
304 //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
305 class transaction
306 {
307 public:
308     //! \brief Begin a transaction on the given connection object.
309     //! \post Operations that modify the database must now be committed before taking effect.
310     //! \throws database_error
311     explicit transaction(const class connection& conn);
312 
313     //! Copy constructor.
314     transaction(const transaction& rhs);
315 
316     #ifndef NANODBC_NO_MOVE_CTOR
317         //! Move constructor.
318         transaction(transaction&& rhs) NANODBC_NOEXCEPT;
319     #endif
320 
321     //! Assignment.
322     transaction& operator=(transaction rhs);
323 
324     //! Member swap.
325     void swap(transaction& rhs) NANODBC_NOEXCEPT;
326 
327     //! \brief If this transaction has not been committed, will will rollback any modifying operations.
328     ~transaction() NANODBC_NOEXCEPT;
329 
330     //! \brief Marks this transaction for commit.
331     //! \throws database_error
332     void commit();
333 
334     //! \brief Marks this transaction for rollback.
335     void rollback() NANODBC_NOEXCEPT;
336 
337     //! Returns the connection object.
338     class connection& connection();
339 
340     //! Returns the connection object.
341     const class connection& connection() const;
342 
343     //! Returns the connection object.
344     operator class connection&();
345 
346     //! Returns the connection object.
347     operator const class connection&() const;
348 
349 private:
350     class transaction_impl;
351     friend class nanodbc::connection;
352 
353 private:
354     std::shared_ptr<transaction_impl> impl_;
355 };
356 
357 //  .d8888b.  888             888                                            888
358 // d88P  Y88b 888             888                                            888
359 // Y88b.      888             888                                            888
360 //  "Y888b.   888888  8888b.  888888 .d88b.  88888b.d88b.   .d88b.  88888b.  888888
361 //     "Y88b. 888        "88b 888   d8P  Y8b 888 "888 "88b d8P  Y8b 888 "88b 888
362 //       "888 888    .d888888 888   88888888 888  888  888 88888888 888  888 888
363 // Y88b  d88P Y88b.  888  888 Y88b. Y8b.     888  888  888 Y8b.     888  888 Y88b.
364 //  "Y8888P"   "Y888 "Y888888  "Y888 "Y8888  888  888  888  "Y8888  888  888  "Y888
365 // MARK: Statement -
366 
367 //! \brief Represents a statement on the database.
368 class statement
369 {
370 public:
371     //! \brief Provides support for retrieving output/return parameters.
372     //! \see binding
373     enum param_direction
374     {
375         PARAM_IN //!< Binding an input parameter.
376         , PARAM_OUT //!< Binding an output parameter.
377         , PARAM_INOUT //!< Binding an input/output parameter.
378         , PARAM_RETURN //!< Binding a return parameter.
379     };
380 
381 public:
382     //! \brief Creates a new un-prepared statement.
383     //! \see execute(), just_execute(), execute_direct(), just_execute_direct(), open(), prepare()
384     statement();
385 
386     //! \brief Constructs a statement object and associates it to the given connection.
387     //! \param conn The connection to use.
388     //! \see open(), prepare()
389     explicit statement(class connection& conn);
390 
391     //! \brief Constructs and prepares a statement using the given connection and query.
392     //! \param conn The connection to use.
393     //! \param query The SQL query statement.
394     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
395     //! \see execute(), just_execute(), execute_direct(), just_execute_direct(), open(), prepare()
396     statement(class connection& conn, const string_type& query, long timeout = 0);
397 
398     //! Copy constructor.
399     statement(const statement& rhs);
400 
401     #ifndef NANODBC_NO_MOVE_CTOR
402         //! Move constructor.
403         statement(statement&& rhs) NANODBC_NOEXCEPT;
404     #endif
405 
406     //! Assignment.
407     statement& operator=(statement rhs);
408 
409     //! Member swap.
410     void swap(statement& rhs) NANODBC_NOEXCEPT;
411 
412     //! \brief Closes the statement.
413     //! \see close()
414     ~statement() NANODBC_NOEXCEPT;
415 
416     //! \brief Creates a statement for the given connection.
417     //! \param conn The connection where the statement will be executed.
418     //! \throws database_error
419     void open(class connection& conn);
420 
421     //! \brief Returns true if connection is open.
422     bool open() const;
423 
424     //! \brief Returns true if connected to the database.
425     bool connected() const;
426 
427     //! \brief Returns the associated connection object if any.
428     class connection& connection();
429 
430     //! \brief Returns the associated connection object if any.
431     const class connection& connection() const;
432 
433     //! \brief Returns the native ODBC statement handle.
434     void* native_statement_handle() const;
435 
436     //! \brief Closes the statement and frees all associated resources.
437     void close();
438 
439     //! \brief Cancels execution of the statement.
440     //! \throws database_error
441     void cancel();
442 
443     //! \brief Opens and prepares the given statement to execute on the given connection.
444     //! \param conn The connection where the statement will be executed.
445     //! \param query The SQL query that will be executed.
446     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
447     //! \see open()
448     //! \throws database_error
449     void prepare(class connection& conn, const string_type& query, long timeout = 0);
450 
451     //! \brief Prepares the given statement to execute its associated connection.
452     //! If the statement is not open throws programming_error.
453     //! \param query The SQL query that will be executed.
454     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
455     //! \see open()
456     //! \throws database_error, programming_error
457     void prepare(const string_type& query, long timeout = 0);
458 
459     //! \brief Sets the number in seconds before query timeout. Default is 0 indicating no timeout.
460     //! \throws database_error
461     void timeout(long timeout = 0);
462 
463     //! \brief Immediately opens, prepares, and executes the given query directly on the given connection.
464     //! \param conn The connection where the statement will be executed.
465     //! \param query The SQL query that will be executed.
466     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
467     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
468     //! \return A result set object.
469     //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
470     //! \see open(), prepare(), execute(), result, transaction
471     class result execute_direct(class connection& conn, const string_type& query, long batch_operations = 1, long timeout = 0);
472 
473     //! \brief Immediately opens, prepares, and executes the given query directly on the given connection, in asynchronous mode.
474     //!
475     //! This method will only be available if nanodbc is built against ODBC headers and library that supports asynchronous mode.
476     //! Such that the identifiers `SQL_ATTR_ASYNC_STMT_EVENT` and `SQLCompleteAsync` are extant. Otherwise
477     //! this method will be defined, but not implemented.
478     //!
479     //! \param conn The connection where the statement will be executed.
480     //! \param event_handle The event handle for which the caller will wait before calling async_complete.
481     //! \param query The SQL query that will be executed.
482     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
483     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
484     //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
485     //! \see open(), prepare(), execute(), result, transaction
486     void async_execute_direct(class connection& conn, void* event_handle, const string_type& query, long batch_operations = 1, long timeout = 0);
487 
488     //! \brief Completes a previously initiated asynchronous query operation, returning the result.
489     //!
490     //! This method will only be available if nanodbc is built against ODBC headers and library that supports asynchronous mode.
491     //! Such that the identifiers `SQL_ATTR_ASYNC_STMT_EVENT` and `SQLCompleteAsync` are extant. Otherwise
492     //! this method will be defined, but not implemented.
493     //!
494     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
495     class result async_complete(long batch_operations = 1);
496 
497     //! \brief Execute the previously prepared query now without constructing result object.
498     //! \param conn The connection where the statement will be executed.
499     //! \param query The SQL query that will be executed.
500     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
501     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
502     //! \throws database_error
503     //! \return A result set object.
504     //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
505     //! \see open(), prepare(), execute(), execute_direct(), result, transaction
506     void just_execute_direct(class connection& conn, const string_type& query, long batch_operations = 1, long timeout = 0);
507 
508     //! \brief Execute the previously prepared query now.
509     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
510     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
511     //! \throws database_error
512     //! \return A result set object.
513     //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
514     //! \see open(), prepare(), result, transaction
515     class result execute(long batch_operations = 1, long timeout = 0);
516 
517     //! \brief Execute the previously prepared query now without constructing result object.
518     //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
519     //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
520     //! \throws database_error
521     //! \return A result set object.
522     //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
523     //! \see open(), prepare(), execute(), result, transaction
524     void just_execute(long batch_operations = 1, long timeout = 0);
525 
526     //! \brief Returns the input and output paramters of the specified stored procedure.
527     //! \param catalog The catalog name of the procedure.
528     //! \param schema Pattern to use for schema names.
529     //! \param procedure The name of the procedure.
530     //! \param column Pattern to use for column names.
531     //! \throws database_error
532     //! \return A result set object.
533     class result procedure_columns(const string_type& catalog, const string_type& schema, const string_type& procedure, const string_type& column);
534 
535     //! \brief Returns the number of rows affected by the request or -1 if the number of affected rows is not available.
536     //! \throws database_error
537     long affected_rows() const;
538 
539     //! \brief Returns the number of columns in a result set.
540     //! \throws database_error
541     short columns() const;
542 
543     //! \brief Resets all currently bound parameters.
544     void reset_parameters() NANODBC_NOEXCEPT;
545 
546     //! \brief Returns the parameter size for the indicated parameter placeholder within a prepared statement.
547     unsigned long parameter_size(short param) const;
548 
549     //! \addtogroup binding Binding parameters
550     //! \brief These functions are used to bind values to ODBC parameters.
551     //!
552     //! @{
553 
554     //! \brief Binds the given value to the given parameter placeholder number in the prepared statement.
555     //!
556     //! If your prepared SQL query has any ? placeholders, this is how you bind values to them.
557     //! Placeholder numbers count from left to right and are 0-indexed.
558     //!
559     //! It is NOT possible to use these functions for bulk operations as number of elements is not specified here.
560     //!
561     //! \param param Placeholder position.
562     //! \param value Value to substitute into placeholder.
563     //! \param direction ODBC parameter direction.
564     //! \throws database_error
565     template<class T>
566     void bind(short param, const T* value, param_direction direction = PARAM_IN);
567 
568     //! \addtogroup bind_multi Binding multiple non-string values
569     //! \brief Binds the given values to the given parameter placeholder number in the prepared statement.
570     //!
571     //! If your prepared SQL query has any ? placeholders, this is how you bind values to them.
572     //! Placeholder numbers count from left to right and are 0-indexed.
573     //!
574     //! It is possible to use these functions for bulk operations.
575     //!
576     //! \param param Placeholder position.
577     //! \param values Values to substitute into placeholder.
578     //! \param elements The number of elements being bound.
579     //! \param null_sentry Value which should represent a null value.
580     //! \param nulls Flags for values that should be set to a null value.
581     //! \param param_direciton ODBC parameter direction.
582     //! \throws database_error
583     //!
584     //! @{
585 
586     //! \brief Binds multiple values.
587     //! \see bind_multi
588     template<class T>
589     void bind(short param, const T* values, std::size_t elements, param_direction direction = PARAM_IN);
590 
591     //! \brief Binds multiple values.
592     //! \see bind_multi
593     template<class T>
594     void bind(short param, const T* values, std::size_t elements, const T* null_sentry, param_direction direction = PARAM_IN);
595 
596     //! \brief Binds multiple values.
597     //! \see bind_multi
598     template<class T>
599     void bind(short param, const T* values, std::size_t elements, const bool* nulls, param_direction direction = PARAM_IN);
600 
601     //! @}
602 
603     //! \addtogroup bind_strings Binding multiple string values
604     //! \brief Binds the given string values to the given parameter placeholder number in the prepared statement.
605     //!
606     //! If your prepared SQL query has any ? placeholders, this is how you bind values to them.
607     //! Placeholder numbers count from left to right and are 0-indexed.
608     //!
609     //! It is possible to use these functions for bulk operations.
610     //!
611     //! \param param Placeholder position.
612     //! \param values Values to substitute into placeholder.
613     //! \param length Maximum length of string elements.
614     //! \param elements The number of elements being bound. Otherwise the value N is taken as the number of elements.
615     //! \param null_sentry Value which should represent a null value.
616     //! \param nulls Flags for values that should be set to a null value.
617     //! \param param_direciton ODBC parameter direction.
618     //! \throws database_error
619     //!
620     //! @{
621 
622     //! \brief Binds multiple string values.
623     //! \see bind_strings
624     void bind_strings(
625         short param
626         , const string_type::value_type* values
627         , std::size_t length
628         , std::size_t elements
629         , param_direction direction = PARAM_IN);
630 
631     //! \brief Binds multiple string values.
632     //! \see bind_strings
633     template<std::size_t N, std::size_t M>
634     void bind_strings(
635         short param
636         , const string_type::value_type(&values)[N][M]
637         , param_direction direction = PARAM_IN)
638     {
639         bind_strings(
640             param
641             , reinterpret_cast<const string_type::value_type*>(values)
642             , M
643             , N
644             , direction);
645     }
646 
647     //! \brief Binds multiple string values.
648     //! \see bind_strings
649     void bind_strings(
650         short param
651         , const string_type::value_type* values
652         , std::size_t length
653         , std::size_t elements
654         , const string_type::value_type* null_sentry
655         , param_direction direction = PARAM_IN);
656 
657     //! \brief Binds multiple string values.
658     //! \see bind_strings
659     template<std::size_t N, std::size_t M>
660     void bind_strings(
661         short param
662         , const string_type::value_type(&values)[N][M]
663         , const string_type::value_type* null_sentry
664         , param_direction direction = PARAM_IN)
665     {
666         bind_strings(
667             param
668             , reinterpret_cast<const string_type::value_type*>(values)
669             , M
670             , N
671             , null_sentry
672             , direction);
673     }
674 
675     //! \brief Binds multiple string values.
676     //! \see bind_strings
677     void bind_strings(
678         short param
679         , const string_type::value_type* values
680         , std::size_t length
681         , std::size_t elements
682         , const bool* nulls
683         , param_direction direction = PARAM_IN);
684 
685     //! \brief Binds multiple string values.
686     //! \see bind_strings
687     template<std::size_t N, std::size_t M>
688     void bind_strings(
689         short param
690         , const string_type::value_type(&values)[N][M]
691         , const bool* nulls
692         , param_direction direction = PARAM_IN)
693     {
694         bind_strings(
695             param
696             , reinterpret_cast<const string_type::value_type*>(values)
697             , M
698             , N
699             , nulls
700             , direction);
701     }
702 
703     //! @}
704 
705     //! \brief Binds null values to the given parameter placeholder number in the prepared statement.
706     //!
707     //! If your prepared SQL query has any ? placeholders, this is how you bind values to them.
708     //! Placeholder numbers count from left to right and are 0-indexed.
709     //!
710     //! It is possible to use this function for bulk operations.
711     //!
712     //! \param param Placeholder position.
713     //! \param elements The number of elements being bound.
714     //! \throws database_error
715     void bind_null(short param, std::size_t elements = 1);
716 
717     //! @}
718 
719 private:
720     typedef std::function<bool (std::size_t)> null_predicate_type;
721 
722 private:
723     class statement_impl;
724     friend class nanodbc::result;
725 
726 private:
727     std::shared_ptr<statement_impl> impl_;
728 };
729 
730 //  .d8888b.                                               888    d8b
731 // d88P  Y88b                                              888    Y8P
732 // 888    888                                              888
733 // 888         .d88b.  88888b.  88888b.   .d88b.   .d8888b 888888 888  .d88b.  88888b.
734 // 888        d88""88b 888 "88b 888 "88b d8P  Y8b d88P"    888    888 d88""88b 888 "88b
735 // 888    888 888  888 888  888 888  888 88888888 888      888    888 888  888 888  888
736 // Y88b  d88P Y88..88P 888  888 888  888 Y8b.     Y88b.    Y88b.  888 Y88..88P 888  888
737 //  "Y8888P"   "Y88P"  888  888 888  888  "Y8888   "Y8888P  "Y888 888  "Y88P"  888  888
738 // MARK: Connection -
739 
740 //! \brief Manages and encapsulates ODBC resources such as the connection and environment handles.
741 class connection
742 {
743 public:
744     //! \brief Create new connection object, initially not connected.
745     connection();
746 
747     //! Copy constructor.
748     connection(const connection& rhs);
749 
750     #ifndef NANODBC_NO_MOVE_CTOR
751         //! Move constructor.
752         connection(connection&& rhs) NANODBC_NOEXCEPT;
753     #endif
754 
755     //! Assignment.
756     connection& operator=(connection rhs);
757 
758     //! Member swap.
759     void swap(connection&) NANODBC_NOEXCEPT;
760 
761     //! \brief Create new connection object and immediately connect to the given data source.
762     //! \param dsn The name of the data source.
763     //! \param user The username for authenticating to the data source.
764     //! \param pass The password for authenticating to the data source.
765     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
766     //! \throws database_error
767     //! \see connected(), connect()
768     connection(
769         const string_type& dsn
770         , const string_type& user
771         , const string_type& pass
772         , long timeout = 0);
773 
774     //! \brief Create new connection object and immediately connect using the given connection string.
775     //! \param connection_string The connection string for establishing a connection.
776     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
777     //! \throws database_error
778     //! \see connected(), connect()
779     connection(const string_type& connection_string, long timeout = 0);
780 
781     //! \brief Automatically disconnects from the database and frees all associated resources.
782     //!
783     //! Will not throw even if disconnecting causes some kind of error and raises an exception.
784     //! If you explicitly need to know if disconnect() succeeds, call it directly.
785     ~connection() NANODBC_NOEXCEPT;
786 
787     //! \brief Connect to the given data source.
788     //! \param dsn The name of the data source.
789     //! \param user The username for authenticating to the data source.
790     //! \param pass The password for authenticating to the data source.
791     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
792     //! \throws database_error
793     //! \see connected()
794     void connect(
795         const string_type& dsn
796         , const string_type& user
797         , const string_type& pass
798         , long timeout = 0);
799 
800     //! \brief Connect using the given connection string.
801     //! \param connection_string The connection string for establishing a connection.
802     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
803     //! \throws database_error
804     //! \see connected()
805     void connect(const string_type& connection_string, long timeout = 0);
806 
807     //! \brief Initiate an asynchronous connection operation to the given data source.
808     //!
809     //! This method will only be available if nanodbc is built against ODBC headers and library that supports asynchronous mode.
810     //! Such that the identifiers `SQL_ATTR_ASYNC_DBC_EVENT` and `SQLCompleteAsync` are extant. Otherwise
811     //! this method will be defined, but not implemented.
812     //!
813     //! \param dsn The name of the data source.
814     //! \param user The username for authenticating to the data source.
815     //! \param pass The password for authenticating to the data source.
816     //! \param event_handle The event handle for which the caller will wait before calling async_complete.
817     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
818     //! \throws database_error
819     //! \see connected()
820     void async_connect(
821         const string_type& dsn
822         , const string_type& user
823         , const string_type& pass
824         , void* event_handle
825         , long timeout = 0);
826 
827     //! \brief Initiate an asynchronous connection operation using the given connection string.
828     //!
829     //! This method will only be available if nanodbc is built against ODBC headers and library that supports asynchronous mode.
830     //! Such that the identifiers `SQL_ATTR_ASYNC_DBC_EVENT` and `SQLCompleteAsync` are extant. Otherwise
831     //! this method will be defined, but not implemented.
832     //!
833     //! \param connection_string The connection string for establishing a connection.
834     //! \param event_handle The event handle for which the caller will wait before calling async_complete.
835     //! \param timeout The number in seconds before connection timeout. Default is 0 indicating no timeout.
836     //! \throws database_error
837     //! \see connected()
838     void async_connect(const string_type& connection_string, void* event_handle, long timeout = 0);
839 
840     //! \brief Completes a previously initiated asynchronous connection operation.
841     void async_complete();
842 
843     //! \brief Returns true if connected to the database.
844     bool connected() const;
845 
846     //! \brief Disconnects from the database, but maintains environment and handle resources.
847     void disconnect();
848 
849     //! \brief Returns the number of transactions currently held for this connection.
850     std::size_t transactions() const;
851 
852     //! \brief Returns the native ODBC database connection handle.
853     void* native_dbc_handle() const;
854 
855     //! \brief Returns the native ODBC environment handle.
856     void* native_env_handle() const;
857 
858     //! \brief Returns name of the DBMS product.
859     //! Returns the ODBC information type SQL_DBMS_NAME of the DBMS product
860     //! accesssed by the driver via the current connection.
861     string_type dbms_name() const;
862 
863     //! \brief Returns version of the DBMS product.
864     //! Returns the ODBC information type SQL_DBMS_VER of the DBMS product
865     //! accesssed by the driver via the current connection.
866     string_type dbms_version() const;
867 
868     //! \brief Returns the name of the ODBC driver.
869     //! \throws database_error
870     string_type driver_name() const;
871 
872     //! \brief Returns the name of the currently connected database.
873     //! Returns the current SQL_DATABASE_NAME information value associated with the connection.
874     string_type database_name() const;
875 
876     //! \brief Returns the name of the current catalog.
877     //! Returns the current setting of the connection attribute SQL_ATTR_CURRENT_CATALOG.
878     string_type catalog_name() const;
879 
880 private:
881     std::size_t ref_transaction();
882     std::size_t unref_transaction();
883     bool rollback() const;
884     void rollback(bool onoff);
885 
886 private:
887     class connection_impl;
888     friend class nanodbc::transaction::transaction_impl;
889 
890 private:
891     std::shared_ptr<connection_impl> impl_;
892 };
893 
894 // 8888888b.                            888 888
895 // 888   Y88b                           888 888
896 // 888    888                           888 888
897 // 888   d88P .d88b.  .d8888b  888  888 888 888888
898 // 8888888P" d8P  Y8b 88K      888  888 888 888
899 // 888 T88b  88888888 "Y8888b. 888  888 888 888
900 // 888  T88b Y8b.          X88 Y88b 888 888 Y88b.
901 // 888   T88b "Y8888   88888P'  "Y88888 888  "Y888
902 // MARK: Result -
903 
904 class catalog;
905 
906 //! \brief A resource for managing result sets from statement execution.
907 //!
908 //! \see statement::execute(), statement::execute_direct()
909 //! \note result objects may be copied, however all copies will refer to the same underlying ODBC result set.
910 class result
911 {
912 public:
913     //! Empty result set.
914     result();
915 
916     //! Free result set.
917     ~result() NANODBC_NOEXCEPT;
918 
919     //! Copy constructor.
920     result(const result& rhs);
921 
922     #ifndef NANODBC_NO_MOVE_CTOR
923         //! Move constructor.
924         result(result&& rhs) NANODBC_NOEXCEPT;
925     #endif
926 
927     //! Assignment.
928     result& operator=(result rhs);
929 
930     //! Member swap.
931     void swap(result& rhs) NANODBC_NOEXCEPT;
932 
933     //! \brief Returns the native ODBC statement handle.
934     void* native_statement_handle() const;
935 
936     //! \brief The rowset size for this result set.
937     long rowset_size() const NANODBC_NOEXCEPT;
938 
939     //! \brief Returns the number of rows affected by the request or -1 if the number of affected rows is not available.
940     //! \throws database_error
941     long affected_rows() const;
942 
943     //! \brief Returns the number of rows in the current rowset or 0 if the number of rows is not available.
944     long rows() const NANODBC_NOEXCEPT;
945 
946     //! \brief Returns the number of columns in a result set.
947     //! \throws database_error
948     short columns() const;
949 
950     //! \brief Fetches the first row in the current result set.
951     //! \return true if there are more results or false otherwise.
952     //! \throws database_error
953     bool first();
954 
955     //! \brief Fetches the last row in the current result set.
956     //! \return true if there are more results or false otherwise.
957     //! \throws database_error
958     bool last();
959 
960     //! \brief Fetches the next row in the current result set.
961     //! \return true if there are more results or false otherwise.
962     //! \throws database_error
963     bool next();
964 
965     //! \brief Fetches the prior row in the current result set.
966     //! \return true if there are more results or false otherwise.
967     //! \throws database_error
968     bool prior();
969 
970     //! \brief Moves to and fetches the specified row in the current result set.
971     //! \return true if there are results or false otherwise.
972     //! \throws database_error
973     bool move(long row);
974 
975     //! \brief Skips a number of rows and then fetches the resulting row in the current result set.
976     //! \return true if there are results or false otherwise.
977     //! \throws database_error
978     bool skip(long rows);
979 
980     //! \brief Returns the row position in the current result set.
981     unsigned long position() const;
982 
983     //! \brief Returns true if there are no more results in the current result set.
984     bool end() const NANODBC_NOEXCEPT;
985 
986     //! \brief Gets data from the given column of the current rowset.
987     //!
988     //! Columns are numbered from left to right and 0-indexed.
989     //! \param column position.
990     //! \param result The column's value will be written to this parameter.
991     //! \throws database_error, index_range_error, type_incompatible_error, null_access_error
992     template<class T>
993     void get_ref(short column, T& result) const;
994 
995     //! \brief Gets data from the given column of the current rowset.
996     //! If the data is null, fallback is returned instead.
997     //!
998     //! Columns are numbered from left to right and 0-indexed.
999     //! \param column position.
1000     //! \param fallback if value is null, return fallback instead.
1001     //! \param result The column's value will be written to this parameter.
1002     //! \throws database_error, index_range_error, type_incompatible_error
1003     template<class T>
1004     void get_ref(short column, const T& fallback, T& result) const;
1005 
1006     //! \brief Gets data from the given column by name of the current rowset.
1007     //!
1008     //! \param column_name column's name.
1009     //! \param result The column's value will be written to this parameter.
1010     //! \throws database_error, index_range_error, type_incompatible_error, null_access_error
1011     template<class T>
1012     void get_ref(const string_type& column_name, T& result) const;
1013 
1014     //! \brief Gets data from the given column by name of the current rowset.
1015     //! If the data is null, fallback is returned instead.
1016     //!
1017     //! \param column_name column's name.
1018     //! \param fallback if value is null, return fallback instead.
1019     //! \param result The column's value will be written to this parameter.
1020     //! \throws database_error, index_range_error, type_incompatible_error
1021     template<class T>
1022     void get_ref(const string_type& column_name, const T& fallback, T& result) const;
1023 
1024     //! \brief Gets data from the given column of the current rowset.
1025     //!
1026     //! Columns are numbered from left to right and 0-indexed.
1027     //! \param column position.
1028     //! \throws database_error, index_range_error, type_incompatible_error, null_access_error
1029     template<class T>
1030     T get(short column) const;
1031 
1032     //! \brief Gets data from the given column of the current rowset.
1033     //! If the data is null, fallback is returned instead.
1034     //!
1035     //! Columns are numbered from left to right and 0-indexed.
1036     //! \param column position.
1037     //! \param fallback if value is null, return fallback instead.
1038     //! \throws database_error, index_range_error, type_incompatible_error
1039     template<class T>
1040     T get(short column, const T& fallback) const;
1041 
1042     //! \brief Gets data from the given column by name of the current rowset.
1043     //!
1044     //! \param column_name column's name.
1045     //! \throws database_error, index_range_error, type_incompatible_error, null_access_error
1046     template<class T>
1047     T get(const string_type& column_name) const;
1048 
1049     //! \brief Gets data from the given column by name of the current rowset.
1050     //! If the data is null, fallback is returned instead.
1051     //!
1052     //! \param column_name column's name.
1053     //! \param fallback if value is null, return fallback instead.
1054     //! \throws database_error, index_range_error, type_incompatible_error
1055     template<class T>
1056     T get(const string_type& column_name, const T& fallback) const;
1057 
1058     //! \brief Returns true if and only if the given column of the current rowset is null.
1059     //!
1060     //! There is a bug/limitation in ODBC drivers for SQL Server (and possibly others)
1061     //! which causes SQLBindCol() to never write SQL_NOT_NULL to the length/indicator
1062     //! buffer unless you also bind the data column. Nanodbc's is_null() will return
1063     //! correct values for (n)varchar(max) columns when you ensure that SQLGetData()
1064     //! has been called for that column (i.e. after get() or get_ref() is called).
1065     //!
1066     //! Columns are numbered from left to right and 0-indexed.
1067     //! \see get(), get_ref()
1068     //! \param column position.
1069     //! \throws database_error, index_range_error
1070     bool is_null(short column) const;
1071 
1072     //! \brief Returns true if and only if the given column by name of the current rowset is null.
1073     //!
1074     //! See is_null(short column) for details on a bug/limitation of some ODBC drivers.
1075     //! \see is_null()
1076     //! \param column_name column's name.
1077     //! \throws database_error, index_range_error
1078     bool is_null(const string_type& column_name) const;
1079 
1080     //! \brief Returns the name of the specified column.
1081     //!
1082     //! Columns are numbered from left to right and 0-indexed.
1083     //! \param column position.
1084     //! \throws index_range_error
1085     string_type column_name(short column) const;
1086 
1087     //! \brief Returns the size of the specified column.
1088     //!
1089     //! Columns are numbered from left to right and 0-indexed.
1090     //! \param column position.
1091     //! \throws index_range_error
1092     long column_size(short column) const;
1093 
1094     //! \brief Returns the column number of the specified column name.
1095     //!
1096     //! Columns are numbered from left to right and 0-indexed.
1097     //! \param column_name column's name.
1098     //! \throws index_range_error
1099     short column(const string_type& column_name) const;
1100 
1101     //! Returns a identifying integer value representing the SQL type of this column.
1102     int column_datatype(short column) const;
1103 
1104     //! Returns a identifying integer value representing the SQL type of this column by name.
1105     int column_datatype(const string_type& column_name) const;
1106 
1107     //! Returns a identifying integer value representing the C type of this column.
1108     int column_c_datatype(short column) const;
1109 
1110     //! Returns a identifying integer value representing the C type of this column by name.
1111     int column_c_datatype(const string_type& column_name) const;
1112 
1113     //! Returns the next result, for example when stored procedure returns multiple result sets.
1114     bool next_result();
1115 
1116     //! If and only if result object is valid, returns true.
1117     explicit operator bool() const;
1118 
1119 private:
1120     result(statement statement, long rowset_size);
1121 
1122 private:
1123     class result_impl;
1124     friend class nanodbc::statement::statement_impl;
1125     friend class nanodbc::catalog;
1126 
1127 private:
1128     std::shared_ptr<result_impl> impl_;
1129 };
1130 
1131 
1132 //
1133 //  .d8888b.           888             888
1134 // d88P  Y88b          888             888
1135 // 888    888          888             888
1136 // 888         8888b.  888888  8888b.  888  .d88b.   .d88b.
1137 // 888            "88b 888        "88b 888 d88""88b d88P"88b
1138 // 888    888 .d888888 888    .d888888 888 888  888 888  888
1139 // Y88b  d88P 888  888 Y88b.  888  888 888 Y88..88P Y88b 888
1140 //  "Y8888P"  "Y888888  "Y888 "Y888888 888  "Y88P"   "Y88888
1141 //                                                      888
1142 //                                                 Y8b d88P
1143 //                                                  "Y88P"
1144 // MARK: Catalog -
1145 
1146 class catalog
1147 {
1148 public:
1149 
1150     class tables
1151     {
1152     public:
1153         bool next();
1154         string_type table_catalog() const;
1155         string_type table_schema() const;
1156         string_type table_name() const;
1157         string_type table_type() const;
1158         string_type table_remarks() const;
1159 
1160     private:
1161         friend class nanodbc::catalog;
1162         tables(result& find_result);
1163         result result_;
1164     };
1165 
1166     class columns
1167     {
1168     public:
1169 
1170         //! \brief
1171         bool next();
1172 
1173         //! \brief
1174         string_type table_catalog() const;
1175 
1176         //! \brief
1177         string_type table_schema() const;
1178 
1179         //! \brief
1180         string_type table_name() const;
1181 
1182         //! \brief
1183         string_type column_name() const;
1184 
1185         //! \brief
1186         short data_type() const;
1187 
1188         //! \brief
1189         string_type type_name() const;
1190 
1191         //! \brief
1192         long column_size() const;
1193 
1194         //! \brief
1195         long buffer_length() const;
1196 
1197         //! \brief
1198         short decimal_digits() const;
1199 
1200         //! \brief
1201         short numeric_precision_radix() const;
1202 
1203         //! \brief
1204         short nullable() const;
1205 
1206         //! \brief
1207         string_type remarks() const;
1208 
1209         //! \brief
1210         string_type column_default() const;
1211 
1212         //! \brief
1213         short sql_data_type() const;
1214 
1215         //! \brief
1216         short sql_datetime_subtype() const;
1217 
1218         //! \brief
1219         long char_octed_length() const;
1220 
1221         //! \brief Ordinal position of the column in the table.
1222         //! The first column in the table is number 1.
1223         //! Returns ORDINAL_POSITION column value in result set returned by SQLColumns.
1224         long ordinal_position() const;
1225 
1226         string_type is_nullable() const;
1227 
1228     private:
1229         friend class nanodbc::catalog;
1230         columns(result& find_result);
1231         result result_;
1232     };
1233 
1234     class primary_keys
1235     {
1236     public:
1237         bool next();
1238         string_type table_catalog() const;
1239         string_type table_schema() const;
1240         string_type table_name() const;
1241         string_type column_name() const;
1242 
1243         //! \brief Column sequence number in the key (starting with 1).
1244         //! Returns valye of KEY_SEQ column in result set returned by SQLPrimaryKeys.
1245         short column_number() const;
1246 
1247         //! \brief Primary key name.
1248         //! NULL if not applicable to the data source.
1249         //! Returns valye of PK_NAME column in result set returned by SQLPrimaryKeys.
1250         string_type primary_key_name() const;
1251 
1252     private:
1253         friend class nanodbc::catalog;
1254         primary_keys(result& find_result);
1255         result result_;
1256     };
1257 
1258     //! \brief Creates catalog operating on database accessible through the specified connection.
1259     catalog(connection& conn);
1260 
1261     //! \brief Creates result set with tables information.
1262     //!
1263     //! Tables information is obtained by executing SQLTable function within
1264     //! scope of the connected database accessible with the specified connection.
1265     //! Since this function is implemented in terms of the SQLTables, it returns
1266     //! result set ordered by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, and TABLE_NAME.
1267     catalog::tables find_tables(
1268         const string_type& table = string_type()
1269       , const string_type& type = string_type()
1270       , const string_type& schema = string_type()
1271       , const string_type& catalog = string_type());
1272 
1273     //! \brief Creates result set with columns information in specified tables.
1274     //!
1275     //! Columns information is obtained by executing SQLColumns function within
1276     //! scope of the connected database accessible with the specified connection.
1277     //! Since this function is implemented in terms of the SQLColumns, it returns
1278     //! result set ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and ORDINAL_POSITION.
1279     catalog::columns find_columns(
1280         const string_type& column = string_type()
1281       , const string_type& table = string_type()
1282       , const string_type& schema = string_type()
1283       , const string_type& catalog = string_type());
1284 
1285     //! \brief Creates result set with primary key information.
1286     //!
1287     //! Returns result set with column names that make up the primary key for a table.
1288     //! The primary key information is obtained by executing SQLPrimaryKey function within
1289     //! scope of the connected database accessible with the specified connection.
1290     catalog::primary_keys find_primary_keys(
1291         const string_type& table
1292       , const string_type& schema = string_type()
1293       , const string_type& catalog = string_type());
1294 
1295 private:
1296     connection conn_;
1297 };
1298 
1299 //! @}
1300 
1301 // 8888888888                            8888888888                         888    d8b
1302 // 888                                   888                                888    Y8P
1303 // 888                                   888                                888
1304 // 8888888 888d888 .d88b.   .d88b.       8888888 888  888 88888b.   .d8888b 888888 888  .d88b.  88888b.  .d8888b
1305 // 888     888P"  d8P  Y8b d8P  Y8b      888     888  888 888 "88b d88P"    888    888 d88""88b 888 "88b 88K
1306 // 888     888    88888888 88888888      888     888  888 888  888 888      888    888 888  888 888  888 "Y8888b.
1307 // 888     888    Y8b.     Y8b.          888     Y88b 888 888  888 Y88b.    Y88b.  888 Y88..88P 888  888      X88
1308 // 888     888     "Y8888   "Y8888       888      "Y88888 888  888  "Y8888P  "Y888 888  "Y88P"  888  888  88888P'
1309 // MARK: Free Functions -
1310 
1311 //! \addtogroup mainf Free Functions
1312 //! \brief Convenience functions.
1313 //!
1314 //! @{
1315 
1316 //! \brief Immediately opens, prepares, and executes the given query directly on the given connection.
1317 //! \param conn The connection where the statement will be executed.
1318 //! \param query The SQL query that will be executed.
1319 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1320 //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
1321 //! \return A result set object.
1322 //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
1323 //! \see open(), prepare(), execute(), result, transaction
1324 result execute(
1325     connection& conn
1326     , const string_type& query
1327     , long batch_operations = 1
1328     , long timeout = 0);
1329 
1330 //! \brief Immediately opens, prepares, and executes the given query directly on the given connection without creating result object.
1331 //! \param conn The connection where the statement will be executed.
1332 //! \param query The SQL query that will be executed.
1333 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1334 //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
1335 //! \return A result set object.
1336 //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
1337 //! \see open(), prepare(), execute(), result, transaction
1338 void just_execute(
1339     connection& conn
1340     , const string_type& query
1341     , long batch_operations = 1
1342     , long timeout = 0);
1343 
1344 //! \brief Execute the previously prepared query now.
1345 //! \param stmt The prepared statement that will be executed.
1346 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1347 //! \throws database_error
1348 //! \return A result set object.
1349 //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
1350 //! \see open(), prepare(), execute(), result
1351 result execute(statement& stmt, long batch_operations = 1);
1352 
1353 //! \brief Execute the previously prepared query now and without creating result object.
1354 //! \param stmt The prepared statement that will be executed.
1355 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1356 //! \throws database_error
1357 //! \return A result set object.
1358 //! \attention You will want to use transactions if you are doing batch operations because it will prevent auto commits from occurring after each individual operation is executed.
1359 //! \see open(), prepare(), execute(), result
1360 void just_execute(statement& stmt, long batch_operations = 1);
1361 
1362 //! \brief Execute the previously prepared query now.
1363 //! Executes within the context of a transaction object and commits the transaction directly after execution.
1364 //! \param stmt The prepared statement that will be executed in batch.
1365 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1366 //! \throws database_error
1367 //! \return A result set object.
1368 //! \see open(), prepare(), execute(), result, transaction
1369 result transact(statement& stmt, long batch_operations);
1370 
1371 //! \brief Execute the previously prepared query now and without creating result object.
1372 //! Executes within the context of a transaction object and commits the transaction directly after execution.
1373 //! \param stmt The prepared statement that will be executed in batch.
1374 //! \param batch_operations Numbers of rows to fetch per rowset, or the number of batch parameters to process.
1375 //! \throws database_error
1376 //! \return A result set object.
1377 //! \see open(), prepare(), execute(), result, transaction
1378 void just_transact(statement& stmt, long batch_operations);
1379 
1380 //! \brief Prepares the given statement to execute on it associated connection.
1381 //! If the statement is not open throws programming_error.
1382 //! \param stmt The prepared statement that will be executed in batch.
1383 //! \param query The SQL query that will be executed.
1384 //! \param timeout The number in seconds before query timeout. Default is 0 indicating no timeout.
1385 //! \see open()
1386 //! \throws database_error, programming_error
1387 void prepare(statement& stmt, const string_type& query, long timeout = 0);
1388 
1389 //! @}
1390 
1391 } // namespace nanodbc
1392 
1393 #endif // NANODBC_H
1394 
1395 #endif // _ODBC
1396 
1397 #endif // DOXYGEN_SHOULD_SKIP_THIS
1398