Date: Thursday, January 19, 2006 @ 15:37:21
Author: zsolt
Path: /cvsroot/carob/libmysequoia/src
Modified: CarobMySQL.cpp (1.31 -> 1.32) MySQLAPI.cpp (1.28 -> 1.29)
Utils.cpp (1.25 -> 1.26)
modified that when fetching as a string from carob when the data is date, time
and timestamp to use our internal converters, because they are not currently
exist in carob or they are buggy.
removed convertTime function, is no longer needed
----------------+
CarobMySQL.cpp | 53 ++++++++++++++++++++++++++++++---
MySQLAPI.cpp | 2 +
Utils.cpp | 86 +++++++++++++++++--------------------------------------
3 files changed, 77 insertions(+), 64 deletions(-)
Index: libmysequoia/src/CarobMySQL.cpp
diff -u libmysequoia/src/CarobMySQL.cpp:1.31
libmysequoia/src/CarobMySQL.cpp:1.32
--- libmysequoia/src/CarobMySQL.cpp:1.31 Thu Jan 12 18:30:46 2006
+++ libmysequoia/src/CarobMySQL.cpp Thu Jan 19 15:37:21 2006
@@ -675,18 +675,58 @@
row = new PCHAR[field_count+1];
memset(row, 0, sizeof(PCHAR)*(field_count+1));
- std::string result;
+ std::string result, tmp;
+ MYSQL_FIELD *fPtr = fields;
+ int64_t lData;
+ unsigned long field_len;
+
+ /* TODO maybe we can change it, after carob implemented
+ * date/time conversion functions correctly */
+ //Set up a conversion buffer for time, date, datetime conversion
+ char buffer[20];
+ MYSQL_BIND b;
+ memset(&b, 0, sizeof(b));
+ b.buffer = &buffer;
+ b.buffer_length = sizeof(buffer);
+ b.is_null = &b.is_null_value;
+ b.error = &b.error_value;
+ b.length = &b.length_value;
+ b.buffer_type = MYSQL_TYPE_STRING;
- for (unsigned i=0; i<field_count; i++)
+ for (unsigned i=0; i<field_count; i++, fPtr++)
{
try
{
- std::wstring s = drsPtr->getAsString(i+1);
- unsigned long field_len = s.length();
-
row[i] = (char *)(unsigned long)(result.size()+1);
- result += toString(s);
+ switch (fPtr->type)
+ {
+ case MYSQL_TYPE_TIME:
+ lData = drsPtr->getAsInt(i+1);
+ getFromTime(&b,fPtr,&lData);
+ result += buffer;
+ field_len = b.length_value;
+ break;
+ case MYSQL_TYPE_DATE:
+ lData = drsPtr->getAsInt64(i+1);
+ getFromDate(&b,fPtr,&lData);
+ result += buffer;
+ field_len = b.length_value;
+ break;
+ case MYSQL_TYPE_DATETIME:
+ //TODO when Carob implements Timestamp, change this
+ //lData = drsPtr->getAsInt64(i+1);
+ lData = 0;
+ getFromTime(&b,fPtr,&lData);
+ result += buffer;
+ field_len = b.length_value;
+ break;
+ default:
+ tmp = toString(drsPtr->getAsString(i+1));
+ field_len = tmp.length();
+ result += tmp;
+ }
+
result.push_back(0);
lengths[i] = field_len;
@@ -695,6 +735,7 @@
}
catch (NullValueException &e)
{
+ row[i] = 0;
}
}
Index: libmysequoia/src/MySQLAPI.cpp
diff -u libmysequoia/src/MySQLAPI.cpp:1.28 libmysequoia/src/MySQLAPI.cpp:1.29
--- libmysequoia/src/MySQLAPI.cpp:1.28 Tue Jan 17 09:38:38 2006
+++ libmysequoia/src/MySQLAPI.cpp Thu Jan 19 15:37:21 2006
@@ -135,6 +135,8 @@
// TODO make it thread safe
library_initialized = true;
+
+ tzset();
LOG4CXX_DEBUG(logger, "Leaving mysql_server_init.");
Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.25 libmysequoia/src/Utils.cpp:1.26
--- libmysequoia/src/Utils.cpp:1.25 Thu Jan 19 11:34:47 2006
+++ libmysequoia/src/Utils.cpp Thu Jan 19 15:37:21 2006
@@ -260,36 +260,12 @@
/**
* Convert to MYSQL datetime structure
*/
-void convertTime(void *data, MYSQL_TIME *mt, enum enum_mysql_timestamp_type
type)
-{
- int time = *(int *)data;
-
- memset(mt, 0, sizeof(MYSQL_TIME));
- mt->time_type = type;
-
- mt->second_part = (time % 1000) * 1000; time = time / 1000;
- mt->second = time % 60; time = time / 60;
- mt->minute = time % 60; time = time / 60;
- mt->hour = time;
-
- if (type != MYSQL_TIMESTAMP_TIME)
- {
- mt->day = mt->hour / 24;
- mt->hour = mt->hour % 24;
- }
-
- if (type == MYSQL_TIMESTAMP_DATE)
- {
- mt->hour = mt->minute = mt->second = mt->second_part = 0;
- }
-}
-
void convertDateTime(void *data, MYSQL_TIME *mt, enum
enum_mysql_timestamp_type type, bool is_nano)
{
int64_t date = *(int64_t *)data/1000;
tm tm;
- tm = *(localtime((time_t *)&date));
+ localtime_r((time_t *)&date, &tm);
memset(mt, 0, sizeof(MYSQL_TIME));
mt->time_type = type;
@@ -309,7 +285,7 @@
mt->second_part = micro;
if (type == MYSQL_TIMESTAMP_TIME)
- mt->hour += tm.tm_mday * 24;
+ mt->hour += (tm.tm_mday-1) * 24;
}
}
@@ -325,7 +301,7 @@
void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
- int time = *(char *)data;
+ int64_t time = *(char *)data;
*bind->error = 0;
@@ -369,18 +345,16 @@
break;
case MYSQL_TYPE_TIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME,
false);
break;
case MYSQL_TYPE_DATE:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE);
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE,
false);
*bind->error = true;
break;
case MYSQL_TYPE_DATETIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATETIME);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
break;
default:
@@ -392,7 +366,7 @@
void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
- int time = *(short int *)data;
+ int64_t time = *(short int *)data;
*bind->error = 0;
@@ -437,18 +411,15 @@
break;
case MYSQL_TYPE_TIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME,
false);
break;
case MYSQL_TYPE_DATE:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE,
false);
break;
case MYSQL_TYPE_DATETIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATETIME);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
break;
default:
@@ -460,7 +431,7 @@
void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
- int time = *(int *)data;
+ int64_t time = *(int *)data;
*bind->error = 0;
@@ -506,17 +477,16 @@
break;
case MYSQL_TYPE_TIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME);
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME,
false);
break;
case MYSQL_TYPE_DATE:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE);
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE,
false);
*bind->error = true;
break;
case MYSQL_TYPE_DATETIME:
- convertTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATETIME);
- *bind->error = true;
+ convertDateTime(&time, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
break;
default:
@@ -528,7 +498,6 @@
void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
- int datetime = *(int64_t *)data;
*bind->error = 0;
@@ -577,16 +546,16 @@
break;
case MYSQL_TYPE_TIME:
- convertDateTime(&datetime, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_TIME, false);
+ convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME,
false);
*bind->error = true;
break;
case MYSQL_TYPE_DATE:
- convertDateTime(&datetime, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATE, false);
+ convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE,
false);
break;
case MYSQL_TYPE_DATETIME:
- convertDateTime(&datetime, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
+ convertDateTime(data, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
break;
default:
@@ -599,7 +568,7 @@
{
float f = *(float *)data;
float ff = f < 0 ? -floorf(-f) : floorf(f);
- int datetime = (int64_t)ff;
+ int64_t datetime = (int64_t)ff;
*bind->error = 0;
@@ -669,7 +638,7 @@
{
double d = *(double *)data;
double df = d < 0 ? -floor(-d) : floorf(d);
- int datetime = (int64_t)df;
+ int64_t datetime = (int64_t)df;
*bind->error = 0;
@@ -840,6 +809,7 @@
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
MYSQL_TIME time;
+ int64_t date = *(int *)data;
*bind->error = 0;
@@ -867,11 +837,11 @@
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_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_TINY_BLOB:
@@ -880,22 +850,22 @@
case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING:
- convertTime(data, &time, MYSQL_TIMESTAMP_TIME);
+ convertDateTime(&date, &time, MYSQL_TIMESTAMP_TIME, false);
*bind->error = MYSQL_TIME_to_str(&time, (char *)bind->buffer,
bind->buffer_length);
*bind->length = strlen((char *)bind->buffer);
break;
case MYSQL_TYPE_TIME:
- convertTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME);
+ convertDateTime(&date, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME,
false);
break;
case MYSQL_TYPE_DATE:
- convertTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE);
+ convertDateTime(&date, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE,
false);
*bind->error = true;
break;
case MYSQL_TYPE_DATETIME:
- convertTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATETIME);
+ convertDateTime(&date, (MYSQL_TIME *)bind->buffer,
MYSQL_TIMESTAMP_DATETIME, false);
break;
default:
@@ -942,7 +912,7 @@
// TODO check overflow
*(double *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t
*)data;
break;
-
+
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_TINY_BLOB:
@@ -1022,7 +992,7 @@
case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING:
- convertDateTime(data, &datetime, MYSQL_TIMESTAMP_DATE, true);
+ convertDateTime(data, &datetime, MYSQL_TIMESTAMP_DATETIME, true);
*bind->error = MYSQL_TIME_to_str(&datetime, (char *)bind->buffer,
bind->buffer_length);
*bind->length = strlen((char *)bind->buffer);
break;
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits