Date: Thursday, January 12, 2006 @ 16:21:22
Author: csaba
Path: /cvsroot/carob/libmysequoia
Modified: include/Utils.hpp (1.12 -> 1.13) src/Utils.cpp (1.12 -> 1.13)
Implicit conversion between different mysql data type done.
-------------------+
include/Utils.hpp | 14 +
src/Utils.cpp | 472 ++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 470 insertions(+), 16 deletions(-)
Index: libmysequoia/include/Utils.hpp
diff -u libmysequoia/include/Utils.hpp:1.12 libmysequoia/include/Utils.hpp:1.13
--- libmysequoia/include/Utils.hpp:1.12 Tue Jan 10 12:22:44 2006
+++ libmysequoia/include/Utils.hpp Thu Jan 12 16:21:22 2006
@@ -107,4 +107,18 @@
bool isCarobObject(MYSQL *p);
bool isCarobObject(MYSQL_STMT *p);
+/**
+ * Data conversion functions between different MySQL data types
+ */
+void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+
#endif /* _UTILS_HPP */
Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.12 libmysequoia/src/Utils.cpp:1.13
--- libmysequoia/src/Utils.cpp:1.12 Thu Jan 12 10:14:09 2006
+++ libmysequoia/src/Utils.cpp Thu Jan 12 16:21:22 2006
@@ -30,7 +30,10 @@
#include <errmsg.h>
#include <mysqld_error.h>
+#include <climits>
+
using namespace CarobNS;
+using namespace std;
const char *error_sqlstate[]=
{
@@ -236,63 +239,499 @@
return (p != 0) && (p->mem_root.block_size == MYSEQUOIA_MAGIC);
}
-void getFromDecimal(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
-{
-}
-
void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ if (is_unsigned)
+ *(unsigned char *)bind->buffer = *(unsigned char *)data;
+ else
+ *(char *)bind->buffer = *(char *)data;
+ *bind->error = *bind->error && *(unsigned char *)data > SCHAR_MAX;
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ if (is_unsigned)
+ *(unsigned short int *)bind->buffer = *(unsigned char *)data;
+ else
+ *(short int *)bind->buffer = *(char *)data;
+ break;
+
+ case MYSQL_TYPE_LONG:
+ if (is_unsigned)
+ *(unsigned int *)bind->buffer = *(unsigned char *)data;
+ else
+ *(int *)bind->buffer = *(char *)data;
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ if (is_unsigned)
+ *(unsigned long long int *)bind->buffer = *(unsigned char *)data;
+ else
+ *(long long int *)bind->buffer = *(char *)data;
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = is_unsigned ? *(unsigned char *)data : *(char
*)data;
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = is_unsigned ? *(unsigned char *)data : *(char
*)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ if (is_unsigned)
+ *(unsigned short int *)bind->buffer = *(unsigned short int *)data;
+ else
+ *(short int *)bind->buffer = *(short int *)data;
+ *bind->error = *bind->error && *(unsigned short int *)data > SHRT_MAX;
+ break;
+
+ case MYSQL_TYPE_LONG:
+ if (is_unsigned)
+ *(unsigned int *)bind->buffer = *(unsigned short int *)data;
+ else
+ *(int *)bind->buffer = *(short int *)data;
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ if (is_unsigned)
+ *(unsigned long long int *)bind->buffer = *(unsigned short int *)data;
+ else
+ *(long long int *)bind->buffer = *(short int *)data;
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = is_unsigned ? *(unsigned short int *)data :
*(short int *)data;
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = is_unsigned ? *(unsigned short int *)data :
*(short int *)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ if (is_unsigned)
+ *(unsigned int *)bind->buffer = *(unsigned int *)data;
+ else
+ *(int *)bind->buffer = *(int *)data;
+ *bind->error = *bind->error && *(unsigned int *)data > INT_MAX;
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ if (is_unsigned)
+ *(unsigned long long int *)bind->buffer = *(unsigned int *)data;
+ else
+ *(long long int *)bind->buffer = *(int *)data;
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int
*)data;
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int
*)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
+}
+
+void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
switch (bind->buffer_type)
{
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
case MYSQL_TYPE_LONG:
- *(int *)bind->buffer = *(int *)data;
break;
+
+ case MYSQL_TYPE_LONGLONG:
+ if (is_unsigned)
+ *(unsigned long long int *)bind->buffer = *(unsigned long long int
*)data;
+ else
+ *(long long int *)bind->buffer = *(long long int *)data;
+ *bind->error = *bind->error && *(unsigned long long int *)data >
LONG_MAX;
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = is_unsigned ? *(unsigned long long int *)data :
*(long long int *)data;
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = is_unsigned ? *(unsigned long long int *)data
: *(long long int *)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
default:
break;
- }
+ }
}
void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = *(float *)data;
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = *(float *)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+ *bind->error = bind->is_unsigned != is_unsigned;
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ *(double *)bind->buffer = *(double *)data;
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
-void getFromNull(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ string *s = (string *)data;
+ size_t s_length = s->length();
+ size_t length = min(s_length, (size_t)bind->buffer_length);
+
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ break;
+
+ case MYSQL_TYPE_STRING:
+ memcpy(bind->buffer, s->data(), length);
+ if (length < bind->buffer_length)
+ ((char *)bind->buffer)[length] = '\0';
+ *bind->length = s_length;
+ *bind->error = length < s_length;
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
-void getFromTimestamp(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
-void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ break;
+
+ default:
+ break;
+ }
}
-void getFromInt24(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ switch (bind->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ break;
+
+ case MYSQL_TYPE_SHORT:
+ break;
+
+ case MYSQL_TYPE_LONG:
+ break;
+
+ case MYSQL_TYPE_LONGLONG:
+ break;
+
+ case MYSQL_TYPE_FLOAT:
+ break;
+
+ case MYSQL_TYPE_DOUBLE:
+ break;
+
+ case MYSQL_TYPE_STRING:
+ break;
+
+ case MYSQL_TYPE_TIME:
+ break;
+
+ case MYSQL_TYPE_DATE:
+ break;
+
+ case MYSQL_TYPE_DATETIME:
+ *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+ break;
+
+ default:
+ break;
+ }
}
-void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+/*
+ * TODO Not yet implemented conversion functions!!!
+ *
+void getFromNull(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
}
-void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromTimestamp(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
}
-void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromInt24(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
}
@@ -344,10 +783,11 @@
{
}
-void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromGeometry(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
}
-void getFromGeometry(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDecimal(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
-}
\ No newline at end of file
+}
+*/
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits