Переглянути джерело

Fixed fetching time related fields. Fixes #5.

Requires bcc 0.134+
Brucey 2 роки тому
батько
коміт
d9051a0163
4 змінених файлів з 65 додано та 41 видалено
  1. 4 9
      core.mod/dbtypes.bmx
  2. 11 6
      mariadb.mod/common.bmx
  3. 36 10
      mariadb.mod/glue.c
  4. 14 16
      mariadb.mod/mariadb.bmx

+ 4 - 9
core.mod/dbtypes.bmx

@@ -404,7 +404,7 @@ Type TDBDate Extends TDBDateBase
 	Field _month:Int = 1
 	Field _month:Int = 1
 	Field _day:Int = 1
 	Field _day:Int = 1
 
 
-	Function Set:TDBDate(year:Int, Month:Int, day:Int)
+	Function Set:TDBDate(year:Int, Month:Int, day:Int) { nomangle }
 		Local this:TDBDate = New TDBDate 
 		Local this:TDBDate = New TDBDate 
 		this.setFromParts(year, Month, day)
 		this.setFromParts(year, Month, day)
 		Return this
 		Return this
@@ -516,13 +516,8 @@ Type TDBBlob Extends TDBType
 		_size = s
 		_size = s
 		If copy And _size > 0 Then
 		If copy And _size > 0 Then
 			_owner = True
 			_owner = True
-?bmxng
 			value = MemAlloc(Size_T(_size))
 			value = MemAlloc(Size_T(_size))
 			MemCopy(value, v, Size_T(_size))
 			MemCopy(value, v, Size_T(_size))
-?Not bmxng
-			value = MemAlloc(_size)
-			MemCopy(value, v, _size)
-?
 		Else
 		Else
 			value = v
 			value = v
 		End If
 		End If
@@ -568,7 +563,7 @@ Type TDBDateTime Extends TDBDateBase
 	Field _second:Int
 	Field _second:Int
 	Field value:Long
 	Field value:Long
 
 
-	Function Set:TDBDateTime(year:Int, Month:Int, day:Int, hours:Int, mins:Int, secs:Int)
+	Function Set:TDBDateTime(year:Int, Month:Int, day:Int, hours:Int, mins:Int, secs:Int) { nomangle }
 		Local this:TDBDateTime = New TDBDateTime
 		Local this:TDBDateTime = New TDBDateTime
 		this.setFromParts(year, Month, day, hours, mins, secs)
 		this.setFromParts(year, Month, day, hours, mins, secs)
 		Return this
 		Return this
@@ -670,7 +665,7 @@ Type TDBTime Extends TDBDateBase
 	Field _second:Int
 	Field _second:Int
 	Field value:Long
 	Field value:Long
 
 
-	Function Set:TDBTime(hours:Int, mins:Int, secs:Int)
+	Function Set:TDBTime(hours:Int, mins:Int, secs:Int) { nomangle }
 		Local this:TDBTime = New TDBTime 
 		Local this:TDBTime = New TDBTime 
 		this.setFromParts(hours, mins, secs)
 		this.setFromParts(hours, mins, secs)
 		Return this
 		Return this
@@ -753,7 +748,7 @@ End Type
 
 
 Extern
 Extern
 	Function _calcDateValue(value:Long Ptr, y:Int, m:Int, d:Int, hh:Int, mm:Int, ss:Int)
 	Function _calcDateValue(value:Long Ptr, y:Int, m:Int, d:Int, hh:Int, mm:Int, ss:Int)
-	Function 	_formatDate:String(format:String, y:Int, m:Int, d:Int, hh:Int, mm:Int, ss:Int)
+	Function _formatDate:String(format:String, y:Int, m:Int, d:Int, hh:Int, mm:Int, ss:Int)
 End Extern
 End Extern
 
 
 
 

+ 11 - 6
mariadb.mod/common.bmx

@@ -26,6 +26,7 @@
 SuperStrict
 SuperStrict
 
 
 Import BRL.Blitz
 Import BRL.Blitz
+Import Database.Core
 
 
 ?linux
 ?linux
 Import "-L/usr/lib/mysql"
 Import "-L/usr/lib/mysql"
@@ -108,7 +109,7 @@ Extern
 	Function mysql_stmt_result_metadata:Byte Ptr(stmt:Byte Ptr)
 	Function mysql_stmt_result_metadata:Byte Ptr(stmt:Byte Ptr)
 	
 	
 	Function mysql_num_fields:Int(meta:Byte Ptr)
 	Function mysql_num_fields:Int(meta:Byte Ptr)
-	Function mysql_fetch_lengths:Byte Ptr(result:Byte Ptr)
+	Function mysql_fetch_lengths:ULongInt Ptr(result:Byte Ptr)
 	Function mysql_fetch_field:Byte Ptr(meta:Byte Ptr)
 	Function mysql_fetch_field:Byte Ptr(meta:Byte Ptr)
 	Function mysql_stmt_store_result:Int(stmt:Byte Ptr)
 	Function mysql_stmt_store_result:Int(stmt:Byte Ptr)
 	
 	
@@ -123,12 +124,13 @@ Extern
 	Function bmx_mysql_field_db:Byte Ptr(f:Byte Ptr)
 	Function bmx_mysql_field_db:Byte Ptr(f:Byte Ptr)
 	Function bmx_mysql_field_catalog:Byte Ptr(f:Byte Ptr)
 	Function bmx_mysql_field_catalog:Byte Ptr(f:Byte Ptr)
 	Function bmx_mysql_field_def:Byte Ptr(f:Byte Ptr)
 	Function bmx_mysql_field_def:Byte Ptr(f:Byte Ptr)
-	Function bmx_mysql_field_length:Int(f:Byte Ptr)
-	Function bmx_mysql_field_max_length:Int(f:Byte Ptr)
+	Function bmx_mysql_field_length:ULongInt(f:Byte Ptr)
+	Function bmx_mysql_field_max_length:ULongInt(f:Byte Ptr)
 	Function bmx_mysql_field_flags:Int(f:Byte Ptr)
 	Function bmx_mysql_field_flags:Int(f:Byte Ptr)
 	Function bmx_mysql_field_type:Int(f:Byte Ptr)
 	Function bmx_mysql_field_type:Int(f:Byte Ptr)
 	Function bmx_mysql_field_decimals:Int(f:Byte Ptr)
 	Function bmx_mysql_field_decimals:Int(f:Byte Ptr)
-	
+	Function bmx_mysql_length_for_field:Size_T(f:Byte Ptr)
+
 	Function bmx_mysql_makeBindings:Byte Ptr(size:Int)
 	Function bmx_mysql_makeBindings:Byte Ptr(size:Int)
 	Function bmx_mysql_deleteBindings(bindings:Byte Ptr)
 	Function bmx_mysql_deleteBindings(bindings:Byte Ptr)
 	'Function bmx_mysql_makeBools:Byte Ptr(size:Int)
 	'Function bmx_mysql_makeBools:Byte Ptr(size:Int)
@@ -149,11 +151,11 @@ Extern
 	Function bmx_mysql_deleteVals(vals:Byte Ptr)
 	Function bmx_mysql_deleteVals(vals:Byte Ptr)
 	
 	
 	Function examine_bindings(params:Byte Ptr, size:Int, stmt:Byte Ptr)
 	Function examine_bindings(params:Byte Ptr, size:Int, stmt:Byte Ptr)
-	Function bmx_mysql_getLength:Int(lengths:Byte Ptr, index:Int)
+	'Function bmx_mysql_getLength:Int(lengths:Byte Ptr, index:Int)
 	Function bmx_mysql_rowField_isNull:Int(row:Byte Ptr, index:Int)
 	Function bmx_mysql_rowField_isNull:Int(row:Byte Ptr, index:Int)
 	Function bmx_mysql_rowField_chars:Byte Ptr(row:Byte Ptr, index:Int)
 	Function bmx_mysql_rowField_chars:Byte Ptr(row:Byte Ptr, index:Int)
 	
 	
-	Function bmx_mysql_inbind(params:Byte Ptr, index:Int, _field:Byte Ptr, dataValue:Byte Ptr, dataLength:Int Ptr, isNull:Int Ptr, ty:Int)
+	Function bmx_mysql_inbind(params:Byte Ptr, index:Int, _field:Byte Ptr, dataValue:Byte Ptr, dataLength:ULongInt Ptr, isNull:Int Ptr, ty:Int)
 	Function bmx_mysql_stmt_bind_result:Int(stmt:Byte Ptr, bindings:Byte Ptr)
 	Function bmx_mysql_stmt_bind_result:Int(stmt:Byte Ptr, bindings:Byte Ptr)
 	Function bmx_mysql_stmt_fetch:Int(stmt:Byte Ptr)
 	Function bmx_mysql_stmt_fetch:Int(stmt:Byte Ptr)
 	
 	
@@ -176,6 +178,9 @@ Extern
 	Function bmx_mysql_char_to_long:Long(data:Byte Ptr)
 	Function bmx_mysql_char_to_long:Long(data:Byte Ptr)
 	Function bmx_mysql_char_to_float:Float(data:Byte Ptr)
 	Function bmx_mysql_char_to_float:Float(data:Byte Ptr)
 	Function bmx_mysql_char_to_double:Double(data:Byte Ptr)
 	Function bmx_mysql_char_to_double:Double(data:Byte Ptr)
+	Function bmx_mysql_char_to_datetime:TDBDateTime(data:Byte Ptr)
+	Function bmx_mysql_char_to_date:TDBDate(data:Byte Ptr)
+	Function bmx_mysql_char_to_time:TDBTime(data:Byte Ptr)
 
 
 End Extern
 End Extern
 
 

+ 36 - 10
mariadb.mod/glue.c

@@ -34,6 +34,10 @@
 #include <mysql.h>
 #include <mysql.h>
 #include <stdio.h>
 #include <stdio.h>
 
 
+extern BBObject * database_core_dbtypes_TDBDateTime_Set(int year, int month, int day, int hours, int mins, int secs);
+extern BBObject * database_core_dbtypes_TDBDate_Set(int year, int month, int day);
+extern BBObject * database_core_dbtypes_TDBTime_Set(int hours, int mins, int secs);
+
 BBString * bmx_mysql_field_name(MYSQL_FIELD * field) {
 BBString * bmx_mysql_field_name(MYSQL_FIELD * field) {
 	return bbStringFromUTF8String(field->name);
 	return bbStringFromUTF8String(field->name);
 }
 }
@@ -62,11 +66,11 @@ char * bmx_mysql_field_def(MYSQL_FIELD * field) {
 	return field->def;
 	return field->def;
 }
 }
 
 
-unsigned long bmx_mysql_field_length(MYSQL_FIELD * field) {
+BBULONGINT bmx_mysql_field_length(MYSQL_FIELD * field) {
 	return field->length;
 	return field->length;
 }
 }
 
 
-unsigned long bmx_mysql_field_max_length(MYSQL_FIELD * field) {
+BBULONGINT bmx_mysql_field_max_length(MYSQL_FIELD * field) {
 	return field->max_length;
 	return field->max_length;
 }
 }
 
 
@@ -168,7 +172,7 @@ void bmx_mysql_bind_double(MYSQL_BIND* bindings, int index, double * value, my_b
 	}
 	}
 }
 }
 
 
-void bmx_mysql_bind_long(MYSQL_BIND* bindings, int index, long * value, my_bool * isNull) {
+void bmx_mysql_bind_long(MYSQL_BIND* bindings, int index, BBInt64 * value, my_bool * isNull) {
 
 
 	MYSQL_BIND* bind = &bindings[index];
 	MYSQL_BIND* bind = &bindings[index];
 	bind->is_null = (my_bool*)isNull;
 	bind->is_null = (my_bool*)isNull;
@@ -213,7 +217,7 @@ void bmx_mysql_bind_blob(MYSQL_BIND* bindings, int index, char * value, int size
 	}
 	}
 }
 }
 
 
-void bmx_mysql_bind_date(MYSQL_BIND* bindings, int index, MYSQL_TIME * date, unsigned int year, unsigned int month, unsigned int day, my_bool * isNull) {
+void bmx_mysql_bind_date(MYSQL_BIND* bindings, int index, MYSQL_TIME * date, int year, int month, int day, my_bool * isNull) {
 
 
 	date->year = year;
 	date->year = year;
 	date->month = month;
 	date->month = month;
@@ -231,7 +235,7 @@ void bmx_mysql_bind_date(MYSQL_BIND* bindings, int index, MYSQL_TIME * date, uns
 	}
 	}
 }
 }
 
 
-void bmx_mysql_bind_time(MYSQL_BIND* bindings, int index, MYSQL_TIME * time, unsigned int hour, unsigned int minute, unsigned int second, my_bool * isNull) {
+void bmx_mysql_bind_time(MYSQL_BIND* bindings, int index, MYSQL_TIME * time, int hour, int minute, int second, my_bool * isNull) {
 
 
 	time->hour = hour;
 	time->hour = hour;
 	time->minute = minute;
 	time->minute = minute;
@@ -249,7 +253,7 @@ void bmx_mysql_bind_time(MYSQL_BIND* bindings, int index, MYSQL_TIME * time, uns
 }
 }
 
 
 void bmx_mysql_bind_datetime(MYSQL_BIND* bindings, int index, MYSQL_TIME  * datetime,
 void bmx_mysql_bind_datetime(MYSQL_BIND* bindings, int index, MYSQL_TIME  * datetime,
-		unsigned int year, unsigned int month, unsigned int day, unsigned int hour, unsigned int minute, unsigned int second, my_bool * isNull) {
+	 int year, int month, int day, int hour, int minute,  int second, my_bool * isNull) {
 
 
 	datetime->year = year;
 	datetime->year = year;
 	datetime->month = month;
 	datetime->month = month;
@@ -286,10 +290,6 @@ int bmx_mysql_rowField_isNull(MYSQL_ROW row, int index) {
 	return ((row[index] == NULL) || (!row[index])) ? 1 : 0;
 	return ((row[index] == NULL) || (!row[index])) ? 1 : 0;
 }
 }
 
 
-unsigned long bmx_mysql_getLength(unsigned long * lengths, int index) {
-	return lengths[index];
-}
-
 char * bmx_mysql_rowField_chars(MYSQL_ROW row, int index) {
 char * bmx_mysql_rowField_chars(MYSQL_ROW row, int index) {
 	return row[index];
 	return row[index];
 }
 }
@@ -365,3 +365,29 @@ float bmx_mysql_char_to_float(char * data) {
 double bmx_mysql_char_to_double(char * data) {
 double bmx_mysql_char_to_double(char * data) {
 	return *(double*)data;
 	return *(double*)data;
 }
 }
+
+BBObject * bmx_mysql_char_to_datetime(char * data) {
+	MYSQL_TIME * dt = (MYSQL_TIME*)data;
+	return database_core_dbtypes_TDBDateTime_Set(dt->year, dt->month, dt->day, dt->hour, dt->minute, dt->second);
+}
+
+BBObject * bmx_mysql_char_to_date(char * data) {
+	MYSQL_TIME * dt = (MYSQL_TIME*)data;
+	return database_core_dbtypes_TDBDate_Set(dt->year, dt->month, dt->day);
+}
+
+BBObject * bmx_mysql_char_to_time(char * data) {
+	MYSQL_TIME * dt = (MYSQL_TIME*)data;
+	return database_core_dbtypes_TDBTime_Set(dt->hour, dt->minute, dt->second);
+}
+
+size_t bmx_mysql_length_for_field(MYSQL_FIELD * field) {
+	size_t length = field->length;
+	if ( field->type == MYSQL_TYPE_DATE
+			|| field->type == MYSQL_TYPE_DATETIME
+			|| field->type == MYSQL_TYPE_TIMESTAMP
+			|| field->type == MYSQL_TYPE_TIME ) {
+		length = sizeof(MYSQL_TIME);
+	}
+	return length;
+}

+ 14 - 16
mariadb.mod/mariadb.bmx

@@ -56,8 +56,6 @@ ModuleInfo "CC_OPTS: `pkg-config --cflags libmariadb`"
 ModuleInfo "LD_OPTS: `pkg-config --libs-only-L libmariadb`"
 ModuleInfo "LD_OPTS: `pkg-config --libs-only-L libmariadb`"
 ?
 ?
 
 
-Import Database.Core
-
 Import "common.bmx"
 Import "common.bmx"
 
 
 Type TDBMariaDB Extends TDBConnection
 Type TDBMariaDB Extends TDBConnection
@@ -362,8 +360,8 @@ Type TMySQLField
 
 
 	Field mySQLField:Byte Ptr
 	Field mySQLField:Byte Ptr
 	Field dataValue:Byte Ptr
 	Field dataValue:Byte Ptr
-	Field dataLength:Int
-	Field isNull:Int
+	Field dataLength:ULongInt
+	Field isNull:Byte
 	Field flag:Int
 	Field flag:Int
 
 
 	Method clear()
 	Method clear()
@@ -515,7 +513,8 @@ Type TMySQLResultSet Extends TQueryResultSet
 				mySQLFields[i].mySQLField = _field
 				mySQLFields[i].mySQLField = _field
 				mySQLFields[i].dataLength = bmx_mysql_field_length(_field) + 1
 				mySQLFields[i].dataLength = bmx_mysql_field_length(_field) + 1
 				' make some space for the data...
 				' make some space for the data...
-				mySQLFields[i].dataValue = MemAlloc(Size_T(mySQLFields[i].dataLength))
+				Local size:Size_T = bmx_mysql_length_for_field(_field)
+				mySQLFields[i].dataValue = MemAlloc(size)
 				
 				
 				Local ty:Int = bmx_mysql_field_type(_field)
 				Local ty:Int = bmx_mysql_field_type(_field)
 				' build result set field information
 				' build result set field information
@@ -750,11 +749,11 @@ Type TMySQLResultSet Extends TQueryResultSet
 							values[i] = New TDBDouble
 							values[i] = New TDBDouble
 							values[i].setDouble(bmx_mysql_char_to_double(mySQLFields[i].dataValue))
 							values[i].setDouble(bmx_mysql_char_to_double(mySQLFields[i].dataValue))
 						Case DBTYPE_DATE
 						Case DBTYPE_DATE
-							values[i] = TDBDate.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+							values[i] = bmx_mysql_char_to_date(mySQLFields[i].dataValue)
 						Case DBTYPE_DATETIME
 						Case DBTYPE_DATETIME
-							values[i] = TDBDateTime.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+							values[i] = bmx_mysql_char_to_datetime(mySQLFields[i].dataValue)
 						Case DBTYPE_TIME
 						Case DBTYPE_TIME
-							values[i] = TDBTime.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+							values[i] = bmx_mysql_char_to_time(mySQLFields[i].dataValue)
 						Case DBTYPE_BLOB
 						Case DBTYPE_BLOB
 							values[i] = TDBBlob.Set(mySQLFields[i].dataValue, fieldLength)
 							values[i] = TDBBlob.Set(mySQLFields[i].dataValue, fieldLength)
 						Default
 						Default
@@ -766,10 +765,9 @@ Type TMySQLResultSet Extends TQueryResultSet
 				
 				
 			Else
 			Else
 				' a non-prepared query
 				' a non-prepared query
-				
 				If Not bmx_mysql_rowField_isNull(row, i) Then
 				If Not bmx_mysql_rowField_isNull(row, i) Then
 				
 				
-					Local fieldLength:Int = bmx_mysql_getLength(mysql_fetch_lengths(resultHandle), i)
+					Local fieldLength:Int = Int(mysql_fetch_lengths(resultHandle)[i])
 				
 				
 					Select rec.fields[i].fType
 					Select rec.fields[i].fType
 						Case DBTYPE_INT
 						Case DBTYPE_INT
@@ -869,18 +867,18 @@ Type TMySQLResultSet Extends TQueryResultSet
 			resultHandle = Null
 			resultHandle = Null
 		End If
 		End If
 		
 		
+		If metaHandle Then
+			mysql_free_result(metaHandle)
+			metaHandle = Null
+		End If
+		
 		If stmtHandle Then
 		If stmtHandle Then
 			If bmx_mysql_stmt_close(stmtHandle) Then
 			If bmx_mysql_stmt_close(stmtHandle) Then
-			
+				'
 			End If
 			End If
 			stmtHandle = Null
 			stmtHandle = Null
 		End If
 		End If
 		
 		
-		If metaHandle Then
-			mysql_free_result(metaHandle)
-			metaHandle = Null
-		End If
-		
 		If parameterBindings Then
 		If parameterBindings Then
 			bmx_mysql_deleteBindings(parameterBindings)
 			bmx_mysql_deleteBindings(parameterBindings)
 			parameterBindings = Null
 			parameterBindings = Null