summaryrefslogtreecommitdiff
path: root/libodb-oracle/odb/oracle/traits.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libodb-oracle/odb/oracle/traits.cxx')
-rw-r--r--libodb-oracle/odb/oracle/traits.cxx201
1 files changed, 201 insertions, 0 deletions
diff --git a/libodb-oracle/odb/oracle/traits.cxx b/libodb-oracle/odb/oracle/traits.cxx
new file mode 100644
index 0000000..6c7b46e
--- /dev/null
+++ b/libodb-oracle/odb/oracle/traits.cxx
@@ -0,0 +1,201 @@
+// file : odb/oracle/traits.cxx
+// license : ODB NCUEL; see accompanying LICENSE file
+
+#include <odb/oracle/traits.hxx>
+
+using namespace std;
+
+namespace odb
+{
+ namespace oracle
+ {
+ //
+ // c_array_value_traits_base
+ //
+ void c_array_value_traits_base::
+ set_value (char* const& v,
+ const char* b,
+ size_t n,
+ bool is_null,
+ size_t N)
+ {
+ if (!is_null)
+ {
+ n = n < N ? n : N;
+
+ if (n != 0)
+ memcpy (v, b, n);
+ }
+ else
+ n = 0;
+
+ if (n != N) // Append '\0' if there is space.
+ v[n] = '\0';
+ }
+
+ void c_array_value_traits_base::
+ set_image (char* b,
+ size_t c,
+ size_t& n,
+ bool& is_null,
+ const char* v,
+ size_t N)
+ {
+ is_null = false;
+
+ // Figure out the length. We cannot use strlen since it may
+ // not be 0-terminated (strnlen is not standard).
+ //
+ for (n = 0; n != N && v[n] != '\0'; ++n) ;
+
+ if (n > c)
+ n = c;
+
+ if (n != 0)
+ memcpy (b, v, n);
+ }
+
+ //
+ // string_lob_value_traits
+ //
+ bool string_lob_value_traits::
+ result_callback (void* c, ub4*, void* b, ub4 s, chunk_position p)
+ {
+ string& v (*static_cast<string*> (c));
+
+ switch (p)
+ {
+ case chunk_one:
+ case chunk_first:
+ {
+ v.clear ();
+ }
+ // Fall through.
+ case chunk_next:
+ case chunk_last:
+ {
+ v.append (static_cast<char*> (b), s);
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ bool string_lob_value_traits::
+ param_callback (const void* c,
+ ub4*,
+ const void** b,
+ ub4* s,
+ chunk_position* p,
+ void*,
+ ub4)
+ {
+ const string& v (*static_cast<const string*> (c));
+
+ *p = chunk_one;
+ *s = static_cast<ub4> (v.size ());
+ *b = v.c_str ();
+
+ return true;
+ }
+
+ //
+ // default_value_traits<std::vector<char>, id_blob>
+ //
+ // std::vector has to be qualified for Sun CC.
+ //
+ bool default_value_traits<std::vector<char>, id_blob>::
+ result_callback (void* c, ub4*, void* b, ub4 s, chunk_position p)
+ {
+ value_type& v (*static_cast<value_type*> (c));
+
+ switch (p)
+ {
+ case chunk_one:
+ case chunk_first:
+ {
+ v.clear ();
+ }
+ // Fall through.
+ case chunk_next:
+ case chunk_last:
+ {
+ char* cb (static_cast<char*> (b));
+ v.insert (v.end (), cb, cb + s);
+
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ bool default_value_traits<std::vector<char>, id_blob>::
+ param_callback (const void* c,
+ ub4*,
+ const void** b,
+ ub4* s,
+ chunk_position* p,
+ void*,
+ ub4)
+ {
+ const value_type& v (*static_cast<const value_type*> (c));
+
+ *p = chunk_one;
+ *s = static_cast<ub4> (v.size ());
+ *b = v.empty () ? 0 : &v.front ();
+
+ return true;
+ }
+
+ //
+ // default_value_traits<std::vector<unsigned char>, id_blob>
+ //
+ // std::vector has to be qualified for Sun CC.
+ //
+ bool default_value_traits<std::vector<unsigned char>, id_blob>::
+ result_callback (void* c, ub4*, void* b, ub4 s, chunk_position p)
+ {
+ value_type& v (*static_cast<value_type*> (c));
+
+ switch (p)
+ {
+ case chunk_one:
+ case chunk_first:
+ {
+ v.clear ();
+ }
+ // Fall through.
+ case chunk_next:
+ case chunk_last:
+ {
+ unsigned char* cb (static_cast<unsigned char*> (b));
+ v.insert (v.end (), cb, cb + s);
+
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ bool default_value_traits<std::vector<unsigned char>, id_blob>::
+ param_callback (const void* c,
+ ub4*,
+ const void** b,
+ ub4* s,
+ chunk_position* p,
+ void*,
+ ub4)
+ {
+ const value_type& v (*static_cast<const value_type*> (c));
+
+ *p = chunk_one;
+ *s = static_cast<ub4> (v.size ());
+ *b = v.empty () ? 0 : &v.front ();
+
+ return true;
+ }
+ }
+}