summaryrefslogtreecommitdiff
path: root/libodb-oracle/odb/oracle/oracle-types.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libodb-oracle/odb/oracle/oracle-types.hxx')
-rw-r--r--libodb-oracle/odb/oracle/oracle-types.hxx300
1 files changed, 300 insertions, 0 deletions
diff --git a/libodb-oracle/odb/oracle/oracle-types.hxx b/libodb-oracle/odb/oracle/oracle-types.hxx
new file mode 100644
index 0000000..a9553b2
--- /dev/null
+++ b/libodb-oracle/odb/oracle/oracle-types.hxx
@@ -0,0 +1,300 @@
+// file : odb/oracle/oracle-types.hxx
+// license : ODB NCUEL; see accompanying LICENSE file
+
+#ifndef ODB_ORACLE_ORACLE_TYPES_HXX
+#define ODB_ORACLE_ORACLE_TYPES_HXX
+
+#include <odb/pre.hxx>
+
+#include <odb/details/buffer.hxx>
+
+#include <odb/oracle/version.hxx>
+#include <odb/oracle/forward.hxx> // binding
+#include <odb/oracle/oracle-fwd.hxx>
+
+#include <odb/oracle/details/export.hxx>
+
+namespace odb
+{
+ namespace oracle
+ {
+ enum chunk_position
+ {
+ chunk_one,
+ chunk_first,
+ chunk_next,
+ chunk_last
+ };
+
+ // Callback function signature used to specify LOB parameters that are
+ // passed to the database. If false is returned from the callback,
+ // statement execution is aborted.
+ //
+ typedef bool (*param_callback_type) (
+ const void* context, // [in] The user context.
+ ub4* position_context, // [in] A position context. A callback is free to
+ // use this to track position information. This is
+ // initialized to zero before the callback is
+ // invoked for the first time.
+ const void** buffer, // [out] On return, a pointer to a buffer
+ // containing parameter data.
+ ub4* size, // [out] The parameter data size in bytes.
+ chunk_position*, // [out] The position of the chunk of data in
+ // buffer.
+ void* temp_buffer, // [in] A temporary buffer that may be used if
+ // required. The buffer argument should specify
+ // this buffer on return if it is used.
+ ub4 capacity); // [in] The temporary buffer size in bytes.
+
+ // Callback function signature used to specify LOB values returned from
+ // the database. If false is returned, database_exception is thrown.
+ //
+ typedef bool (*result_callback_type) (
+ void* context, // [in] The user context.
+ ub4* position_context, // [in] A position context. A callback is free to
+ // use this to track position information. This is
+ // initialized to zero before the callback is
+ // invoked for the first time.
+ void* buffer, // [in] A buffer containing the result data.
+ ub4 size, // [in] The result data size in bytes.
+ chunk_position); // [in] The position of this chunk.
+
+ struct lob_callback
+ {
+ union
+ {
+ param_callback_type param;
+ result_callback_type result;
+ } callback;
+
+ union
+ {
+ const void* param;
+ void* result;
+ } context;
+ };
+
+ struct bind
+ {
+ // This enumeration identifies the possible buffer types that can be
+ // bound to a bind instance. In most cases, these map directly to
+ // SQLT_XXX codes, identifying an external OCI type. nstring and nclob
+ // however have no equivalent OCI typecode. These additional identifiers
+ // allow for a consistent interface across all types. Note that these
+ // values are mapped to their corresponding external OCI typecodes (if
+ // any) using their integer values, and should therefore not be
+ // rearranged or explicitly assigned without also adjusting the
+ // sqlt_lookup array in odb/oracle/statement.cxx.
+ //
+ enum buffer_type
+ {
+ integer, // Buffer is an integer type of size specified by size.
+ uinteger, // Buffer is an unsigned integer of size specified by
+ // size.
+ binary_float, // Buffer is a float.
+ binary_double, // Buffer is a double.
+ number, // Buffer is a variable length char array.
+ date, // Buffer is a 7-byte char array.
+ timestamp, // Buffer is a datetime.
+ interval_ym, // Buffer is an interval_ym.
+ interval_ds, // Buffer is an interval_ds.
+ string, // Buffer is a variable length char array.
+ nstring, // Buffer is a variable length char array.
+ raw, // Buffer is a variable length char array.
+ blob, // Bind is a callback.
+ clob, // Bind is a callback.
+ nclob, // Bind is a callback.
+ last // Used as an end of list marker.
+ };
+
+ buffer_type type; // The type stored by buffer.
+ void* buffer; // Data buffer pointer. For LOB type bindings, this is
+ // interpreted as an oracle::lob*.
+ ub2* size; // The number of bytes in buffer.
+ ub4 capacity; // The maximum number of bytes that can be stored in
+ // the buffer. For LOBs, it used to store array skip
+ // size.
+ sb2* indicator; // Pointer to an OCI indicator variable.
+
+ lob_callback* callback;
+ };
+
+ // An instance of this structure specifies the function to invoke and
+ // the context to pass when the object/view image is about to be
+ // modified. This mechanism is used by the query machinery to save the
+ // image between result iteration and dereferencing if something gets
+ // executed between these two operations that would overwrite the
+ // image.
+ //
+ struct change_callback
+ {
+ change_callback (): callback (0), context (0) {};
+
+ void (*callback) (void*);
+ void* context;
+ };
+
+ // The lob structure wraps data required for both parameter and result
+ // LOB type bindings.
+ //
+ struct LIBODB_ORACLE_EXPORT lob
+ {
+ ~lob ();
+ lob (): locator (0), buffer (0), position (0) {}
+
+ lob (const lob&);
+ lob& operator= (const lob&);
+
+ private:
+ void
+ clone (const lob&);
+
+ public:
+ OCIEnv* environment;
+ OCIError* error;
+ OCILobLocator* locator;
+
+ details::buffer* buffer;
+ ub4 position;
+ };
+
+ //
+ // The OCIDateTime and OCIInterval APIs require that an environment and
+ // error handle be passed to any function that manipulates an OCIDateTime
+ // or OCIInterval descriptor. It is however impossible to obtain these
+ // handles at the time a temporal data image is first initialized. The
+ // following structures allow ODB generated code to interact with the OCI
+ // temporal descriptor types indirectly via C++ primitives. The wrapped OCI
+ // descriptor is then set using these primitives at a time when the
+ // required data is available. A symmetric get interface is provided for
+ // consistency.
+ //
+
+ // Descriptor management flags.
+ //
+ const unsigned short descriptor_cache = 0x01;
+ const unsigned short descriptor_free = 0x02;
+
+ struct LIBODB_ORACLE_EXPORT datetime
+ {
+ void
+ get (sb2& year,
+ ub1& month,
+ ub1& day,
+ ub1& hour,
+ ub1& minute,
+ ub1& second,
+ ub4& nanosecond) const;
+
+ void
+ set (sb2 year,
+ ub1 month,
+ ub1 day,
+ ub1 hour,
+ ub1 minute,
+ ub1 second,
+ ub4 nanosecond);
+
+ ~datetime ();
+ datetime (unsigned short f = descriptor_cache | descriptor_free)
+ : descriptor (0), flags (f) {}
+
+ datetime (const datetime&);
+ datetime& operator= (const datetime&);
+
+ // Use the get() and set() functions above unless you know what you
+ // are doing and understand how copying of datetime works.
+ //
+ public:
+ OCIEnv* environment;
+ OCIError* error;
+ OCIDateTime* descriptor;
+
+ unsigned short flags;
+
+ public:
+ sb2 year_;
+ ub1 month_;
+ ub1 day_;
+ ub1 hour_;
+ ub1 minute_;
+ ub1 second_;
+ ub4 nanosecond_;
+ };
+
+ struct LIBODB_ORACLE_EXPORT interval_ym
+ {
+ void
+ get (sb4& year, sb4& month) const;
+
+ void
+ set (sb4 year, sb4 month);
+
+ ~interval_ym ();
+ interval_ym (unsigned short f = descriptor_cache | descriptor_free)
+ : descriptor (0), flags (f) {}
+
+ interval_ym (const interval_ym&);
+ interval_ym& operator= (const interval_ym&);
+
+ // Use the get() and set() functions above unless you know what you
+ // are doing and understand how copying of interval_ym works.
+ //
+ public:
+ OCIEnv* environment;
+ OCIError* error;
+ OCIInterval* descriptor;
+
+ unsigned short flags;
+
+ public:
+ sb4 year_;
+ sb4 month_;
+ };
+
+ struct LIBODB_ORACLE_EXPORT interval_ds
+ {
+ void
+ get (sb4& day,
+ sb4& hour,
+ sb4& minute,
+ sb4& second,
+ sb4& nanosecond) const;
+
+ void
+ set (sb4 day,
+ sb4 hour,
+ sb4 minute,
+ sb4 second,
+ sb4 nanosecond);
+
+ ~interval_ds ();
+ interval_ds (unsigned short f = descriptor_cache | descriptor_free)
+ : descriptor (0), flags (f) {}
+
+ interval_ds (const interval_ds&);
+ interval_ds& operator= (const interval_ds&);
+
+ // Use the get() and set() functions above unless you know what you
+ // are doing and understand how copying of interval_ds works.
+ //
+ public:
+ OCIEnv* environment;
+ OCIError* error;
+ OCIInterval* descriptor;
+
+ unsigned short flags;
+
+ public:
+ sb4 day_;
+ sb4 hour_;
+ sb4 minute_;
+ sb4 second_;
+ sb4 nanosecond_;
+ };
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_ORACLE_ORACLE_TYPES_HXX