Selaa lähdekoodia

Database.MariaDB. Initial Import.

Brucey 3 vuotta sitten
vanhempi
commit
00213a093f
41 muutettua tiedostoa jossa 7535 lisäystä ja 0 poistoa
  1. 195 0
      mariadb.mod/common.bmx
  2. 347 0
      mariadb.mod/glue.c
  3. 107 0
      mariadb.mod/include/errmsg.h
  4. 47 0
      mariadb.mod/include/ma_list.h
  5. 139 0
      mariadb.mod/include/ma_pvio.h
  6. 161 0
      mariadb.mod/include/ma_tls.h
  7. 55 0
      mariadb.mod/include/mariadb/ma_io.h
  8. 469 0
      mariadb.mod/include/mariadb_com.h
  9. 76 0
      mariadb.mod/include/mariadb_ctype.h
  10. 259 0
      mariadb.mod/include/mariadb_dyncol.h
  11. 307 0
      mariadb.mod/include/mariadb_rpl.h
  12. 259 0
      mariadb.mod/include/mariadb_stmt.h
  13. 44 0
      mariadb.mod/include/mariadb_version.h
  14. 894 0
      mariadb.mod/include/mysql.h
  15. 244 0
      mariadb.mod/include/mysql/client_plugin.h
  16. 107 0
      mariadb.mod/include/mysql/plugin_auth.h
  17. 110 0
      mariadb.mod/include/mysql/plugin_auth_common.h
  18. 1234 0
      mariadb.mod/include/mysqld_error.h
  19. BIN
      mariadb.mod/lib/win32arm/libmariadb.a
  20. 235 0
      mariadb.mod/lib/win32arm/libmariadb.def
  21. 3 0
      mariadb.mod/lib/win32arm/notes.txt
  22. BIN
      mariadb.mod/lib/win32arm64/libmariadb.a
  23. 235 0
      mariadb.mod/lib/win32arm64/libmariadb.def
  24. 3 0
      mariadb.mod/lib/win32arm64/notes.txt
  25. BIN
      mariadb.mod/lib/win32x64/libmariadb.a
  26. 235 0
      mariadb.mod/lib/win32x64/libmariadb.def
  27. 3 0
      mariadb.mod/lib/win32x64/notes.txt
  28. BIN
      mariadb.mod/lib/win32x86/libmariadb.a
  29. 235 0
      mariadb.mod/lib/win32x86/libmariadb.def
  30. 3 0
      mariadb.mod/lib/win32x86/notes.txt
  31. 941 0
      mariadb.mod/mariadb.bmx
  32. 99 0
      mariadb.mod/tests/blob_test.bmx
  33. BIN
      mariadb.mod/tests/images/alfred-aho.jpg
  34. BIN
      mariadb.mod/tests/images/brian-kernighan.jpg
  35. BIN
      mariadb.mod/tests/images/pjw.jpg
  36. 43 0
      mariadb.mod/tests/tableinfo.bmx
  37. 69 0
      mariadb.mod/tests/test_01.bmx
  38. 88 0
      mariadb.mod/tests/test_02.bmx
  39. 120 0
      mariadb.mod/tests/test_03.bmx
  40. 130 0
      mariadb.mod/tests/test_04.bmx
  41. 39 0
      mariadb.mod/tests/test_05.bmx

+ 195 - 0
mariadb.mod/common.bmx

@@ -0,0 +1,195 @@
+' Copyright (c) 2007-2022 Bruce A Henderson
+' All rights reserved.
+'
+' Redistribution and use in source and binary forms, with or without
+' modification, are permitted provided that the following conditions are met:
+'     * Redistributions of source code must retain the above copyright
+'       notice, this list of conditions and the following disclaimer.
+'     * Redistributions in binary form must reproduce the above copyright
+'       notice, this list of conditions and the following disclaimer in the
+'       documentation and/or other materials provided with the distribution.
+'     * Neither the auther nor the names of its contributors may be used to 
+'       endorse or promote products derived from this software without specific
+'       prior written permission.
+'
+' THIS SOFTWARE IS PROVIDED BY Bruce A Henderson ``AS IS'' AND ANY
+' EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+' WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+' DISCLAIMED. IN NO EVENT SHALL Bruce A Henderson BE LIABLE FOR ANY
+' DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+' (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+' LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+' ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+' (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+' SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+'
+SuperStrict
+
+Import BRL.Blitz
+
+?linux
+Import "-L/usr/lib/mysql"
+Import "-lmariadb"
+Import "/usr/include/mysql/*.h"
+?win32
+Import "-lmariadb"
+Import "include/*.h"
+?macos
+'Import "-L/usr/local/mysql/lib"
+Import "-lmariadb"
+Import "-lz"
+'Import "/usr/local/mysql/include/*.h"
+?
+
+Import "glue.c"
+
+Const MYSQL_TYPE_DECIMAL:Int = 0
+Const MYSQL_TYPE_TINY:Int = 1
+Const MYSQL_TYPE_SHORT:Int = 2 
+Const MYSQL_TYPE_LONG:Int = 3
+Const MYSQL_TYPE_FLOAT:Int = 4 
+Const MYSQL_TYPE_DOUBLE:Int = 5
+Const MYSQL_TYPE_NULL:Int = 6
+Const MYSQL_TYPE_TIMESTAMP:Int = 7
+Const MYSQL_TYPE_LONGLONG:Int = 8
+Const MYSQL_TYPE_INT24:Int = 9
+Const MYSQL_TYPE_DATE:Int = 10
+Const MYSQL_TYPE_TIME:Int = 11
+Const MYSQL_TYPE_DATETIME:Int = 12
+Const MYSQL_TYPE_YEAR:Int = 13
+Const MYSQL_TYPE_NEWDATE:Int = 14
+Const MYSQL_TYPE_VARCHAR:Int = 15
+Const MYSQL_TYPE_BIT:Int = 16
+Const MYSQL_TYPE_JSON:Int = 245
+Const MYSQL_TYPE_NEWDECIMAL:Int = 246
+Const MYSQL_TYPE_ENUM:Int = 247
+Const MYSQL_TYPE_SET:Int = 248
+Const MYSQL_TYPE_TINY_BLOB:Int = 249
+Const MYSQL_TYPE_MEDIUM_BLOB:Int = 250
+Const MYSQL_TYPE_LONG_BLOB:Int = 251
+Const MYSQL_TYPE_BLOB:Int = 252
+Const MYSQL_TYPE_VAR_STRING:Int = 253
+Const MYSQL_TYPE_STRING:Int = 254
+Const MYSQL_TYPE_GEOMETRY:Int = 255
+
+
+?win32
+Extern "win32"
+?linux
+Extern
+?macos
+Extern
+?
+	Function mysql_close(handle:Byte Ptr)
+	Function mysql_ping:Int(handle:Byte Ptr)
+	Function mysql_query:Int(handle:Byte Ptr, query:Byte Ptr)
+	Function mysql_errno:Int(handle:Byte Ptr)
+	Function mysql_error:Byte Ptr(handle:Byte Ptr)
+	Function mysql_init:Byte Ptr(h:Int = 0)
+	Function mysql_get_client_version:Int()
+	Function mysql_real_connect:Int(handle:Byte Ptr, host:Byte Ptr, user:Byte Ptr, ..
+		passwd:Byte Ptr, db:Byte Ptr, port:Int, unix_socket:Byte Ptr, client_flag:Int)
+	Function mysql_select_db:Int(handle:Byte Ptr, db:Byte Ptr)
+	Function mysql_set_character_set(handle:Byte Ptr, text:Byte Ptr)
+	Function mysql_get_server_version:Int(handle:Byte Ptr)
+	Function mysql_real_query:Int(handle:Byte Ptr, query:Byte Ptr, size:Int)
+	Function mysql_store_result:Byte Ptr(handle:Byte Ptr)
+	Function mysql_field_count:Int(handle:Byte Ptr)
+	Function mysql_fetch_field_direct:Byte Ptr(handle:Byte Ptr, index:Int)
+	Function mysql_stmt_fetch:Int(stmt:Byte Ptr)
+	Function mysql_fetch_row:Byte Ptr(stmt:Byte Ptr)
+	Function mysql_free_result(result:Byte Ptr)
+
+	Function mysql_stmt_init:Byte Ptr(handle:Byte Ptr)
+	Function mysql_stmt_prepare:Int(stmt:Byte Ptr, query:Byte Ptr, size:Int)
+	Function mysql_stmt_param_count:Int(stmt:Byte Ptr)
+	Function mysql_stmt_execute:Int(stmt:Byte Ptr)
+	Function mysql_stmt_error: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_fetch_lengths:Byte Ptr(result:Byte Ptr)
+	Function mysql_fetch_field:Byte Ptr(meta:Byte Ptr)
+	Function mysql_stmt_store_result:Int(stmt:Byte Ptr)
+	
+	Function mysql_list_tables:Byte Ptr(handle:Byte Ptr, name:Byte Ptr)
+End Extern
+
+Extern
+	Function bmx_mysql_field_name:String(f:Byte Ptr)
+	Function bmx_mysql_field_org_name:Byte Ptr(f:Byte Ptr)
+	Function bmx_mysql_field_table:Byte Ptr(f:Byte Ptr)
+	Function bmx_mysql_field_org_table: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_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_flags: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_makeBindings:Byte Ptr(size:Int)
+	Function bmx_mysql_deleteBindings(bindings:Byte Ptr)
+	'Function bmx_mysql_makeBools:Byte Ptr(size:Int)
+	Function bmx_mysql_setBool(bools:Byte Ptr, index:Int, isNull:Int)
+	Function bmx_mysql_deleteBools(bools:Byte Ptr)
+	
+	Function bmx_mysql_bind_int(params:Byte Ptr, index:Int, value:Int Ptr)
+	Function bmx_mysql_bind_float(params:Byte Ptr, index:Int, value:Float Ptr)
+	Function bmx_mysql_bind_double(params:Byte Ptr, index:Int, value:Double Ptr)
+	Function bmx_mysql_bind_long(params:Byte Ptr, index:Int, value:Long Ptr)
+	Function bmx_mysql_bind_string(params:Byte Ptr, index:Int, value:Byte Ptr, size:Int)
+	Function bmx_mysql_bind_date(params:Byte Ptr, index:Int, value:Byte Ptr, _year:Int, _month:Int, _day:Int)
+	Function bmx_mysql_bind_time(params:Byte Ptr, index:Int, value:Byte Ptr, _hour:Int, _min:Int, _sec:Int)
+	Function bmx_mysql_bind_datetime(params:Byte Ptr, index:Int, value:Byte Ptr, _year:Int, _month:Int, _day:Int, _hour:Int, _min:Int, _sec:Int)
+	Function bmx_mysql_bind_blob(params:Byte Ptr, index:Int, value:Byte Ptr, size:Int)
+	
+	Function bmx_mysql_makeVals:Byte Ptr(size:Int)
+	Function bmx_mysql_deleteVals(vals: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_rowField_isNull:Int(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_stmt_bind_result:Int(stmt:Byte Ptr, bindings:Byte Ptr)
+	Function bmx_mysql_stmt_fetch:Int(stmt:Byte Ptr)
+	
+	Function bmx_mysql_stmt_bind_param:Int(stmt:Byte Ptr, bindings:Byte Ptr)
+	Function bmx_mysql_getBindings:Byte Ptr(stmt:Byte Ptr)
+	Function bmx_mysql_getParams:Byte Ptr(stmt:Byte Ptr)
+
+	Function bmx_mysql_stmt_insert_id(stmt:Byte Ptr, id:Long Ptr)
+	Function bmx_mysql_insert_id(handle:Byte Ptr, id:Long Ptr)
+	
+	Function bmx_mysql_makeTime:Byte Ptr()
+	Function bmx_mysql_deleteTime(handle:Byte Ptr)
+	
+	Function bmx_mysql_stmt_close:Int(stmt:Byte Ptr)
+	Function bmx_mysql_affected_rows(handle:Byte Ptr, rows:Long Ptr)
+	Function bmx_mysql_stmt_reset:Int(stmt:Byte Ptr)
+	Function bmx_mysql_stmt_affected_rows(stmt:Byte Ptr, rows:Long Ptr)
+	
+	Function bmx_mysql_char_to_int:Int(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_double:Double(data:Byte Ptr)
+
+End Extern
+
+
+Const CLIENT_FOUND_ROWS:Int = 2
+Const CLIENT_NO_SCHEMA:Int = 16
+Const CLIENT_COMPRESS:Int = 32
+Const CLIENT_LOCAL_FILES:Int = 128
+Const CLIENT_IGNORE_SPACE:Int = 256
+Const CLIENT_INTERACTIVE:Int = 1024
+Const CLIENT_SSL:Int = 2048
+Const CLIENT_IGNORE_SIGPIPE:Int = 4096
+Const CLIENT_MULTI_STATEMENTS:Int = 1 Shl 16
+Const CLIENT_MULTI_RESULTS:Int = 1 Shl 17
+Const CLIENT_REMEMBER_OPTIONS:Int = 1 Shl 31
+
+

+ 347 - 0
mariadb.mod/glue.c

@@ -0,0 +1,347 @@
+/*
+  Copyright (c) 2007-2022 Bruce A Henderson
+  All rights reserved.
+ 
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+      * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+      * Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+      * Neither the auther nor the names of its contributors may be used to 
+        endorse or promote products derived from this software without specific
+        prior written permission.
+ 
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
+  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <brl.mod/blitz.mod/blitz.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+//#include <ma_global.h>
+#endif
+#include <mysql.h>
+#include <stdio.h>
+
+BBString * bmx_mysql_field_name(MYSQL_FIELD * field) {
+	return bbStringFromUTF8String(field->name);
+}
+
+char * bmx_mysql_field_org_name(MYSQL_FIELD * field) {
+	return field->org_name;
+}
+
+char * bmx_mysql_field_table(MYSQL_FIELD * field) {
+	return field->table;
+}
+
+char * bmx_mysql_field_org_table(MYSQL_FIELD * field) {
+	return field->org_table;
+}
+
+char * bmx_mysql_field_db(MYSQL_FIELD * field) {
+	return field->db;
+}
+
+char * bmx_mysql_field_catalog(MYSQL_FIELD * field) {
+	return field->catalog;
+}
+
+char * bmx_mysql_field_def(MYSQL_FIELD * field) {
+	return field->def;
+}
+
+unsigned long bmx_mysql_field_length(MYSQL_FIELD * field) {
+	return field->length;
+}
+
+unsigned long bmx_mysql_field_max_length(MYSQL_FIELD * field) {
+	return field->max_length;
+}
+
+int bmx_mysql_field_flags(MYSQL_FIELD * field) {
+	return field->flags;
+}
+
+int bmx_mysql_field_type(MYSQL_FIELD * field) {
+	return field->type;
+}
+
+int bmx_mysql_field_decimals(MYSQL_FIELD * field) {
+	return field->decimals;
+}
+
+
+MYSQL_BIND * bmx_mysql_makeBindings(int size) {
+	MYSQL_BIND * bindings = malloc(sizeof(MYSQL_BIND) * size);
+	// important that we clear the memory... otherwise it nukes when we try to "fetch"!!
+	memset(bindings, 0, size * sizeof(MYSQL_BIND));
+	return bindings;
+}
+
+// tidy up our memory
+void bmx_mysql_deleteBindings(MYSQL_BIND * bindings) {
+	free(bindings);
+}
+
+MYSQL_TIME * bmx_mysql_makeTime() {
+	MYSQL_TIME * time = (MYSQL_TIME *)malloc(sizeof(MYSQL_TIME));
+	memset(time, 0, sizeof(MYSQL_TIME));
+	return time;
+}
+
+void bmx_mysql_deleteTime(MYSQL_TIME * time) {
+	free(time);
+}
+
+void bmx_mysql_deleteBools(my_bool * bools) {
+	free(bools);
+}
+
+void bmx_mysql_setBool(my_bool * bools, int index, int isNull) {
+	bools[index] = isNull;
+}
+
+char ** bmx_mysql_makeVals(int size) {
+	return malloc(sizeof(char*) * size);
+}
+
+void bmx_mysql_deleteVals(char ** vals) {
+	free(vals);
+}
+
+void bmx_mysql_bind_null(MYSQL_BIND* bindings, int index) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->buffer_type = MYSQL_TYPE_NULL;
+}
+
+void bmx_mysql_bind_int(MYSQL_BIND* bindings, int index, int * value) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+	
+	bind->buffer_type = MYSQL_TYPE_LONG;
+	bind->buffer = value;
+	bind->buffer_length = sizeof(int);
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_float(MYSQL_BIND* bindings, int index, float * value) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_FLOAT;
+	bind->buffer = value;
+	bind->buffer_length = sizeof(float);
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_double(MYSQL_BIND* bindings, int index, double * value) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_DOUBLE;
+	bind->buffer = value;
+	bind->buffer_length = sizeof(double);
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_long(MYSQL_BIND* bindings, int index, long * value) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_LONGLONG;
+	bind->buffer = value;
+	bind->buffer_length = 8;
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_string(MYSQL_BIND* bindings, int index, char * value, int size) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+	bind->buffer_type = MYSQL_TYPE_STRING;
+	bind->buffer = value;
+	bind->buffer_length = size;
+
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_blob(MYSQL_BIND* bindings, int index, char * value, int size) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_BLOB;
+	bind->buffer = value;
+	bind->buffer_length = size;
+
+	bind->is_unsigned = 0;
+}
+
+void bmx_mysql_bind_date(MYSQL_BIND* bindings, int index, MYSQL_TIME * date, unsigned int year, unsigned int month, unsigned int day) {
+
+	date->year = year;
+	date->month = month;
+	date->day = day;
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_DATE;
+	bind->buffer = (char *)date;
+	bind->buffer_length = sizeof(MYSQL_TIME);
+
+}
+
+void bmx_mysql_bind_time(MYSQL_BIND* bindings, int index, MYSQL_TIME * time, unsigned int hour, unsigned int minute, unsigned int second) {
+
+	time->hour = hour;
+	time->minute = minute;
+	time->second = second;
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_TIME;
+	bind->buffer = (char *)time;
+	bind->buffer_length = sizeof(MYSQL_TIME);
+}
+
+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) {
+
+	datetime->year = year;
+	datetime->month = month;
+	datetime->day = day;
+	datetime->hour = hour;
+	datetime->minute = minute;
+	datetime->second = second;
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->is_null = (my_bool*)0;
+	bind->length = 0;
+
+	bind->buffer_type = MYSQL_TYPE_DATETIME;
+	bind->buffer = (char *)datetime;
+	bind->buffer_length = sizeof(MYSQL_TIME);
+}
+
+void examine_bindings(MYSQL_BIND* bindings, int size, MYSQL_STMT *stmt) {
+	for (int i = 0; i < size; i++) {
+		MYSQL_BIND* bind = &bindings[i];
+		printf("Number = %d\n", i);fflush(stdout);
+		printf("type = %d\n", bind->buffer_type);fflush(stdout);
+		printf("lgth = %d\n", bind->buffer_length);fflush(stdout);
+		if (MYSQL_TYPE_STRING == bind->buffer_type) {
+			printf("data = %s\n", bind->buffer);fflush(stdout);
+		}
+	}
+}
+
+int bmx_mysql_rowField_isNull(MYSQL_ROW row, int index) {
+	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) {
+	return row[index];
+}
+
+void bmx_mysql_inbind(MYSQL_BIND* bindings, int index, MYSQL_FIELD * field, char * dataValue, long unsigned * dataLength, my_bool * isNull, int type) {
+
+	MYSQL_BIND* bind = &bindings[index];
+	bind->buffer_type = type;
+	bind->buffer_length = field->length + 1;
+	bind->is_null = isNull;
+	bind->length = dataLength;
+
+	bind->buffer = dataValue;
+}
+
+MYSQL_BIND * bmx_mysql_getBindings(MYSQL_STMT *stmt) {
+	return stmt->bind;
+}
+
+MYSQL_BIND * bmx_mysql_getParams(MYSQL_STMT *stmt) {
+	return stmt->params;
+}
+
+int bmx_mysql_stmt_fetch(MYSQL_STMT *stmt) {
+	int result = mysql_stmt_fetch(stmt);
+	return result;
+}
+
+void bmx_mysql_stmt_insert_id(MYSQL_STMT *stmt, BBInt64 * id) {
+	*id = mysql_stmt_insert_id(stmt);
+}
+
+void bmx_mysql_insert_id(MYSQL * mysql, BBInt64 * id) {
+	*id = mysql_insert_id(mysql);
+}
+
+int bmx_mysql_stmt_close(MYSQL_STMT *stmt) {
+	return mysql_stmt_close(stmt);
+}
+
+void bmx_mysql_affected_rows(MYSQL *mysql, BBInt64 * rows) {
+	*rows = mysql_affected_rows(mysql);
+}
+
+int bmx_mysql_stmt_reset(MYSQL_STMT *stmt) {
+	return mysql_stmt_reset(stmt);
+}
+
+int bmx_mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind) {
+	return mysql_stmt_bind_param(stmt, bind);
+}
+
+void bmx_mysql_stmt_affected_rows(MYSQL_STMT *stmt, BBInt64 * rows) {
+	*rows = mysql_stmt_affected_rows(stmt);
+}
+
+int bmx_mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND * bind) {
+	return mysql_stmt_bind_result(stmt, bind);
+}
+
+int bmx_mysql_char_to_int(char * data) {
+	return *(int*)data;
+}
+
+BBInt64 bmx_mysql_char_to_long(char * data) {
+	return *(BBInt64*)data;
+}
+
+float bmx_mysql_char_to_float(char * data) {
+	return *(float*)data;
+}
+
+double bmx_mysql_char_to_double(char * data) {
+	return *(double*)data;
+}

+ 107 - 0
mariadb.mod/include/errmsg.h

@@ -0,0 +1,107 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+                 2012-2016 SkySQL AB, MariaDB Corporation AB
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+/* Error messages for mysql clients */
+/* error messages for the demon is in share/language/errmsg.sys */
+#ifndef _errmsg_h_
+#define _errmsg_h_
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+void	init_client_errs(void);
+extern const char *client_errors[];	/* Error messages */
+extern const char *mariadb_client_errors[];	/* Error messages */
+#ifdef	__cplusplus
+}
+#endif
+
+
+
+#define CR_MIN_ERROR		2000	/* For easier client code */
+#define CR_MAX_ERROR		2999
+#define CER_MIN_ERROR           5000
+#define CER_MAX_ERROR           5999
+#define CER(X) mariadb_client_errors[(X)-CER_MIN_ERROR]
+#define ER(X) client_errors[(X)-CR_MIN_ERROR]
+#define CLIENT_ERRMAP		2	/* Errormap used by ma_error() */
+
+#define CR_UNKNOWN_ERROR	2000
+#define CR_SOCKET_CREATE_ERROR	2001
+#define CR_CONNECTION_ERROR	2002
+#define CR_CONN_HOST_ERROR	2003 /* never sent to a client, message only */
+#define CR_IPSOCK_ERROR		2004
+#define CR_UNKNOWN_HOST		2005
+#define CR_SERVER_GONE_ERROR	2006 /* disappeared _between_ queries */
+#define CR_VERSION_ERROR	2007
+#define CR_OUT_OF_MEMORY	2008
+#define CR_WRONG_HOST_INFO	2009
+#define CR_LOCALHOST_CONNECTION 2010
+#define CR_TCP_CONNECTION	2011
+#define CR_SERVER_HANDSHAKE_ERR 2012
+#define CR_SERVER_LOST		2013 /* disappeared _during_ a query */
+#define CR_COMMANDS_OUT_OF_SYNC 2014
+#define CR_NAMEDPIPE_CONNECTION 2015
+#define CR_NAMEDPIPEWAIT_ERROR 2016
+#define CR_NAMEDPIPEOPEN_ERROR 2017
+#define CR_NAMEDPIPESETSTATE_ERROR 2018
+#define CR_CANT_READ_CHARSET	2019
+#define CR_NET_PACKET_TOO_LARGE 2020
+#define CR_SSL_CONNECTION_ERROR 2026
+#define CR_MALFORMED_PACKET     2027
+#define CR_NO_PREPARE_STMT      2030
+#define CR_PARAMS_NOT_BOUND     2031
+#define CR_INVALID_PARAMETER_NO  2034
+#define CR_INVALID_BUFFER_USE    2035
+#define CR_UNSUPPORTED_PARAM_TYPE 2036
+
+#define CR_SHARED_MEMORY_CONNECTION 2037
+#define CR_SHARED_MEMORY_CONNECT_ERROR 2038
+
+#define CR_CONN_UNKNOWN_PROTOCOL 2047
+#define CR_SECURE_AUTH          2049
+#define CR_NO_DATA              2051
+#define CR_NO_STMT_METADATA     2052
+#define CR_NOT_IMPLEMENTED      2054
+#define CR_SERVER_LOST_EXTENDED 2055 /* never sent to a client, message only */
+#define CR_STMT_CLOSED          2056
+#define CR_NEW_STMT_METADATA    2057
+#define CR_ALREADY_CONNECTED    2058
+#define CR_AUTH_PLUGIN_CANNOT_LOAD 2059
+#define CR_DUPLICATE_CONNECTION_ATTR 2060
+#define CR_AUTH_PLUGIN_ERR 2061
+/* Always last, if you add new error codes please update the
+   value for CR_MYSQL_LAST_ERROR */
+#define CR_MYSQL_LAST_ERROR CR_AUTH_PLUGIN_ERR
+
+/* 
+ * MariaDB Connector/C errors: 
+ */
+#define CR_EVENT_CREATE_FAILED 5000
+#define CR_BIND_ADDR_FAILED    5001
+#define CR_ASYNC_NOT_SUPPORTED 5002
+#define CR_FUNCTION_NOT_SUPPORTED 5003
+#define CR_FILE_NOT_FOUND 5004
+#define CR_FILE_READ 5005
+#define CR_BULK_WITHOUT_PARAMETERS 5006
+#define CR_INVALID_STMT 5007
+#define CR_VERSION_MISMATCH 5008
+/* Always last, if you add new error codes please update the
+   value for CR_MARIADB_LAST_ERROR */
+#define CR_MARIADB_LAST_ERROR CR_VERSION_MISMATCH
+#endif

+ 47 - 0
mariadb.mod/include/ma_list.h

@@ -0,0 +1,47 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+#ifndef _list_h_
+#define _list_h_
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct st_list {
+  struct st_list *prev,*next;
+  void *data;
+} LIST;
+
+typedef int (*list_walk_action)(void *,void *);
+
+extern LIST *list_add(LIST *root,LIST *element);
+extern LIST *list_delete(LIST *root,LIST *element);
+extern LIST *list_cons(void *data,LIST *root);
+extern LIST *list_reverse(LIST *root);
+extern void list_free(LIST *root,unsigned int free_data);
+extern unsigned int list_length(LIST *list);
+extern int list_walk(LIST *list,list_walk_action action,char * argument);
+
+#define list_rest(a) ((a)->next)
+#define list_push(a,b) (a)=list_cons((b),(a))
+#define list_pop(A) do {LIST *old=(A); (A)=list_delete(old,old) ; ma_free((char *) old,MYF(MY_FAE)); } while(0)
+
+#ifdef	__cplusplus
+}
+#endif
+#endif

+ 139 - 0
mariadb.mod/include/ma_pvio.h

@@ -0,0 +1,139 @@
+#ifndef _ma_pvio_h_
+#define _ma_pvio_h_
+#define cio_defined
+
+#ifdef HAVE_TLS
+#include <ma_tls.h>
+#else
+#define MARIADB_TLS void
+#endif
+
+/* CONC-492: Allow to buuld plugins outside of MariaDB Connector/C
+   source tree wnen ma_global.h was not included. */
+#if !defined(_global_h) && !defined(MY_GLOBAL_INCLUDED)
+typedef unsigned char uchar;
+#endif
+
+#define PVIO_SET_ERROR if (pvio->set_error) \
+                        pvio->set_error
+
+#define PVIO_READ_AHEAD_CACHE_SIZE 16384
+#define PVIO_READ_AHEAD_CACHE_MIN_SIZE 2048
+#define PVIO_EINTR_TRIES 2
+
+struct st_ma_pvio_methods;
+typedef struct st_ma_pvio_methods PVIO_METHODS;
+
+#define IS_PVIO_ASYNC(a) \
+  ((a)->mysql && (a)->mysql->options.extension && (a)->mysql->options.extension->async_context)
+
+#define IS_PVIO_ASYNC_ACTIVE(a) \
+  (IS_PVIO_ASYNC(a)&& (a)->mysql->options.extension->async_context->active)
+
+#define IS_MYSQL_ASYNC(a) \
+  ((a)->options.extension && (a)->options.extension->async_context)
+
+#define IS_MYSQL_ASYNC_ACTIVE(a) \
+  (IS_MYSQL_ASYNC(a)&& (a)->options.extension->async_context->active)
+
+enum enum_pvio_timeout {
+  PVIO_CONNECT_TIMEOUT= 0,
+  PVIO_READ_TIMEOUT,
+  PVIO_WRITE_TIMEOUT 
+};
+
+enum enum_pvio_io_event
+{
+  VIO_IO_EVENT_READ,
+  VIO_IO_EVENT_WRITE,
+  VIO_IO_EVENT_CONNECT
+};
+
+enum enum_pvio_type {
+  PVIO_TYPE_UNIXSOCKET= 0,
+  PVIO_TYPE_SOCKET,
+  PVIO_TYPE_NAMEDPIPE,
+  PVIO_TYPE_SHAREDMEM,
+};
+
+enum enum_pvio_operation {
+  PVIO_READ= 0,
+  PVIO_WRITE=1
+};
+
+#define SHM_DEFAULT_NAME "MYSQL"
+
+struct st_pvio_callback;
+
+typedef struct st_pvio_callback {
+  void (*callback)(MYSQL *mysql, uchar *buffer, size_t size);
+  struct st_pvio_callback *next;
+} PVIO_CALLBACK;
+
+struct st_ma_pvio {
+  void *data;
+  /* read ahead cache */
+  uchar *cache;
+  uchar *cache_pos;
+  size_t cache_size;
+  enum enum_pvio_type type;
+  int timeout[3];
+  int ssl_type;  /* todo: change to enum (ssl plugins) */
+  MARIADB_TLS *ctls;
+  MYSQL *mysql;
+  PVIO_METHODS *methods;
+  void (*set_error)(MYSQL *mysql, unsigned int error_nr, const char *sqlstate, const char *format, ...);
+  void (*callback)(MARIADB_PVIO *pvio, my_bool is_read, const uchar *buffer, size_t length);
+};
+
+typedef struct st_ma_pvio_cinfo
+{
+  const char *host;
+  const char *unix_socket;
+  int port;
+  enum enum_pvio_type type;
+  MYSQL *mysql;
+} MA_PVIO_CINFO;
+
+struct st_ma_pvio_methods
+{
+  my_bool (*set_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
+  int (*get_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
+  ssize_t (*read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
+  ssize_t (*async_read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
+  ssize_t (*write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
+  ssize_t (*async_write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
+  int (*wait_io_or_timeout)(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
+  int (*blocking)(MARIADB_PVIO *pvio, my_bool value, my_bool *old_value);
+  my_bool (*connect)(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
+  my_bool (*close)(MARIADB_PVIO *pvio);
+  int (*fast_send)(MARIADB_PVIO *pvio);
+  int (*keepalive)(MARIADB_PVIO *pvio);
+  my_bool (*get_handle)(MARIADB_PVIO *pvio, void *handle);
+  my_bool (*is_blocking)(MARIADB_PVIO *pvio);
+  my_bool (*is_alive)(MARIADB_PVIO *pvio);
+  my_bool (*has_data)(MARIADB_PVIO *pvio, ssize_t *data_len);
+  int(*shutdown)(MARIADB_PVIO *pvio);
+};
+
+/* Function prototypes */
+MARIADB_PVIO *ma_pvio_init(MA_PVIO_CINFO *cinfo);
+void ma_pvio_close(MARIADB_PVIO *pvio);
+ssize_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
+ssize_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
+ssize_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
+int ma_pvio_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
+my_bool ma_pvio_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
+int ma_pvio_fast_send(MARIADB_PVIO *pvio);
+int ma_pvio_keepalive(MARIADB_PVIO *pvio);
+my_socket ma_pvio_get_socket(MARIADB_PVIO *pvio);
+my_bool ma_pvio_is_blocking(MARIADB_PVIO *pvio);
+my_bool ma_pvio_blocking(MARIADB_PVIO *pvio, my_bool block, my_bool *previous_mode);
+my_bool ma_pvio_is_blocking(MARIADB_PVIO *pvio);
+int ma_pvio_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
+my_bool ma_pvio_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
+my_bool ma_pvio_is_alive(MARIADB_PVIO *pvio);
+my_bool ma_pvio_get_handle(MARIADB_PVIO *pvio, void *handle);
+my_bool ma_pvio_has_data(MARIADB_PVIO *pvio, ssize_t *length);
+
+#endif /* _ma_pvio_h_ */

+ 161 - 0
mariadb.mod/include/ma_tls.h

@@ -0,0 +1,161 @@
+#ifndef _ma_tls_h_
+#define _ma_tls_h_
+
+enum enum_pvio_tls_type {
+  SSL_TYPE_DEFAULT=0,
+#ifdef _WIN32
+  SSL_TYPE_SCHANNEL,
+#endif
+  SSL_TYPE_OPENSSL,
+  SSL_TYPE_GNUTLS
+};
+
+#define PROTOCOL_SSLV3    0
+#define PROTOCOL_TLS_1_0  1
+#define PROTOCOL_TLS_1_1  2
+#define PROTOCOL_TLS_1_2  3
+#define PROTOCOL_TLS_1_3  4
+#define PROTOCOL_UNKNOWN  5
+#define PROTOCOL_MAX PROTOCOL_TLS_1_3
+
+#define TLS_VERSION_LENGTH 64
+extern char tls_library_version[TLS_VERSION_LENGTH];
+
+typedef struct st_ma_pvio_tls {
+  void *data;
+  MARIADB_PVIO *pvio;
+  void *ssl;
+} MARIADB_TLS;
+
+/* Function prototypes */
+
+/* ma_tls_start
+   initializes the ssl library
+   Parameter:
+     errmsg      pointer to error message buffer
+     errmsg_len  length of error message buffer
+   Returns:
+     0           success
+     1           if an error occurred
+   Notes:
+     On success the global variable ma_tls_initialized will be set to 1
+*/
+int ma_tls_start(char *errmsg, size_t errmsg_len);
+
+/* ma_tls_end
+   unloads/deinitializes ssl library and unsets global variable
+   ma_tls_initialized
+*/
+void ma_tls_end(void);
+
+/* ma_tls_init
+   creates a new SSL structure for a SSL connection and loads
+   client certificates
+
+   Parameters:
+     MYSQL        a mysql structure
+   Returns:
+     void *       a pointer to internal SSL structure
+*/
+void * ma_tls_init(MYSQL *mysql);
+
+/* ma_tls_connect
+   performs SSL handshake
+   Parameters:
+     MARIADB_TLS   MariaDB SSL container
+   Returns:
+     0             success
+     1             error
+*/
+my_bool ma_tls_connect(MARIADB_TLS *ctls);
+
+/* ma_tls_read
+   reads up to length bytes from socket
+   Parameters:
+     ctls         MariaDB SSL container
+     buffer       read buffer
+     length       buffer length
+   Returns:
+     0-n          bytes read
+     -1           if an error occurred
+*/
+ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
+
+/* ma_tls_write
+   write buffer to socket
+   Parameters:
+     ctls         MariaDB SSL container
+     buffer       write buffer
+     length       buffer length
+   Returns:
+     0-n          bytes written
+     -1           if an error occurred
+*/
+ssize_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
+
+/* ma_tls_close
+   closes SSL connection and frees SSL structure which was previously
+   created by ma_tls_init call
+   Parameters:
+     MARIADB_TLS  MariaDB SSL container
+   Returns:
+     0            success
+     1            error
+*/
+my_bool ma_tls_close(MARIADB_TLS *ctls);
+
+/* ma_tls_verify_server_cert
+   validation check of server certificate
+   Parameter:
+     MARIADB_TLS  MariaDB SSL container
+   Returns:
+     ß            success
+     1            error
+*/
+int ma_tls_verify_server_cert(MARIADB_TLS *ctls);
+
+/* ma_tls_get_cipher
+   returns cipher for current ssl connection
+   Parameter:
+     MARIADB_TLS  MariaDB SSL container
+   Returns: 
+     cipher in use or
+     NULL on error
+*/
+const char *ma_tls_get_cipher(MARIADB_TLS *ssl);
+
+/* ma_tls_get_finger_print
+   returns SHA1 finger print of server certificate
+   Parameter:
+     MARIADB_TLS  MariaDB SSL container
+     fp           buffer for fingerprint
+     fp_len       buffer length
+   Returns:
+     actual size of finger print
+*/
+unsigned int ma_tls_get_finger_print(MARIADB_TLS *ctls, char *fp, unsigned int fp_len);
+
+/* ma_tls_get_protocol_version 
+   returns protocol version number in use
+   Parameter:
+     MARIADB_TLS    MariaDB SSL container
+   Returns:
+     protocol number
+*/
+int ma_tls_get_protocol_version(MARIADB_TLS *ctls);
+const char *ma_pvio_tls_get_protocol_version(MARIADB_TLS *ctls);
+int ma_pvio_tls_get_protocol_version_id(MARIADB_TLS *ctls);
+
+/* Function prototypes */
+MARIADB_TLS *ma_pvio_tls_init(MYSQL *mysql);
+my_bool ma_pvio_tls_connect(MARIADB_TLS *ctls);
+ssize_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
+ssize_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
+my_bool ma_pvio_tls_close(MARIADB_TLS *ctls);
+int ma_pvio_tls_verify_server_cert(MARIADB_TLS *ctls);
+const char *ma_pvio_tls_cipher(MARIADB_TLS *ctls);
+my_bool ma_pvio_tls_check_fp(MARIADB_TLS *ctls, const char *fp, const char *fp_list);
+my_bool ma_pvio_start_ssl(MARIADB_PVIO *pvio);
+void ma_pvio_tls_end();
+
+#endif /* _ma_tls_h_ */

+ 55 - 0
mariadb.mod/include/mariadb/ma_io.h

@@ -0,0 +1,55 @@
+/* Copyright (C) 2015 MariaDB Corporation AB
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+#ifndef _ma_io_h_
+#define _ma_io_h_
+
+
+#ifdef HAVE_REMOTEIO
+#include <curl/curl.h>
+#endif
+
+enum enum_file_type {
+  MA_FILE_NONE=0,
+  MA_FILE_LOCAL=1,
+  MA_FILE_REMOTE=2
+};
+
+typedef struct
+{
+  enum enum_file_type type;
+  void *ptr;
+} MA_FILE;
+
+#ifdef HAVE_REMOTEIO
+struct st_rio_methods {
+  MA_FILE *(*mopen)(const char *url, const char *mode);
+  int (*mclose)(MA_FILE *ptr);
+  int (*mfeof)(MA_FILE *file);
+  size_t (*mread)(void *ptr, size_t size, size_t nmemb, MA_FILE *file);
+  char * (*mgets)(char *ptr, size_t size, MA_FILE *file);
+};
+#endif
+
+/* function prototypes */
+MA_FILE *ma_open(const char *location, const char *mode, MYSQL *mysql);
+int ma_close(MA_FILE *file);
+int ma_feof(MA_FILE *file);
+size_t ma_read(void *ptr, size_t size, size_t nmemb, MA_FILE *file);
+char *ma_gets(char *ptr, size_t size, MA_FILE *file);
+
+#endif

+ 469 - 0
mariadb.mod/include/mariadb_com.h

@@ -0,0 +1,469 @@
+/************************************************************************************
+    Copyright (C) 2000, 2012 MySQL AB & MySQL Finland AB & TCX DataKonsult AB,
+                 Monty Program AB
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not see <http://www.gnu.org/licenses>
+   or write to the Free Software Foundation, Inc., 
+   51 Franklin St., Fifth Floor, Boston, MA 02110, USA
+
+   Part of this code includes code from the PHP project which
+   is freely available from http://www.php.net
+*************************************************************************************/
+
+/*
+** Common definition between mysql server & client
+*/
+
+#ifndef _mysql_com_h
+#define _mysql_com_h
+
+
+#define NAME_CHAR_LEN   64
+#define NAME_LEN	256		/* Field/table name length */
+#define HOSTNAME_LENGTH 255
+#define SYSTEM_MB_MAX_CHAR_LENGTH 4
+#define USERNAME_CHAR_LENGTH 128
+#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH * SYSTEM_MB_MAX_CHAR_LENGTH)
+#define SERVER_VERSION_LENGTH 60
+#define SQLSTATE_LENGTH 5
+#define SCRAMBLE_LENGTH 20
+#define SCRAMBLE_LENGTH_323 8
+
+#define LOCAL_HOST	"localhost"
+#define LOCAL_HOST_NAMEDPIPE "."
+
+#if defined(_WIN32) && !defined( _CUSTOMCONFIG_)
+#define MARIADB_NAMEDPIPE "MySQL"
+#define MYSQL_SERVICENAME "MySql"
+#endif /* _WIN32 */
+
+/* for use in mysql client tools only */
+#define MYSQL_AUTODETECT_CHARSET_NAME "auto"
+#define BINCMP_FLAG       131072
+
+enum mysql_enum_shutdown_level
+{
+  SHUTDOWN_DEFAULT = 0,
+  KILL_QUERY= 254,
+  KILL_CONNECTION= 255
+};
+
+enum enum_server_command
+{
+  COM_SLEEP = 0,
+  COM_QUIT,
+  COM_INIT_DB,
+  COM_QUERY,
+  COM_FIELD_LIST,
+  COM_CREATE_DB,
+  COM_DROP_DB,
+  COM_REFRESH,
+  COM_SHUTDOWN,
+  COM_STATISTICS,
+  COM_PROCESS_INFO,
+  COM_CONNECT,
+  COM_PROCESS_KILL,
+  COM_DEBUG,
+  COM_PING,
+  COM_TIME = 15,
+  COM_DELAYED_INSERT,
+  COM_CHANGE_USER,
+  COM_BINLOG_DUMP,
+  COM_TABLE_DUMP,
+  COM_CONNECT_OUT = 20,
+  COM_REGISTER_SLAVE,
+  COM_STMT_PREPARE = 22,
+  COM_STMT_EXECUTE = 23,
+  COM_STMT_SEND_LONG_DATA = 24,
+  COM_STMT_CLOSE = 25,
+  COM_STMT_RESET = 26,
+  COM_SET_OPTION = 27,
+  COM_STMT_FETCH = 28,
+  COM_DAEMON= 29,
+  COM_UNSUPPORTED= 30,
+  COM_RESET_CONNECTION = 31,
+  COM_STMT_BULK_EXECUTE = 250,
+  COM_RESERVED_1 = 254, /* former COM_MULTI, now removed */
+  COM_END
+};
+
+
+#define NOT_NULL_FLAG	1		/* Field can't be NULL */
+#define PRI_KEY_FLAG	2		/* Field is part of a primary key */
+#define UNIQUE_KEY_FLAG 4		/* Field is part of a unique key */
+#define MULTIPLE_KEY_FLAG 8		/* Field is part of a key */
+#define BLOB_FLAG	16		/* Field is a blob */
+#define UNSIGNED_FLAG	32		/* Field is unsigned */
+#define ZEROFILL_FLAG	64		/* Field is zerofill */
+#define BINARY_FLAG	128
+/* The following are only sent to new clients */
+#define ENUM_FLAG	256		/* field is an enum */
+#define AUTO_INCREMENT_FLAG 512		/* field is a autoincrement field */
+#define TIMESTAMP_FLAG	1024		/* Field is a timestamp */
+#define SET_FLAG	2048		/* field is a set */
+/* new since 3.23.58 */
+#define NO_DEFAULT_VALUE_FLAG 4096	/* Field doesn't have default value */
+#define ON_UPDATE_NOW_FLAG 8192         /* Field is set to NOW on UPDATE */
+/* end new */
+#define NUM_FLAG	32768		/* Field is num (for clients) */
+#define PART_KEY_FLAG	16384		/* Intern; Part of some key */
+#define GROUP_FLAG	32768		/* Intern: Group field */
+#define UNIQUE_FLAG	65536		/* Intern: Used by sql_yacc */
+
+#define REFRESH_GRANT		1	/* Refresh grant tables */
+#define REFRESH_LOG		2	/* Start on new log file */
+#define REFRESH_TABLES		4	/* close all tables */
+#define REFRESH_HOSTS		8	/* Flush host cache */
+#define REFRESH_STATUS		16	/* Flush status variables */
+#define REFRESH_THREADS		32	/* Flush thread cache */
+#define REFRESH_SLAVE           64      /* Reset master info and restart slave
+					   thread */
+#define REFRESH_MASTER          128     /* Remove all bin logs in the index
+					   and truncate the index */
+
+/* The following can't be set with mysql_refresh() */
+#define REFRESH_READ_LOCK	16384	/* Lock tables for read */
+#define REFRESH_FAST		32768	/* Intern flag */
+
+#define CLIENT_MYSQL          1
+#define CLIENT_FOUND_ROWS	    2	/* Found instead of affected rows */
+#define CLIENT_LONG_FLAG	    4	/* Get all column flags */
+#define CLIENT_CONNECT_WITH_DB	    8	/* One can specify db on connect */
+#define CLIENT_NO_SCHEMA	   16	/* Don't allow database.table.column */
+#define CLIENT_COMPRESS		   32	/* Can use compression protocol */
+#define CLIENT_ODBC		   64	/* Odbc client */
+#define CLIENT_LOCAL_FILES	  128	/* Can use LOAD DATA LOCAL */
+#define CLIENT_IGNORE_SPACE	  256	/* Ignore spaces before '(' */
+#define CLIENT_INTERACTIVE	  1024	/* This is an interactive client */
+#define CLIENT_SSL                2048     /* Switch to SSL after handshake */
+#define CLIENT_IGNORE_SIGPIPE     4096     /* IGNORE sigpipes */
+#define CLIENT_TRANSACTIONS	  8192	/* Client knows about transactions */
+/* added in 4.x */
+#define CLIENT_PROTOCOL_41         512
+#define CLIENT_RESERVED          16384
+#define CLIENT_SECURE_CONNECTION 32768  
+#define CLIENT_MULTI_STATEMENTS  (1UL << 16)
+#define CLIENT_MULTI_RESULTS     (1UL << 17)
+#define CLIENT_PS_MULTI_RESULTS  (1UL << 18)
+#define CLIENT_PLUGIN_AUTH       (1UL << 19)
+#define CLIENT_CONNECT_ATTRS     (1UL << 20)
+#define CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA (1UL << 21)
+#define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22)
+#define CLIENT_SESSION_TRACKING  (1UL << 23)
+#define CLIENT_PROGRESS          (1UL << 29) /* client supports progress indicator */
+#define CLIENT_PROGRESS_OBSOLETE  CLIENT_PROGRESS 
+#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30)
+#define CLIENT_REMEMBER_OPTIONS  (1UL << 31)
+
+/* MariaDB specific capabilities */
+#define MARIADB_CLIENT_FLAGS 0xFFFFFFFF00000000ULL
+#define MARIADB_CLIENT_PROGRESS (1ULL << 32)
+#define MARIADB_CLIENT_RESERVED_1 (1ULL << 33) /* Former COM_MULTI, don't use */
+#define MARIADB_CLIENT_STMT_BULK_OPERATIONS (1ULL << 34)
+/* support of extended data type/format information, since 10.5.0 */
+#define MARIADB_CLIENT_EXTENDED_METADATA (1ULL << 35)
+/* Do not resend metadata for prepared statements, since 10.6*/
+#define MARIADB_CLIENT_CACHE_METADATA (1ULL << 36)
+
+#define IS_MARIADB_EXTENDED_SERVER(mysql)\
+        (!(mysql->server_capabilities & CLIENT_MYSQL))
+
+#define MARIADB_CLIENT_SUPPORTED_FLAGS (MARIADB_CLIENT_PROGRESS |\
+                                       MARIADB_CLIENT_STMT_BULK_OPERATIONS|\
+                                       MARIADB_CLIENT_EXTENDED_METADATA|\
+                                       MARIADB_CLIENT_CACHE_METADATA)
+
+#define CLIENT_SUPPORTED_FLAGS  (CLIENT_MYSQL |\
+                                 CLIENT_FOUND_ROWS |\
+                                 CLIENT_LONG_FLAG |\
+                                 CLIENT_CONNECT_WITH_DB |\
+                                 CLIENT_NO_SCHEMA |\
+                                 CLIENT_COMPRESS |\
+                                 CLIENT_ODBC |\
+                                 CLIENT_LOCAL_FILES |\
+                                 CLIENT_IGNORE_SPACE |\
+                                 CLIENT_INTERACTIVE |\
+                                 CLIENT_SSL |\
+                                 CLIENT_IGNORE_SIGPIPE |\
+                                 CLIENT_TRANSACTIONS |\
+                                 CLIENT_PROTOCOL_41 |\
+                                 CLIENT_RESERVED |\
+                                 CLIENT_SECURE_CONNECTION |\
+                                 CLIENT_MULTI_STATEMENTS |\
+                                 CLIENT_MULTI_RESULTS |\
+                                 CLIENT_PROGRESS |\
+		                 CLIENT_SSL_VERIFY_SERVER_CERT |\
+                                 CLIENT_REMEMBER_OPTIONS |\
+                                 CLIENT_PLUGIN_AUTH |\
+                                 CLIENT_SESSION_TRACKING |\
+                                 CLIENT_CONNECT_ATTRS)
+#define CLIENT_CAPABILITIES	    (CLIENT_MYSQL | \
+                                 CLIENT_LONG_FLAG |\
+                                 CLIENT_TRANSACTIONS |\
+                                 CLIENT_SECURE_CONNECTION |\
+                                 CLIENT_MULTI_RESULTS | \
+                                 CLIENT_PS_MULTI_RESULTS |\
+                                 CLIENT_PROTOCOL_41 |\
+                                 CLIENT_PLUGIN_AUTH |\
+                                 CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | \
+                                 CLIENT_SESSION_TRACKING |\
+                                 CLIENT_CONNECT_ATTRS)
+
+#define CLIENT_DEFAULT_FLAGS ((CLIENT_SUPPORTED_FLAGS & ~CLIENT_COMPRESS)\
+                                                      & ~CLIENT_SSL)
+
+#define SERVER_STATUS_IN_TRANS               1	/* Transaction has started */
+#define SERVER_STATUS_AUTOCOMMIT             2	/* Server in auto_commit mode */
+#define SERVER_MORE_RESULTS_EXIST            8
+#define SERVER_QUERY_NO_GOOD_INDEX_USED     16
+#define SERVER_QUERY_NO_INDEX_USED          32
+#define SERVER_STATUS_CURSOR_EXISTS         64
+#define SERVER_STATUS_LAST_ROW_SENT        128
+#define SERVER_STATUS_DB_DROPPED           256 
+#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512
+#define SERVER_STATUS_METADATA_CHANGED    1024
+#define SERVER_QUERY_WAS_SLOW             2048
+#define SERVER_PS_OUT_PARAMS              4096
+#define SERVER_STATUS_IN_TRANS_READONLY   8192
+#define SERVER_SESSION_STATE_CHANGED     16384
+#define SERVER_STATUS_ANSI_QUOTES        32768
+
+#define MYSQL_ERRMSG_SIZE	512
+#define NET_READ_TIMEOUT	30		/* Timeout on read */
+#define NET_WRITE_TIMEOUT	60		/* Timeout on write */
+#define NET_WAIT_TIMEOUT	(8*60*60)	/* Wait for new query */
+
+/* for server integration (mysqlbinlog) */
+#define LIST_PROCESS_HOST_LEN 64
+#define MYSQL50_TABLE_NAME_PREFIX         "#mysql50#"
+#define MYSQL50_TABLE_NAME_PREFIX_LENGTH  (sizeof(MYSQL50_TABLE_NAME_PREFIX)-1)
+#define SAFE_NAME_LEN (NAME_LEN + MYSQL50_TABLE_NAME_PREFIX_LENGTH)
+
+struct st_ma_pvio;
+typedef struct st_ma_pvio MARIADB_PVIO;
+
+#define MAX_CHAR_WIDTH		255	/* Max length for a CHAR column */
+#define MAX_BLOB_WIDTH		8192	/* Default width for blob */
+
+/* the following defines were added for PHP's mysqli and pdo extensions: 
+   see: CONC-56
+*/
+#define MAX_TINYINT_WIDTH     3
+#define MAX_SMALLINT_WIDTH    5
+#define MAX_MEDIUMINT_WIDTH   8
+#define MAX_INT_WIDTH        10
+#define MAX_BIGINT_WIDTH     20
+
+struct st_ma_connection_plugin;
+
+
+typedef struct st_net {
+  MARIADB_PVIO *pvio;
+  unsigned char *buff;
+  unsigned char *buff_end,*write_pos,*read_pos;
+  my_socket fd;					/* For Perl DBI/dbd */
+  unsigned long remain_in_buf,length;
+  unsigned long buf_length, where_b;
+  unsigned long max_packet, max_packet_size;
+  unsigned int pkt_nr, compress_pkt_nr;
+  unsigned int write_timeout, read_timeout, retry_count;
+  int fcntl;
+  unsigned int *return_status;
+  unsigned char reading_or_writing;
+  char save_char;
+  char unused_1;
+  my_bool unused_2;
+  my_bool compress;
+  my_bool unused_3;
+  void *unused_4;
+  unsigned int last_errno;
+  unsigned char error;
+  my_bool unused_5;
+  my_bool unused_6;
+  char last_error[MYSQL_ERRMSG_SIZE];
+  char sqlstate[SQLSTATE_LENGTH+1];
+  struct st_mariadb_net_extension *extension;
+} NET;
+
+#define packet_error ((unsigned int) -1)
+
+/* used by mysql_set_server_option */
+enum enum_mysql_set_option
+{
+  MYSQL_OPTION_MULTI_STATEMENTS_ON,
+  MYSQL_OPTION_MULTI_STATEMENTS_OFF
+};
+
+enum enum_session_state_type
+{
+  SESSION_TRACK_SYSTEM_VARIABLES= 0,
+  SESSION_TRACK_SCHEMA,
+  SESSION_TRACK_STATE_CHANGE,
+  /* currently not supported by MariaDB Server */
+  SESSION_TRACK_GTIDS,
+  SESSION_TRACK_TRANSACTION_CHARACTERISTICS,
+  SESSION_TRACK_TRANSACTION_STATE /* make sure that SESSION_TRACK_END always points
+                                    to last element of enum !! */
+};
+
+#define SESSION_TRACK_BEGIN 0
+#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE
+#define SESSION_TRACK_TYPES (SESSION_TRACK_END + 1)
+
+/* SESSION_TRACK_TRANSACTION_TYPE was renamed to SESSION_TRACK_TRANSACTION_STATE
+   in 3e699a1738cdfb0a2c5b8eabfa8301b8d11cf711.
+   This is a workaround to prevent breaking of travis and buildbot tests.
+   TODO: Remove this after server fixes */
+#define SESSION_TRACK_TRANSACTION_TYPE SESSION_TRACK_TRANSACTION_STATE
+
+enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
+                        MYSQL_TYPE_SHORT,  MYSQL_TYPE_LONG,
+                        MYSQL_TYPE_FLOAT,  MYSQL_TYPE_DOUBLE,
+                        MYSQL_TYPE_NULL,   MYSQL_TYPE_TIMESTAMP,
+                        MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
+                        MYSQL_TYPE_DATE,   MYSQL_TYPE_TIME,
+                        MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
+                        MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
+                        MYSQL_TYPE_BIT,
+                        /*
+                          the following types are not used by client,
+                          only for mysqlbinlog!!
+                        */
+                        MYSQL_TYPE_TIMESTAMP2,
+                        MYSQL_TYPE_DATETIME2,
+                        MYSQL_TYPE_TIME2,
+                        /* --------------------------------------------- */
+                        MYSQL_TYPE_JSON=245,
+                        MYSQL_TYPE_NEWDECIMAL=246,
+                        MYSQL_TYPE_ENUM=247,
+                        MYSQL_TYPE_SET=248,
+                        MYSQL_TYPE_TINY_BLOB=249,
+                        MYSQL_TYPE_MEDIUM_BLOB=250,
+                        MYSQL_TYPE_LONG_BLOB=251,
+                        MYSQL_TYPE_BLOB=252,
+                        MYSQL_TYPE_VAR_STRING=253,
+                        MYSQL_TYPE_STRING=254,
+                        MYSQL_TYPE_GEOMETRY=255,
+                        MAX_NO_FIELD_TYPES };
+
+#define FIELD_TYPE_CHAR FIELD_TYPE_TINY		/* For compatibility */
+#define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM	/* For compatibility */
+#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL
+#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL
+#define FIELD_TYPE_TINY MYSQL_TYPE_TINY
+#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT
+#define FIELD_TYPE_LONG MYSQL_TYPE_LONG
+#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT
+#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE
+#define FIELD_TYPE_NULL MYSQL_TYPE_NULL
+#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP
+#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG
+#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24
+#define FIELD_TYPE_DATE MYSQL_TYPE_DATE
+#define FIELD_TYPE_TIME MYSQL_TYPE_TIME
+#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME
+#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR
+#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE
+#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM
+#define FIELD_TYPE_SET MYSQL_TYPE_SET
+#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB
+#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB
+#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB
+#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB
+#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING
+#define FIELD_TYPE_STRING MYSQL_TYPE_STRING
+#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY
+#define FIELD_TYPE_BIT MYSQL_TYPE_BIT
+
+extern unsigned long max_allowed_packet;
+extern unsigned long net_buffer_length;
+
+#define net_new_transaction(net) ((net)->pkt_nr=0)
+
+int	ma_net_init(NET *net, MARIADB_PVIO *pvio);
+void	ma_net_end(NET *net);
+void	ma_net_clear(NET *net);
+int	ma_net_flush(NET *net);
+int	ma_net_write(NET *net,const unsigned char *packet, size_t len);
+int	ma_net_write_command(NET *net,unsigned char command,const char *packet,
+			  size_t len, my_bool disable_flush);
+int	ma_net_real_write(NET *net,const char *packet, size_t len);
+extern unsigned long ma_net_read(NET *net);
+
+struct rand_struct {
+  unsigned long seed1,seed2,max_value;
+  double max_value_dbl;
+};
+
+  /* The following is for user defined functions */
+
+enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT,ROW_RESULT,DECIMAL_RESULT};
+
+typedef struct st_udf_args
+{
+  unsigned int arg_count;		/* Number of arguments */
+  enum Item_result *arg_type;		/* Pointer to item_results */
+  char **args;				/* Pointer to argument */
+  unsigned long *lengths;		/* Length of string arguments */
+  char *maybe_null;			/* Set to 1 for all maybe_null args */
+} UDF_ARGS;
+
+  /* This holds information about the result */
+
+typedef struct st_udf_init
+{
+  my_bool maybe_null;			/* 1 if function can return NULL */
+  unsigned int decimals;		/* for real functions */
+  unsigned int max_length;		/* For string functions */
+  char	  *ptr;				/* free pointer for function data */
+  my_bool const_item;			/* 0 if result is independent of arguments */
+} UDF_INIT;
+
+/* Connection types */
+#define MARIADB_CONNECTION_UNIXSOCKET   0
+#define MARIADB_CONNECTION_TCP          1
+#define MARIADB_CONNECTION_NAMEDPIPE    2
+#define MARIADB_CONNECTION_SHAREDMEM    3
+
+  /* Constants when using compression */
+#define NET_HEADER_SIZE 4		/* standard header size */
+#define COMP_HEADER_SIZE 3		/* compression header extra size */
+
+  /* Prototypes to password functions */
+#define native_password_plugin_name "mysql_native_password"
+#define old_password_plugin_name    "mysql_old_password"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+char *ma_scramble_323(char *to,const char *message,const char *password);
+void ma_scramble_41(const unsigned char *buffer, const char *scramble, const char *password);
+void ma_hash_password(unsigned long *result, const char *password, size_t len);
+void ma_make_scrambled_password(char *to,const char *password);
+
+/* Some other useful functions */
+
+void mariadb_load_defaults(const char *conf_file, const char **groups,
+		   int *argc, char ***argv);
+my_bool ma_thread_init(void);
+void ma_thread_end(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
+
+#endif

+ 76 - 0
mariadb.mod/include/mariadb_ctype.h

@@ -0,0 +1,76 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+/*
+  A better implementation of the UNIX ctype(3) library.
+  Notes:   my_global.h should be included before ctype.h
+*/
+
+#ifndef _mariadb_ctype_h
+#define _mariadb_ctype_h
+
+#include <ctype.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#define CHARSET_DIR	"charsets/"
+#define MY_CS_NAME_SIZE 32
+
+#define MADB_DEFAULT_CHARSET_NAME "latin1"
+#define MADB_DEFAULT_COLLATION_NAME "latin1_swedish_ci"
+#define MADB_AUTODETECT_CHARSET_NAME "auto"
+
+/* we use the mysqlnd implementation */
+typedef struct ma_charset_info_st
+{
+  unsigned int	nr; /* so far only 1 byte for charset */
+  unsigned int  state;
+  const char	*csname;
+  const char	*name;
+  const char  *dir;
+  unsigned int codepage;
+  const char  *encoding;
+  unsigned int	char_minlen;
+  unsigned int	char_maxlen;
+  unsigned int 	(*mb_charlen)(unsigned int c);
+  unsigned int 	(*mb_valid)(const char *start, const char *end);
+} MARIADB_CHARSET_INFO;
+
+extern const MARIADB_CHARSET_INFO  mariadb_compiled_charsets[];
+extern MARIADB_CHARSET_INFO *ma_default_charset_info;
+extern MARIADB_CHARSET_INFO *ma_charset_bin;
+extern MARIADB_CHARSET_INFO *ma_charset_latin1;
+extern MARIADB_CHARSET_INFO *ma_charset_utf8_general_ci;
+extern MARIADB_CHARSET_INFO *ma_charset_utf16le_general_ci;
+
+MARIADB_CHARSET_INFO *find_compiled_charset(unsigned int cs_number);
+MARIADB_CHARSET_INFO *find_compiled_charset_by_name(const char *name);
+
+size_t mysql_cset_escape_quotes(const MARIADB_CHARSET_INFO *cset, char *newstr,  const char *escapestr, size_t escapestr_len);
+size_t mysql_cset_escape_slashes(const MARIADB_CHARSET_INFO *cset, char *newstr, const char *escapestr, size_t escapestr_len);
+const char* madb_get_os_character_set(void);
+#ifdef _WIN32
+int madb_get_windows_cp(const char *charset);
+#endif
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif

+ 259 - 0
mariadb.mod/include/mariadb_dyncol.h

@@ -0,0 +1,259 @@
+/* Copyright (c) 2011, Monty Program Ab
+   Copyright (c) 2011, Oleksandr Byelkin
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are
+   met:
+
+   1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   2. Redistributions in binary form must the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND ANY
+   EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   SUCH DAMAGE.
+*/
+
+#ifndef ma_dyncol_h
+#define ma_dyncol_h
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifndef LIBMARIADB
+#include <decimal.h>
+#include <my_decimal_limits.h>
+#endif
+#include <mysql.h>
+
+#ifndef longlong_defined
+#if defined(HAVE_LONG_LONG) && SIZEOF_LONG != 8
+typedef unsigned long long int ulonglong; /* ulong or unsigned long long */
+typedef long long int longlong;
+#else
+typedef unsigned long	ulonglong;	/* ulong or unsigned long long */
+typedef long		longlong;
+#endif
+#define longlong_defined
+#endif
+
+
+#ifndef _my_sys_h
+typedef struct st_dynamic_string
+{
+  char *str;
+  size_t length,max_length,alloc_increment;
+} DYNAMIC_STRING;
+#endif
+
+struct st_mysql_lex_string
+{
+  char *str;
+  size_t length;
+};
+typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
+typedef struct st_mysql_lex_string LEX_STRING;
+/*
+  Limits of implementation
+*/
+#define MAX_TOTAL_NAME_LENGTH 65535
+#define MAX_NAME_LENGTH (MAX_TOTAL_NAME_LENGTH/4)
+
+/* NO and OK is the same used just to show semantics */
+#define ER_DYNCOL_NO ER_DYNCOL_OK
+
+enum enum_dyncol_func_result
+{
+  ER_DYNCOL_OK= 0,
+  ER_DYNCOL_YES= 1,                /* For functions returning 0/1 */
+  ER_DYNCOL_FORMAT= -1,            /* Wrong format of the encoded string */
+  ER_DYNCOL_LIMIT=  -2,            /* Some limit reached */
+  ER_DYNCOL_RESOURCE= -3,          /* Out of resourses */
+  ER_DYNCOL_DATA= -4,              /* Incorrect input data */
+  ER_DYNCOL_UNKNOWN_CHARSET= -5,   /* Unknown character set */
+  ER_DYNCOL_TRUNCATED= 2           /* OK, but data was truncated */
+};
+
+typedef DYNAMIC_STRING DYNAMIC_COLUMN;
+
+enum enum_dynamic_column_type
+{
+  DYN_COL_NULL= 0,
+  DYN_COL_INT,
+  DYN_COL_UINT,
+  DYN_COL_DOUBLE,
+  DYN_COL_STRING,
+  DYN_COL_DECIMAL,
+  DYN_COL_DATETIME,
+  DYN_COL_DATE,
+  DYN_COL_TIME,
+  DYN_COL_DYNCOL
+};
+
+typedef enum enum_dynamic_column_type DYNAMIC_COLUMN_TYPE;
+
+struct st_dynamic_column_value
+{
+  DYNAMIC_COLUMN_TYPE type;
+  union
+  {
+    long long long_value;
+    unsigned long long ulong_value;
+    double double_value;
+    struct {
+      MYSQL_LEX_STRING value;
+      MARIADB_CHARSET_INFO *charset;
+    } string;
+#ifndef LIBMARIADB
+    struct {
+      decimal_digit_t buffer[DECIMAL_BUFF_LENGTH];
+      decimal_t value;
+    } decimal;
+#endif
+    MYSQL_TIME time_value;
+  } x;
+};
+
+typedef struct st_dynamic_column_value DYNAMIC_COLUMN_VALUE;
+
+#ifdef MADYNCOL_DEPRECATED
+enum enum_dyncol_func_result
+dynamic_column_create(DYNAMIC_COLUMN *str,
+                      uint column_nr, DYNAMIC_COLUMN_VALUE *value);
+
+enum enum_dyncol_func_result
+dynamic_column_create_many(DYNAMIC_COLUMN *str,
+                           uint column_count,
+                           uint *column_numbers,
+                           DYNAMIC_COLUMN_VALUE *values);
+enum enum_dyncol_func_result
+dynamic_column_update(DYNAMIC_COLUMN *org, uint column_nr,
+                      DYNAMIC_COLUMN_VALUE *value);
+enum enum_dyncol_func_result
+dynamic_column_update_many(DYNAMIC_COLUMN *str,
+                           uint add_column_count,
+                           uint *column_numbers,
+                           DYNAMIC_COLUMN_VALUE *values);
+
+enum enum_dyncol_func_result
+dynamic_column_exists(DYNAMIC_COLUMN *org, uint column_nr);
+
+enum enum_dyncol_func_result
+dynamic_column_list(DYNAMIC_COLUMN *org, DYNAMIC_ARRAY *array_of_uint);
+
+enum enum_dyncol_func_result
+dynamic_column_get(DYNAMIC_COLUMN *org, uint column_nr,
+                   DYNAMIC_COLUMN_VALUE *store_it_here);
+#endif
+
+/* new functions */
+enum enum_dyncol_func_result
+mariadb_dyncol_create_many_num(DYNAMIC_COLUMN *str,
+                               uint column_count,
+                               uint *column_numbers,
+                               DYNAMIC_COLUMN_VALUE *values,
+                               my_bool new_string);
+enum enum_dyncol_func_result
+mariadb_dyncol_create_many_named(DYNAMIC_COLUMN *str,
+                                 uint column_count,
+                                 MYSQL_LEX_STRING *column_keys,
+                                 DYNAMIC_COLUMN_VALUE *values,
+                                 my_bool new_string);
+
+
+enum enum_dyncol_func_result
+mariadb_dyncol_update_many_num(DYNAMIC_COLUMN *str,
+                               uint add_column_count,
+                               uint *column_keys,
+                               DYNAMIC_COLUMN_VALUE *values);
+enum enum_dyncol_func_result
+mariadb_dyncol_update_many_named(DYNAMIC_COLUMN *str,
+                                 uint add_column_count,
+                                 MYSQL_LEX_STRING *column_keys,
+                                 DYNAMIC_COLUMN_VALUE *values);
+
+
+enum enum_dyncol_func_result
+mariadb_dyncol_exists_num(DYNAMIC_COLUMN *org, uint column_nr);
+enum enum_dyncol_func_result
+mariadb_dyncol_exists_named(DYNAMIC_COLUMN *str, MYSQL_LEX_STRING *name);
+
+/* List of not NULL columns */
+enum enum_dyncol_func_result
+mariadb_dyncol_list_num(DYNAMIC_COLUMN *str, uint *count, uint **nums);
+enum enum_dyncol_func_result
+mariadb_dyncol_list_named(DYNAMIC_COLUMN *str, uint *count,
+                          MYSQL_LEX_STRING **names);
+
+/*
+   if the column do not exists it is NULL
+*/
+enum enum_dyncol_func_result
+mariadb_dyncol_get_num(DYNAMIC_COLUMN *org, uint column_nr,
+                       DYNAMIC_COLUMN_VALUE *store_it_here);
+enum enum_dyncol_func_result
+mariadb_dyncol_get_named(DYNAMIC_COLUMN *str, MYSQL_LEX_STRING *name,
+                         DYNAMIC_COLUMN_VALUE *store_it_here);
+
+my_bool mariadb_dyncol_has_names(DYNAMIC_COLUMN *str);
+
+enum enum_dyncol_func_result
+mariadb_dyncol_check(DYNAMIC_COLUMN *str);
+
+enum enum_dyncol_func_result
+mariadb_dyncol_json(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json);
+
+void mariadb_dyncol_free(DYNAMIC_COLUMN *str);
+
+#define mariadb_dyncol_init(A) memset((A), 0, sizeof(DYNAMIC_COLUMN))
+#define dynamic_column_initialize(A) mariadb_dyncol_init((A))
+#define dynamic_column_column_free(A) mariadb_dyncol_free((A))
+
+/* conversion of values to 3 base types */
+enum enum_dyncol_func_result
+mariadb_dyncol_val_str(DYNAMIC_STRING *str, DYNAMIC_COLUMN_VALUE *val,
+                       MARIADB_CHARSET_INFO *cs, char quote);
+enum enum_dyncol_func_result
+mariadb_dyncol_val_long(longlong *ll, DYNAMIC_COLUMN_VALUE *val);
+enum enum_dyncol_func_result
+mariadb_dyncol_val_double(double *dbl, DYNAMIC_COLUMN_VALUE *val);
+
+enum enum_dyncol_func_result
+mariadb_dyncol_unpack(DYNAMIC_COLUMN *str,
+                      uint *count,
+                      MYSQL_LEX_STRING **names, DYNAMIC_COLUMN_VALUE **vals);
+
+int mariadb_dyncol_column_cmp_named(const MYSQL_LEX_STRING *s1,
+                                    const MYSQL_LEX_STRING *s2);
+
+enum enum_dyncol_func_result
+mariadb_dyncol_column_count(DYNAMIC_COLUMN *str, uint *column_count);
+
+#define mariadb_dyncol_value_init(V) \
+do {\
+  (V)->type= DYN_COL_NULL;\
+} while(0)
+
+/*
+  Prepare value for using as decimal
+*/
+void mariadb_dyncol_prepare_decimal(DYNAMIC_COLUMN_VALUE *value);
+
+
+#ifdef	__cplusplus
+}
+#endif
+#endif

+ 307 - 0
mariadb.mod/include/mariadb_rpl.h

@@ -0,0 +1,307 @@
+/* Copyright (C) 2018 MariaDB Corporation AB 
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+ 
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+ 
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+#ifndef _mariadb_rpl_h_
+#define _mariadb_rpl_h_
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define MARIADB_RPL_VERSION 0x0001
+#define MARIADB_RPL_REQUIRED_VERSION 0x0001
+
+/* Protocol flags */
+#define MARIADB_RPL_BINLOG_DUMP_NON_BLOCK 1
+#define MARIADB_RPL_BINLOG_SEND_ANNOTATE_ROWS 2
+#define MARIADB_RPL_IGNORE_HEARTBEAT (1 << 17)
+
+#define EVENT_HEADER_OFS 20
+
+#define FL_GROUP_COMMIT_ID 2
+#define FL_STMT_END 1
+
+#define LOG_EVENT_ARTIFICIAL_F 0x20
+
+
+/* Options */
+enum mariadb_rpl_option {
+  MARIADB_RPL_FILENAME,       /* Filename and length */
+  MARIADB_RPL_START,          /* Start position */
+  MARIADB_RPL_SERVER_ID,      /* Server ID */
+  MARIADB_RPL_FLAGS,          /* Protocol flags */
+  MARIADB_RPL_GTID_CALLBACK,  /* GTID callback function */
+  MARIADB_RPL_GTID_DATA,      /* GTID data */
+  MARIADB_RPL_BUFFER
+};
+
+/* Event types: From MariaDB Server sql/log_event.h */
+enum mariadb_rpl_event {
+  UNKNOWN_EVENT= 0,
+  START_EVENT_V3= 1,
+  QUERY_EVENT= 2,
+  STOP_EVENT= 3,
+  ROTATE_EVENT= 4,
+  INTVAR_EVENT= 5,
+  LOAD_EVENT= 6,
+  SLAVE_EVENT= 7,
+  CREATE_FILE_EVENT= 8,
+  APPEND_BLOCK_EVENT= 9,
+  EXEC_LOAD_EVENT= 10,
+  DELETE_FILE_EVENT= 11,
+  NEW_LOAD_EVENT= 12,
+  RAND_EVENT= 13,
+  USER_VAR_EVENT= 14,
+  FORMAT_DESCRIPTION_EVENT= 15,
+  XID_EVENT= 16,
+  BEGIN_LOAD_QUERY_EVENT= 17,
+  EXECUTE_LOAD_QUERY_EVENT= 18,
+  TABLE_MAP_EVENT = 19,
+
+  PRE_GA_WRITE_ROWS_EVENT = 20, /* deprecated */
+  PRE_GA_UPDATE_ROWS_EVENT = 21, /* deprecated */
+  PRE_GA_DELETE_ROWS_EVENT = 22, /* deprecated */
+
+  WRITE_ROWS_EVENT_V1 = 23,
+  UPDATE_ROWS_EVENT_V1 = 24,
+  DELETE_ROWS_EVENT_V1 = 25,
+  INCIDENT_EVENT= 26,
+  HEARTBEAT_LOG_EVENT= 27,
+  IGNORABLE_LOG_EVENT= 28,
+  ROWS_QUERY_LOG_EVENT= 29,
+  WRITE_ROWS_EVENT = 30,
+  UPDATE_ROWS_EVENT = 31,
+  DELETE_ROWS_EVENT = 32,
+  GTID_LOG_EVENT= 33,
+  ANONYMOUS_GTID_LOG_EVENT= 34,
+  PREVIOUS_GTIDS_LOG_EVENT= 35,
+  TRANSACTION_CONTEXT_EVENT= 36,
+  VIEW_CHANGE_EVENT= 37,
+  XA_PREPARE_LOG_EVENT= 38,
+
+  /*
+    Add new events here - right above this comment!
+    Existing events (except ENUM_END_EVENT) should never change their numbers
+  */
+
+  /* New MySQL/Sun events are to be added right above this comment */
+  MYSQL_EVENTS_END,
+
+  MARIA_EVENTS_BEGIN= 160,
+  ANNOTATE_ROWS_EVENT= 160,
+  BINLOG_CHECKPOINT_EVENT= 161,
+  GTID_EVENT= 162,
+  GTID_LIST_EVENT= 163,
+  START_ENCRYPTION_EVENT= 164,
+  QUERY_COMPRESSED_EVENT = 165,
+  WRITE_ROWS_COMPRESSED_EVENT_V1 = 166,
+  UPDATE_ROWS_COMPRESSED_EVENT_V1 = 167,
+  DELETE_ROWS_COMPRESSED_EVENT_V1 = 168,
+  WRITE_ROWS_COMPRESSED_EVENT = 169,
+  UPDATE_ROWS_COMPRESSED_EVENT = 170,
+  DELETE_ROWS_COMPRESSED_EVENT = 171,
+
+  /* Add new MariaDB events here - right above this comment!  */
+
+  ENUM_END_EVENT /* end marker */
+};
+
+typedef struct {
+  char *str;
+  size_t length;
+} MARIADB_STRING;
+
+enum mariadb_row_event_type {
+  WRITE_ROWS= 0,
+  UPDATE_ROWS= 1,
+  DELETE_ROWS= 2
+};
+
+/* Global transaction id */
+typedef struct st_mariadb_gtid {
+  unsigned int domain_id;
+  unsigned int server_id;
+  unsigned long long sequence_nr;
+} MARIADB_GTID;
+
+/* Generic replication handle */
+typedef struct st_mariadb_rpl {
+  unsigned int version;
+  MYSQL *mysql;
+  char *filename;
+  uint32_t filename_length;
+  unsigned char *buffer;
+  unsigned long buffer_size;
+  uint32_t server_id;
+  unsigned long start_position;
+  uint32_t flags;
+  uint8_t fd_header_len; /* header len from last format description event */
+  uint8_t use_checksum;
+} MARIADB_RPL;
+
+/* Event header */
+struct st_mariadb_rpl_rotate_event {
+  unsigned long long position;
+  MARIADB_STRING filename;
+};
+
+struct st_mariadb_rpl_query_event {
+  uint32_t thread_id;
+  uint32_t seconds;
+  MARIADB_STRING database;
+  uint32_t errornr;
+  MARIADB_STRING status;
+  MARIADB_STRING statement;
+};
+
+struct st_mariadb_rpl_gtid_list_event {
+  uint32_t gtid_cnt;
+  MARIADB_GTID *gtid;
+};
+
+struct st_mariadb_rpl_format_description_event
+{
+  uint16_t format;
+  char *server_version;
+  uint32_t timestamp;
+  uint8_t header_len;
+};
+
+struct st_mariadb_rpl_checkpoint_event {
+  MARIADB_STRING filename;
+};
+
+struct st_mariadb_rpl_xid_event {
+  uint64_t transaction_nr;
+};
+
+struct st_mariadb_rpl_gtid_event {
+  uint64_t sequence_nr;
+  uint32_t domain_id;
+  uint8_t flags;
+  uint64_t commit_id;
+};
+
+struct st_mariadb_rpl_annotate_rows_event {
+  MARIADB_STRING statement;
+};
+
+struct st_mariadb_rpl_table_map_event {
+  unsigned long long table_id;
+  MARIADB_STRING database;
+  MARIADB_STRING table;
+  unsigned int column_count;
+  MARIADB_STRING column_types;
+  MARIADB_STRING metadata;
+  char *null_indicator;
+};
+
+struct st_mariadb_rpl_rand_event {
+  unsigned long long first_seed;
+  unsigned long long second_seed;
+};
+
+struct st_mariadb_rpl_encryption_event {
+  char scheme;
+  unsigned int key_version;
+  char *nonce;
+};
+
+struct st_mariadb_rpl_intvar_event {
+  char type;
+  unsigned long long value;
+};
+
+struct st_mariadb_rpl_uservar_event {
+  MARIADB_STRING name;
+  uint8_t is_null;
+  uint8_t type;
+  uint32_t charset_nr;
+  MARIADB_STRING value;
+  uint8_t flags;
+};
+
+struct st_mariadb_rpl_rows_event {
+  enum mariadb_row_event_type type;
+  uint64_t table_id;
+  uint16_t flags;
+  uint32_t column_count;
+  char *column_bitmap;
+  char *column_update_bitmap;
+  size_t row_data_size;
+  void *row_data;
+  size_t extra_data_size;
+  void *extra_data;
+};
+
+struct st_mariadb_rpl_heartbeat_event {
+  uint32_t timestamp;
+  uint32_t next_position;
+  uint8_t type;
+  uint16_t flags;
+};
+
+typedef struct st_mariadb_rpl_event
+{
+  /* common header */
+  MA_MEM_ROOT memroot;
+  unsigned int checksum;
+  char ok;
+  enum mariadb_rpl_event event_type;
+  unsigned int timestamp;
+  unsigned int server_id;
+  unsigned int event_length;
+  unsigned int next_event_pos;
+  unsigned short flags;
+  /****************/
+  union {
+    struct st_mariadb_rpl_rotate_event rotate;
+    struct st_mariadb_rpl_query_event query;
+    struct st_mariadb_rpl_format_description_event format_description;
+    struct st_mariadb_rpl_gtid_list_event gtid_list;
+    struct st_mariadb_rpl_checkpoint_event checkpoint;
+    struct st_mariadb_rpl_xid_event xid;
+    struct st_mariadb_rpl_gtid_event gtid;
+    struct st_mariadb_rpl_annotate_rows_event annotate_rows;
+    struct st_mariadb_rpl_table_map_event table_map;
+    struct st_mariadb_rpl_rand_event rand;
+    struct st_mariadb_rpl_encryption_event encryption;
+    struct st_mariadb_rpl_intvar_event intvar;
+    struct st_mariadb_rpl_uservar_event uservar;
+    struct st_mariadb_rpl_rows_event rows;
+    struct st_mariadb_rpl_heartbeat_event heartbeat;
+  } event;
+} MARIADB_RPL_EVENT;
+
+#define mariadb_rpl_init(a) mariadb_rpl_init_ex((a), MARIADB_RPL_VERSION)
+
+/* Function prototypes */
+MARIADB_RPL * STDCALL mariadb_rpl_init_ex(MYSQL *mysql, unsigned int version);
+
+int mariadb_rpl_optionsv(MARIADB_RPL *rpl, enum mariadb_rpl_option, ...);
+int mariadb_rpl_get_optionsv(MARIADB_RPL *rpl, enum mariadb_rpl_option, ...);
+
+int STDCALL mariadb_rpl_open(MARIADB_RPL *rpl);
+void STDCALL mariadb_rpl_close(MARIADB_RPL *rpl);
+MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVENT *event);
+void STDCALL mariadb_free_rpl_event(MARIADB_RPL_EVENT *event);
+
+#ifdef	__cplusplus
+}
+#endif
+#endif

+ 259 - 0
mariadb.mod/include/mariadb_stmt.h

@@ -0,0 +1,259 @@
+/************************************************************************
+  
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA 
+
+   Part of this code includes code from PHP's mysqlnd extension
+   (written by Andrey Hristov, Georg Richter and Ulf Wendel), freely
+   available from http://www.php.net/software
+
+*************************************************************************/
+
+#define MYSQL_NO_DATA 100
+#define MYSQL_DATA_TRUNCATED 101
+#define MYSQL_DEFAULT_PREFETCH_ROWS (unsigned long) 1
+
+/* Bind flags */
+#define MADB_BIND_DUMMY 1
+
+#define MARIADB_STMT_BULK_SUPPORTED(stmt)\
+  ((stmt)->mysql && \
+  (!((stmt)->mysql->server_capabilities & CLIENT_MYSQL) &&\
+    ((stmt)->mysql->extension->mariadb_server_capabilities & \
+    (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))))
+
+#define SET_CLIENT_STMT_ERROR(a, b, c, d) \
+do { \
+  (a)->last_errno= (b);\
+  strncpy((a)->sqlstate, (c), SQLSTATE_LENGTH);\
+  (a)->sqlstate[SQLSTATE_LENGTH]= 0;\
+  strncpy((a)->last_error, (d) ? (d) : ER((b)), MYSQL_ERRMSG_SIZE);\
+  (a)->last_error[MYSQL_ERRMSG_SIZE - 1]= 0;\
+} while (0)
+
+#define CLEAR_CLIENT_STMT_ERROR(a) \
+do { \
+  (a)->last_errno= 0;\
+  strcpy((a)->sqlstate, "00000");\
+  (a)->last_error[0]= 0;\
+} while (0)
+
+#define MYSQL_PS_SKIP_RESULT_W_LEN  -1
+#define MYSQL_PS_SKIP_RESULT_STR    -2
+#define STMT_ID_LENGTH 4
+
+
+typedef struct st_mysql_stmt MYSQL_STMT;
+
+typedef MYSQL_RES* (*mysql_stmt_use_or_store_func)(MYSQL_STMT *);
+
+enum enum_stmt_attr_type
+{
+  STMT_ATTR_UPDATE_MAX_LENGTH,
+  STMT_ATTR_CURSOR_TYPE,
+  STMT_ATTR_PREFETCH_ROWS,
+
+  /* MariaDB only */
+  STMT_ATTR_PREBIND_PARAMS=200,
+  STMT_ATTR_ARRAY_SIZE,
+  STMT_ATTR_ROW_SIZE,
+  STMT_ATTR_STATE,
+  STMT_ATTR_CB_USER_DATA,
+  STMT_ATTR_CB_PARAM,
+  STMT_ATTR_CB_RESULT
+};
+
+enum enum_cursor_type
+{
+  CURSOR_TYPE_NO_CURSOR= 0,
+  CURSOR_TYPE_READ_ONLY= 1,
+  CURSOR_TYPE_FOR_UPDATE= 2,
+  CURSOR_TYPE_SCROLLABLE= 4
+};
+
+enum enum_indicator_type
+{
+  STMT_INDICATOR_NTS=-1,
+  STMT_INDICATOR_NONE=0,
+  STMT_INDICATOR_NULL=1,
+  STMT_INDICATOR_DEFAULT=2,
+  STMT_INDICATOR_IGNORE=3,
+  STMT_INDICATOR_IGNORE_ROW=4
+};
+
+/*
+  bulk PS flags
+*/
+#define STMT_BULK_FLAG_CLIENT_SEND_TYPES 128
+#define STMT_BULK_FLAG_INSERT_ID_REQUEST 64
+
+typedef enum mysql_stmt_state
+{
+  MYSQL_STMT_INITTED = 0,
+  MYSQL_STMT_PREPARED,
+  MYSQL_STMT_EXECUTED,
+  MYSQL_STMT_WAITING_USE_OR_STORE,
+  MYSQL_STMT_USE_OR_STORE_CALLED,
+  MYSQL_STMT_USER_FETCHING, /* fetch_row_buff or fetch_row_unbuf */
+  MYSQL_STMT_FETCH_DONE
+} enum_mysqlnd_stmt_state;
+
+typedef struct st_mysql_bind
+{
+  unsigned long  *length;          /* output length pointer */
+  my_bool        *is_null;         /* Pointer to null indicator */
+  void           *buffer;          /* buffer to get/put data */
+  /* set this if you want to track data truncations happened during fetch */
+  my_bool        *error;
+  union {
+    unsigned char *row_ptr;        /* for the current data position */
+    char *indicator;               /* indicator variable */
+  } u;
+  void (*store_param_func)(NET *net, struct st_mysql_bind *param);
+  void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+                       unsigned char **row);
+  void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+          unsigned char **row);
+  /* output buffer length, must be set when fetching str/binary */
+  unsigned long  buffer_length;
+  unsigned long  offset;           /* offset position for char/binary fetch */
+  unsigned long  length_value;     /* Used if length is 0 */
+  unsigned int   flags;            /* special flags, e.g. for dummy bind  */
+  unsigned int   pack_length;      /* Internal length for packed data */
+  enum enum_field_types buffer_type;  /* buffer type */
+  my_bool        error_value;      /* used if error is 0 */
+  my_bool        is_unsigned;      /* set if integer type is unsigned */
+  my_bool        long_data_used;   /* If used with mysql_send_long_data */
+  my_bool        is_null_value;    /* Used if is_null is 0 */
+  void           *extension;
+} MYSQL_BIND;
+
+typedef struct st_mysqlnd_upsert_result
+{
+  unsigned int  warning_count;
+  unsigned int  server_status;
+  unsigned long long affected_rows;
+  unsigned long long last_insert_id;
+} mysql_upsert_status;
+
+typedef struct st_mysql_cmd_buffer
+{
+  unsigned char   *buffer;
+  size_t     length;
+} MYSQL_CMD_BUFFER;
+
+typedef struct st_mysql_error_info
+{
+  unsigned int error_no;
+  char error[MYSQL_ERRMSG_SIZE+1];
+  char sqlstate[SQLSTATE_LENGTH + 1];
+} mysql_error_info;
+
+typedef int  (*mysql_stmt_fetch_row_func)(MYSQL_STMT *stmt, unsigned char **row);
+typedef void (*ps_result_callback)(void *data, unsigned int column, unsigned char **row);
+typedef my_bool *(*ps_param_callback)(void *data, MYSQL_BIND *bind, unsigned int row_nr);
+
+struct st_mysql_stmt
+{
+  MA_MEM_ROOT              mem_root;
+  MYSQL                    *mysql;
+  unsigned long            stmt_id;
+  unsigned long            flags;/* cursor is set here */
+  enum_mysqlnd_stmt_state  state;
+  MYSQL_FIELD              *fields;
+  unsigned int             field_count;
+  unsigned int             param_count;
+  unsigned char            send_types_to_server;
+  MYSQL_BIND               *params;
+  MYSQL_BIND               *bind;
+  MYSQL_DATA               result;  /* we don't use mysqlnd's result set logic */
+  MYSQL_ROWS               *result_cursor;
+  my_bool                  bind_result_done;
+  my_bool                  bind_param_done;
+
+  mysql_upsert_status      upsert_status;
+
+  unsigned int last_errno;
+  char last_error[MYSQL_ERRMSG_SIZE+1];
+  char sqlstate[SQLSTATE_LENGTH + 1];
+
+  my_bool                  update_max_length;
+  unsigned long            prefetch_rows;
+  LIST                     list;
+
+  my_bool                  cursor_exists;
+
+  void                     *extension;
+  mysql_stmt_fetch_row_func fetch_row_func;
+  unsigned int             execute_count;/* count how many times the stmt was executed */
+  mysql_stmt_use_or_store_func default_rset_handler;
+  unsigned char            *request_buffer;
+  unsigned int             array_size;
+  size_t row_size;
+  unsigned int prebind_params;
+  void *user_data;
+  ps_result_callback result_callback;
+  ps_param_callback param_callback;
+  size_t request_length;
+};
+
+typedef void (*ps_field_fetch_func)(MYSQL_BIND *r_param, const MYSQL_FIELD * field, unsigned char **row);
+typedef struct st_mysql_perm_bind {
+  ps_field_fetch_func func;
+  /* should be signed int */
+  int pack_len;
+  unsigned long max_len;
+} MYSQL_PS_CONVERSION;
+
+extern MYSQL_PS_CONVERSION mysql_ps_fetch_functions[MYSQL_TYPE_GEOMETRY + 1];
+unsigned long ma_net_safe_read(MYSQL *mysql);
+void mysql_init_ps_subsystem(void);
+unsigned long net_field_length(unsigned char **packet);
+int ma_simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
+          	       size_t length, my_bool skipp_check, void *opt_arg);
+/*
+ *  function prototypes
+ */
+MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
+int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length);
+int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, unsigned int column, unsigned long offset);
+int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
+unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr);
+my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, void *attr);
+my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
+my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned int param_number, const char *data, unsigned long length);
+MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt);
+MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt);
+void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, unsigned long long offset);
+unsigned long long STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt);
+unsigned long long STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
+unsigned long long STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt);
+my_bool STDCALL mysql_stmt_more_results(MYSQL_STMT *stmt);
+int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt, const char *stmt_str, size_t length);
+MYSQL_FIELD * STDCALL mariadb_stmt_fetch_fields(MYSQL_STMT *stmt);

+ 44 - 0
mariadb.mod/include/mariadb_version.h

@@ -0,0 +1,44 @@
+/* Copyright Abandoned 1996, 1999, 2001 MySQL AB
+   This file is public domain and comes with NO WARRANTY of any kind */
+
+/* Version numbers for protocol & mysqld */
+
+#ifndef _mariadb_version_h_
+#define _mariadb_version_h_
+
+#ifdef _CUSTOMCONFIG_
+#include <custom_conf.h>
+#else
+#define PROTOCOL_VERSION		10
+#define MARIADB_CLIENT_VERSION_STR	"10.6.6"
+#define MARIADB_BASE_VERSION		"mariadb-10.6"
+#define MARIADB_VERSION_ID		100606
+#define MARIADB_PORT	        	3306
+#define MARIADB_UNIX_ADDR               "/tmp/mysql.sock"
+#ifndef MYSQL_UNIX_ADDR
+#define MYSQL_UNIX_ADDR MARIADB_UNIX_ADDR
+#endif
+#ifndef MYSQL_PORT
+#define MYSQL_PORT MARIADB_PORT
+#endif
+
+#define MYSQL_CONFIG_NAME               "my"
+#define MYSQL_VERSION_ID                100606
+#define MYSQL_SERVER_VERSION            "10.6.6-MariaDB"
+
+#define MARIADB_PACKAGE_VERSION "3.2.6"
+#define MARIADB_PACKAGE_VERSION_ID 30206
+#define MARIADB_SYSTEM_TYPE "Darwin"
+#define MARIADB_MACHINE_TYPE "arm64"
+#define MARIADB_PLUGINDIR "/opt/homebrew/Cellar/mariadb-connector-c/3.2.6/lib/mariadb/plugin"
+
+/* mysqld compile time options */
+#ifndef MYSQL_CHARSET
+#define MYSQL_CHARSET			""
+#endif
+#endif
+
+/* Source information */
+#define CC_SOURCE_REVISION ""
+
+#endif /* _mariadb_version_h_ */

+ 894 - 0
mariadb.mod/include/mysql.h

@@ -0,0 +1,894 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+                 2012 by MontyProgram AB
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+/* defines for the libmariadb library */
+
+#ifndef _mysql_h
+#define _mysql_h
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifndef LIBMARIADB
+#define LIBMARIADB
+#endif
+#ifndef MYSQL_CLIENT
+#define MYSQL_CLIENT
+#endif
+
+#include <stdarg.h>
+
+#if !defined (_global_h) && !defined (MY_GLOBAL_INCLUDED) /* If not standard header */
+#include <sys/types.h>
+typedef char my_bool;
+typedef unsigned long long my_ulonglong;
+
+#if !defined(_WIN32)
+#define STDCALL
+#else
+#define STDCALL __stdcall
+#endif
+
+#ifndef my_socket_defined
+#define my_socket_defined
+#if defined(_WIN64)
+#define my_socket unsigned long long
+#elif defined(_WIN32)
+#define my_socket unsigned int
+#else
+typedef int my_socket;
+#endif
+#endif
+#endif
+#include "mariadb_com.h"
+#include "mariadb_version.h"
+#include "ma_list.h"
+#include "mariadb_ctype.h"
+
+
+typedef struct st_ma_const_string
+{
+  const char *str;
+  size_t length;
+} MARIADB_CONST_STRING;
+
+
+#ifndef ST_MA_USED_MEM_DEFINED
+#define ST_MA_USED_MEM_DEFINED
+  typedef struct st_ma_used_mem {   /* struct for once_alloc */
+    struct st_ma_used_mem *next;    /* Next block in use */
+    size_t left;                 /* memory left in block  */
+    size_t size;                 /* Size of block */
+  } MA_USED_MEM;
+
+  typedef struct st_ma_mem_root {
+    MA_USED_MEM *free;
+    MA_USED_MEM *used;
+    MA_USED_MEM *pre_alloc;
+    size_t min_malloc;
+    size_t block_size;
+    unsigned int block_num;
+    unsigned int first_block_usage;
+    void (*error_handler)(void);
+  } MA_MEM_ROOT;
+#endif
+
+extern unsigned int mysql_port;
+extern char *mysql_unix_port;
+extern unsigned int mariadb_deinitialize_ssl;
+
+#define IS_PRI_KEY(n)	((n) & PRI_KEY_FLAG)
+#define IS_NOT_NULL(n)	((n) & NOT_NULL_FLAG)
+#define IS_BLOB(n)	((n) & BLOB_FLAG)
+#define IS_NUM(t)	(((t) <= MYSQL_TYPE_INT24 && (t) != MYSQL_TYPE_TIMESTAMP) || (t) == MYSQL_TYPE_YEAR || (t) == MYSQL_TYPE_NEWDECIMAL)
+#define IS_NUM_FIELD(f)	 ((f)->flags & NUM_FLAG)
+#define INTERNAL_NUM_FIELD(f) (((f)->type <= MYSQL_TYPE_INT24 && ((f)->type != MYSQL_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == MYSQL_TYPE_YEAR || (f)->type == MYSQL_TYPE_NEWDECIMAL || (f)->type == MYSQL_TYPE_DECIMAL)
+
+  typedef struct st_mysql_field {
+    char *name;			/* Name of column */
+    char *org_name;		/* Name of original column (added after 3.23.58) */
+    char *table;			/* Table of column if column was a field */
+    char *org_table;		/* Name of original table (added after 3.23.58 */
+    char *db;                     /* table schema (added after 3.23.58) */
+    char *catalog;                /* table catalog (added after 3.23.58) */
+    char *def;			/* Default value (set by mysql_list_fields) */
+    unsigned long length;		/* Width of column */
+    unsigned long max_length;	/* Max width of selected set */
+  /* added after 3.23.58 */
+    unsigned int name_length;
+    unsigned int org_name_length;
+    unsigned int table_length;
+    unsigned int org_table_length;
+    unsigned int db_length;
+    unsigned int catalog_length;
+    unsigned int def_length;
+  /***********************/
+    unsigned int flags;		/* Div flags */
+    unsigned int decimals;	/* Number of decimals in field */
+    unsigned int charsetnr;       /* char set number (added in 4.1) */
+    enum enum_field_types type;	/* Type of field. Se mysql_com.h for types */
+    void *extension;              /* added in 4.1 */
+  } MYSQL_FIELD;
+
+  typedef char **MYSQL_ROW;		/* return data as array of strings */
+  typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
+
+#define SET_CLIENT_ERROR(a, b, c, d) \
+  do { \
+    (a)->net.last_errno= (b);\
+    strncpy((a)->net.sqlstate, (c), SQLSTATE_LENGTH);\
+    (a)->net.sqlstate[SQLSTATE_LENGTH]= 0;\
+    strncpy((a)->net.last_error, (d) ? (d) : ER((b)), MYSQL_ERRMSG_SIZE - 1);\
+    (a)->net.last_error[MYSQL_ERRMSG_SIZE - 1]= 0;\
+  } while(0)
+
+/* For mysql_async.c */
+#define set_mariadb_error(A,B,C) SET_CLIENT_ERROR((A),(B),(C),0)
+extern const char *SQLSTATE_UNKNOWN;
+#define unknown_sqlstate SQLSTATE_UNKNOWN
+
+#define CLEAR_CLIENT_ERROR(a) \
+  do { \
+    (a)->net.last_errno= 0;\
+    strcpy((a)->net.sqlstate, "00000");\
+    (a)->net.last_error[0]= '\0';\
+    if ((a)->net.extension)\
+      (a)->net.extension->extended_errno= 0;\
+  } while (0)
+
+#define MYSQL_COUNT_ERROR (~(unsigned long long) 0)
+
+
+  typedef struct st_mysql_rows {
+    struct st_mysql_rows *next;		/* list of rows */
+    MYSQL_ROW data;
+    unsigned long length;
+  } MYSQL_ROWS;
+
+  typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;	/* offset to current row */
+
+  typedef struct st_mysql_data {
+    MYSQL_ROWS *data;
+    void *embedded_info;
+    MA_MEM_ROOT alloc;
+    unsigned long long rows;
+    unsigned int fields;
+    void *extension;
+  } MYSQL_DATA;
+
+  enum mysql_option 
+  {
+    MYSQL_OPT_CONNECT_TIMEOUT, 
+    MYSQL_OPT_COMPRESS,
+    MYSQL_OPT_NAMED_PIPE,
+    MYSQL_INIT_COMMAND,
+    MYSQL_READ_DEFAULT_FILE,
+    MYSQL_READ_DEFAULT_GROUP,
+    MYSQL_SET_CHARSET_DIR,
+    MYSQL_SET_CHARSET_NAME,
+    MYSQL_OPT_LOCAL_INFILE,
+    MYSQL_OPT_PROTOCOL,
+    MYSQL_SHARED_MEMORY_BASE_NAME,
+    MYSQL_OPT_READ_TIMEOUT,
+    MYSQL_OPT_WRITE_TIMEOUT,
+    MYSQL_OPT_USE_RESULT,
+    MYSQL_OPT_USE_REMOTE_CONNECTION,
+    MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+    MYSQL_OPT_GUESS_CONNECTION,
+    MYSQL_SET_CLIENT_IP,
+    MYSQL_SECURE_AUTH,
+    MYSQL_REPORT_DATA_TRUNCATION,
+    MYSQL_OPT_RECONNECT,
+    MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+    MYSQL_PLUGIN_DIR,
+    MYSQL_DEFAULT_AUTH,
+    MYSQL_OPT_BIND,
+    MYSQL_OPT_SSL_KEY,
+    MYSQL_OPT_SSL_CERT,
+    MYSQL_OPT_SSL_CA,
+    MYSQL_OPT_SSL_CAPATH,
+    MYSQL_OPT_SSL_CIPHER,
+    MYSQL_OPT_SSL_CRL,
+    MYSQL_OPT_SSL_CRLPATH,
+    /* Connection attribute options */
+    MYSQL_OPT_CONNECT_ATTR_RESET,
+    MYSQL_OPT_CONNECT_ATTR_ADD,
+    MYSQL_OPT_CONNECT_ATTR_DELETE,
+    MYSQL_SERVER_PUBLIC_KEY,
+    MYSQL_ENABLE_CLEARTEXT_PLUGIN,
+    MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
+    MYSQL_OPT_SSL_ENFORCE,
+    MYSQL_OPT_MAX_ALLOWED_PACKET,
+    MYSQL_OPT_NET_BUFFER_LENGTH,
+    MYSQL_OPT_TLS_VERSION,
+
+    /* MariaDB specific */
+    MYSQL_PROGRESS_CALLBACK=5999,
+    MYSQL_OPT_NONBLOCK,
+    /* MariaDB Connector/C specific */
+    MYSQL_DATABASE_DRIVER=7000,
+    MARIADB_OPT_SSL_FP,             /* deprecated, use MARIADB_OPT_TLS_PEER_FP instead */
+    MARIADB_OPT_SSL_FP_LIST,        /* deprecated, use MARIADB_OPT_TLS_PEER_FP_LIST instead */
+    MARIADB_OPT_TLS_PASSPHRASE,     /* passphrase for encrypted certificates */
+    MARIADB_OPT_TLS_CIPHER_STRENGTH,
+    MARIADB_OPT_TLS_VERSION,
+    MARIADB_OPT_TLS_PEER_FP,            /* single finger print for server certificate verification */
+    MARIADB_OPT_TLS_PEER_FP_LIST,       /* finger print white list for server certificate verification */
+    MARIADB_OPT_CONNECTION_READ_ONLY,
+    MYSQL_OPT_CONNECT_ATTRS,        /* for mysql_get_optionv */
+    MARIADB_OPT_USERDATA,
+    MARIADB_OPT_CONNECTION_HANDLER,
+    MARIADB_OPT_PORT,
+    MARIADB_OPT_UNIXSOCKET,
+    MARIADB_OPT_PASSWORD,
+    MARIADB_OPT_HOST,
+    MARIADB_OPT_USER,
+    MARIADB_OPT_SCHEMA,
+    MARIADB_OPT_DEBUG,
+    MARIADB_OPT_FOUND_ROWS,
+    MARIADB_OPT_MULTI_RESULTS,
+    MARIADB_OPT_MULTI_STATEMENTS,
+    MARIADB_OPT_INTERACTIVE,
+    MARIADB_OPT_PROXY_HEADER,
+    MARIADB_OPT_IO_WAIT,
+    MARIADB_OPT_SKIP_READ_RESPONSE
+  };
+
+  enum mariadb_value {
+    MARIADB_CHARSET_ID,
+    MARIADB_CHARSET_NAME,
+    MARIADB_CLIENT_ERRORS,
+    MARIADB_CLIENT_VERSION,
+    MARIADB_CLIENT_VERSION_ID,
+    MARIADB_CONNECTION_ASYNC_TIMEOUT,
+    MARIADB_CONNECTION_ASYNC_TIMEOUT_MS,
+    MARIADB_CONNECTION_MARIADB_CHARSET_INFO,
+    MARIADB_CONNECTION_ERROR,
+    MARIADB_CONNECTION_ERROR_ID,
+    MARIADB_CONNECTION_HOST,
+    MARIADB_CONNECTION_INFO,
+    MARIADB_CONNECTION_PORT,
+    MARIADB_CONNECTION_PROTOCOL_VERSION_ID,
+    MARIADB_CONNECTION_PVIO_TYPE,
+    MARIADB_CONNECTION_SCHEMA,
+    MARIADB_CONNECTION_SERVER_TYPE,
+    MARIADB_CONNECTION_SERVER_VERSION,
+    MARIADB_CONNECTION_SERVER_VERSION_ID,
+    MARIADB_CONNECTION_SOCKET,
+    MARIADB_CONNECTION_SQLSTATE,
+    MARIADB_CONNECTION_SSL_CIPHER,
+    MARIADB_TLS_LIBRARY,
+    MARIADB_CONNECTION_TLS_VERSION,
+    MARIADB_CONNECTION_TLS_VERSION_ID,
+    MARIADB_CONNECTION_TYPE,
+    MARIADB_CONNECTION_UNIX_SOCKET,
+    MARIADB_CONNECTION_USER,
+    MARIADB_MAX_ALLOWED_PACKET,
+    MARIADB_NET_BUFFER_LENGTH,
+    MARIADB_CONNECTION_SERVER_STATUS,
+    MARIADB_CONNECTION_SERVER_CAPABILITIES,
+    MARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES,
+    MARIADB_CONNECTION_CLIENT_CAPABILITIES
+  };
+
+  enum mysql_status { MYSQL_STATUS_READY,
+                      MYSQL_STATUS_GET_RESULT,
+                      MYSQL_STATUS_USE_RESULT,
+                      MYSQL_STATUS_QUERY_SENT,
+                      MYSQL_STATUS_SENDING_LOAD_DATA,
+                      MYSQL_STATUS_FETCHING_DATA,
+                      MYSQL_STATUS_NEXT_RESULT_PENDING,
+                      MYSQL_STATUS_QUIT_SENT, /* object is "destroyed" at this stage */
+                      MYSQL_STATUS_STMT_RESULT
+  };
+
+  enum mysql_protocol_type
+  {
+    MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
+    MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
+  };
+
+struct st_mysql_options {
+    unsigned int connect_timeout, read_timeout, write_timeout;
+    unsigned int port, protocol;
+    unsigned long client_flag;
+    char *host,*user,*password,*unix_socket,*db;
+    struct st_dynamic_array *init_command;
+    char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
+    char *ssl_key;				/* PEM key file */
+    char *ssl_cert;				/* PEM cert file */
+    char *ssl_ca;					/* PEM CA file */
+    char *ssl_capath;				/* PEM directory of CA-s? */
+    char *ssl_cipher;
+    char *shared_memory_base_name;
+    unsigned long max_allowed_packet;
+    my_bool use_ssl;				/* if to use SSL or not */
+    my_bool compress,named_pipe;
+    my_bool reconnect, unused_1, unused_2, unused_3;
+    enum mysql_option methods_to_use;
+    char *bind_address;
+    my_bool secure_auth;
+    my_bool report_data_truncation; 
+    /* function pointers for local infile support */
+    int (*local_infile_init)(void **, const char *, void *);
+    int (*local_infile_read)(void *, char *, unsigned int);
+    void (*local_infile_end)(void *);
+    int (*local_infile_error)(void *, char *, unsigned int);
+    void *local_infile_userdata;
+    struct st_mysql_options_extension *extension;
+};
+
+  typedef struct st_mysql {
+    NET		net;			/* Communication parameters */
+    void  *unused_0;
+    char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
+    char *info,*db;
+    const struct ma_charset_info_st *charset;      /* character set */
+    MYSQL_FIELD *fields;
+    MA_MEM_ROOT field_alloc;
+    unsigned long long affected_rows;
+    unsigned long long insert_id;		/* id if insert on table with NEXTNR */
+    unsigned long long extra_info;		/* Used by mysqlshow */
+    unsigned long thread_id;		/* Id for connection in server */
+    unsigned long packet_length;
+    unsigned int port;
+    unsigned long client_flag;
+    unsigned long server_capabilities;
+    unsigned int protocol_version;
+    unsigned int field_count;
+    unsigned int server_status;
+    unsigned int server_language;
+    unsigned int warning_count;          /* warning count, added in 4.1 protocol */
+    struct st_mysql_options options;
+    enum mysql_status status;
+    my_bool	free_me;		/* If free in mysql_close */
+    my_bool	unused_1;
+    char	        scramble_buff[20+ 1];
+    /* madded after 3.23.58 */
+    my_bool       unused_2;
+    void          *unused_3, *unused_4, *unused_5, *unused_6;
+    LIST          *stmts;
+    const struct  st_mariadb_methods *methods;
+    void          *thd;
+    my_bool       *unbuffered_fetch_owner;
+    char          *info_buffer;
+    struct st_mariadb_extension *extension;
+} MYSQL;
+
+typedef struct st_mysql_res {
+  unsigned long long  row_count;
+  unsigned int	field_count, current_field;
+  MYSQL_FIELD	*fields;
+  MYSQL_DATA	*data;
+  MYSQL_ROWS	*data_cursor;
+  MA_MEM_ROOT	field_alloc;
+  MYSQL_ROW	row;			/* If unbuffered read */
+  MYSQL_ROW	current_row;		/* buffer to current row */
+  unsigned long *lengths;		/* column lengths of current row */
+  MYSQL		*handle;		/* for unbuffered reads */
+  my_bool	eof;			/* Used my mysql_fetch_row */
+  my_bool       is_ps;
+} MYSQL_RES;
+
+typedef struct
+{
+  unsigned long *p_max_allowed_packet;
+  unsigned long *p_net_buffer_length;
+  void *extension;
+} MYSQL_PARAMETERS;
+
+
+enum mariadb_field_attr_t
+{
+  MARIADB_FIELD_ATTR_DATA_TYPE_NAME= 0,
+  MARIADB_FIELD_ATTR_FORMAT_NAME= 1
+};
+
+#define MARIADB_FIELD_ATTR_LAST MARIADB_FIELD_ATTR_FORMAT_NAME
+
+
+int STDCALL mariadb_field_attr(MARIADB_CONST_STRING *attr,
+                               const MYSQL_FIELD *field,
+                               enum mariadb_field_attr_t type);
+
+#ifndef _mysql_time_h_
+enum enum_mysql_timestamp_type
+{
+  MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
+  MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
+};
+
+typedef struct st_mysql_time
+{
+  unsigned int  year, month, day, hour, minute, second;
+  unsigned long second_part;
+  my_bool       neg;
+  enum enum_mysql_timestamp_type time_type;
+} MYSQL_TIME;
+#define AUTO_SEC_PART_DIGITS 39
+#endif
+
+#define SEC_PART_DIGITS 6
+#define MARIADB_INVALID_SOCKET -1
+
+/* Asynchronous API constants */
+#define MYSQL_WAIT_READ      1
+#define MYSQL_WAIT_WRITE     2
+#define MYSQL_WAIT_EXCEPT    4
+#define MYSQL_WAIT_TIMEOUT   8
+
+typedef struct character_set
+{
+  unsigned int      number;     /* character set number              */
+  unsigned int      state;      /* character set state               */
+  const char        *csname;    /* character set name                */
+  const char        *name;      /* collation name                    */
+  const char        *comment;   /* comment                           */
+  const char        *dir;       /* character set directory           */
+  unsigned int      mbminlen;   /* min. length for multibyte strings */
+  unsigned int      mbmaxlen;   /* max. length for multibyte strings */
+} MY_CHARSET_INFO;
+
+/* Local infile support functions */
+#define LOCAL_INFILE_ERROR_LEN 512
+
+#include "mariadb_stmt.h"
+
+#ifndef MYSQL_CLIENT_PLUGIN_HEADER
+#define MYSQL_CLIENT_PLUGIN_HEADER                      \
+  int type;                                             \
+  unsigned int interface_version;                       \
+  const char *name;                                     \
+  const char *author;                                   \
+  const char *desc;                                     \
+  unsigned int version[3];                              \
+  const char *license;                                  \
+  void *mysql_api;                                      \
+  int (*init)(char *, size_t, int, va_list);            \
+  int (*deinit)(void);                                  \
+  int (*options)(const char *option, const void *);
+struct st_mysql_client_plugin
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+};
+
+struct st_mysql_client_plugin *
+mysql_load_plugin(struct st_mysql *mysql, const char *name, int type,
+                  int argc, ...);
+struct st_mysql_client_plugin * STDCALL
+mysql_load_plugin_v(struct st_mysql *mysql, const char *name, int type,
+                    int argc, va_list args);
+struct st_mysql_client_plugin * STDCALL
+mysql_client_find_plugin(struct st_mysql *mysql, const char *name, int type);
+struct st_mysql_client_plugin * STDCALL
+mysql_client_register_plugin(struct st_mysql *mysql,
+                             struct st_mysql_client_plugin *plugin);
+#endif
+
+
+void STDCALL mysql_set_local_infile_handler(MYSQL *mysql,
+        int (*local_infile_init)(void **, const char *, void *),
+        int (*local_infile_read)(void *, char *, unsigned int),
+        void (*local_infile_end)(void *),
+        int (*local_infile_error)(void *, char*, unsigned int),
+        void *);
+
+void mysql_set_local_infile_default(MYSQL *mysql);
+
+void my_set_error(MYSQL *mysql, unsigned int error_nr, 
+                  const char *sqlstate, const char *format, ...);
+/* Functions to get information from the MYSQL and MYSQL_RES structures */
+/* Should definitely be used if one uses shared libraries */
+
+my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
+unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);
+my_bool STDCALL mysql_eof(MYSQL_RES *res);
+MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res,
+					      unsigned int fieldnr);
+MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res);
+MYSQL_ROWS * STDCALL mysql_row_tell(MYSQL_RES *res);
+unsigned int STDCALL mysql_field_tell(MYSQL_RES *res);
+
+unsigned int STDCALL mysql_field_count(MYSQL *mysql);
+my_bool STDCALL mysql_more_results(MYSQL *mysql);
+int STDCALL mysql_next_result(MYSQL *mysql);
+my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
+my_bool STDCALL mysql_autocommit(MYSQL *mysql, my_bool mode);
+my_bool STDCALL mysql_commit(MYSQL *mysql);
+my_bool STDCALL mysql_rollback(MYSQL *mysql);
+my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql);
+unsigned int STDCALL mysql_errno(MYSQL *mysql);
+const char * STDCALL mysql_error(MYSQL *mysql);
+const char * STDCALL mysql_info(MYSQL *mysql);
+unsigned long STDCALL mysql_thread_id(MYSQL *mysql);
+const char * STDCALL mysql_character_set_name(MYSQL *mysql);
+void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs);
+int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname);
+
+my_bool mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void *arg, ...);
+my_bool STDCALL mariadb_get_info(MYSQL *mysql, enum mariadb_value value, void *arg);
+MYSQL *		STDCALL mysql_init(MYSQL *mysql);
+int		STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
+				      const char *cert, const char *ca,
+				      const char *capath, const char *cipher);
+const char *	STDCALL mysql_get_ssl_cipher(MYSQL *mysql);
+my_bool		STDCALL mysql_change_user(MYSQL *mysql, const char *user, 
+					  const char *passwd, const char *db);
+MYSQL *		STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
+					   const char *user,
+					   const char *passwd,
+					   const char *db,
+					   unsigned int port,
+					   const char *unix_socket,
+					   unsigned long clientflag);
+void		STDCALL mysql_close(MYSQL *sock);
+int		STDCALL mysql_select_db(MYSQL *mysql, const char *db);
+int		STDCALL mysql_query(MYSQL *mysql, const char *q);
+int		STDCALL mysql_send_query(MYSQL *mysql, const char *q,
+					 unsigned long length);
+my_bool	STDCALL mysql_read_query_result(MYSQL *mysql);
+int		STDCALL mysql_real_query(MYSQL *mysql, const char *q,
+					 unsigned long length);
+int		STDCALL mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level);
+int		STDCALL mysql_dump_debug_info(MYSQL *mysql);
+int		STDCALL mysql_refresh(MYSQL *mysql,
+				     unsigned int refresh_options);
+int		STDCALL mysql_kill(MYSQL *mysql,unsigned long pid);
+int		STDCALL mysql_ping(MYSQL *mysql);
+char *		STDCALL mysql_stat(MYSQL *mysql);
+char *		STDCALL mysql_get_server_info(MYSQL *mysql);
+unsigned long   STDCALL mysql_get_server_version(MYSQL *mysql);
+char *		STDCALL mysql_get_host_info(MYSQL *mysql);
+unsigned int	STDCALL mysql_get_proto_info(MYSQL *mysql);
+MYSQL_RES *	STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild);
+MYSQL_RES *	STDCALL mysql_list_tables(MYSQL *mysql,const char *wild);
+MYSQL_RES *	STDCALL mysql_list_fields(MYSQL *mysql, const char *table,
+					 const char *wild);
+MYSQL_RES *	STDCALL mysql_list_processes(MYSQL *mysql);
+MYSQL_RES *	STDCALL mysql_store_result(MYSQL *mysql);
+MYSQL_RES *	STDCALL mysql_use_result(MYSQL *mysql);
+int		STDCALL mysql_options(MYSQL *mysql,enum mysql_option option,
+				      const void *arg);
+int		STDCALL mysql_options4(MYSQL *mysql,enum mysql_option option,
+				      const void *arg1, const void *arg2);
+void		STDCALL mysql_free_result(MYSQL_RES *result);
+void		STDCALL mysql_data_seek(MYSQL_RES *result,
+					unsigned long long offset);
+MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
+					   MYSQL_FIELD_OFFSET offset);
+MYSQL_ROW	STDCALL mysql_fetch_row(MYSQL_RES *result);
+unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result);
+MYSQL_FIELD *	STDCALL mysql_fetch_field(MYSQL_RES *result);
+unsigned long	STDCALL mysql_escape_string(char *to,const char *from,
+					    unsigned long from_length);
+unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql,
+					       char *to,const char *from,
+					       unsigned long length);
+unsigned int	STDCALL mysql_thread_safe(void);
+unsigned int STDCALL mysql_warning_count(MYSQL *mysql);
+const char * STDCALL mysql_sqlstate(MYSQL *mysql);
+int STDCALL mysql_server_init(int argc, char **argv, char **groups);
+void STDCALL mysql_server_end(void);
+void STDCALL mysql_thread_end(void);
+my_bool STDCALL mysql_thread_init(void);
+int STDCALL mysql_set_server_option(MYSQL *mysql, 
+                                    enum enum_mysql_set_option option);
+const char * STDCALL mysql_get_client_info(void);
+unsigned long STDCALL mysql_get_client_version(void);
+my_bool STDCALL mariadb_connection(MYSQL *mysql);
+const char * STDCALL mysql_get_server_name(MYSQL *mysql);
+MARIADB_CHARSET_INFO * STDCALL mariadb_get_charset_by_name(const char *csname);
+MARIADB_CHARSET_INFO * STDCALL mariadb_get_charset_by_nr(unsigned int csnr);
+size_t STDCALL mariadb_convert_string(const char *from, size_t *from_len, MARIADB_CHARSET_INFO *from_cs,
+                                      char *to, size_t *to_len, MARIADB_CHARSET_INFO *to_cs, int *errorcode);
+int mysql_optionsv(MYSQL *mysql,enum mysql_option option, ...);
+int mysql_get_optionv(MYSQL *mysql, enum mysql_option option, void *arg, ...);
+int STDCALL mysql_get_option(MYSQL *mysql, enum mysql_option option, void *arg);
+unsigned long STDCALL mysql_hex_string(char *to, const char *from, unsigned long len);
+my_socket STDCALL mysql_get_socket(MYSQL *mysql);
+unsigned int STDCALL mysql_get_timeout_value(const MYSQL *mysql);
+unsigned int STDCALL mysql_get_timeout_value_ms(const MYSQL *mysql);
+my_bool STDCALL mariadb_reconnect(MYSQL *mysql);
+int STDCALL mariadb_cancel(MYSQL *mysql);
+void STDCALL mysql_debug(const char *debug);
+unsigned long STDCALL mysql_net_read_packet(MYSQL *mysql);
+unsigned long STDCALL mysql_net_field_length(unsigned char **packet);
+my_bool STDCALL mysql_embedded(void);
+MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void);
+
+/* Async API */
+int STDCALL mysql_close_start(MYSQL *sock);
+int STDCALL mysql_close_cont(MYSQL *sock, int status);
+int STDCALL mysql_commit_start(my_bool *ret, MYSQL * mysql);
+int STDCALL mysql_commit_cont(my_bool *ret, MYSQL * mysql, int status);
+int STDCALL mysql_dump_debug_info_cont(int *ret, MYSQL *mysql, int ready_status);
+int STDCALL mysql_dump_debug_info_start(int *ret, MYSQL *mysql);
+int STDCALL mysql_rollback_start(my_bool *ret, MYSQL * mysql);
+int STDCALL mysql_rollback_cont(my_bool *ret, MYSQL * mysql, int status);
+int STDCALL mysql_autocommit_start(my_bool *ret, MYSQL * mysql,
+                                   my_bool auto_mode);
+int STDCALL mysql_list_fields_cont(MYSQL_RES **ret, MYSQL *mysql, int ready_status);
+int STDCALL mysql_list_fields_start(MYSQL_RES **ret, MYSQL *mysql, const char *table,
+                        const char *wild);
+int STDCALL mysql_autocommit_cont(my_bool *ret, MYSQL * mysql, int status);
+int STDCALL mysql_next_result_start(int *ret, MYSQL *mysql);
+int STDCALL mysql_next_result_cont(int *ret, MYSQL *mysql, int status);
+int STDCALL mysql_select_db_start(int *ret, MYSQL *mysql, const char *db);
+int STDCALL mysql_select_db_cont(int *ret, MYSQL *mysql, int ready_status);
+int STDCALL mysql_stmt_warning_count(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_next_result_start(int *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_next_result_cont(int *ret, MYSQL_STMT *stmt, int status);
+
+int STDCALL mysql_set_character_set_start(int *ret, MYSQL *mysql,
+                                                   const char *csname);
+int STDCALL mysql_set_character_set_cont(int *ret, MYSQL *mysql,
+                                                  int status);
+int STDCALL mysql_change_user_start(my_bool *ret, MYSQL *mysql,
+                                                const char *user,
+                                                const char *passwd,
+                                                const char *db);
+int STDCALL mysql_change_user_cont(my_bool *ret, MYSQL *mysql,
+                                               int status);
+int         STDCALL mysql_real_connect_start(MYSQL **ret, MYSQL *mysql,
+                                                 const char *host,
+                                                 const char *user,
+                                                 const char *passwd,
+                                                 const char *db,
+                                                 unsigned int port,
+                                                 const char *unix_socket,
+                                                 unsigned long clientflag);
+int         STDCALL mysql_real_connect_cont(MYSQL **ret, MYSQL *mysql,
+                                                int status);
+int             STDCALL mysql_query_start(int *ret, MYSQL *mysql,
+                                          const char *q);
+int             STDCALL mysql_query_cont(int *ret, MYSQL *mysql,
+                                         int status);
+int             STDCALL mysql_send_query_start(int *ret, MYSQL *mysql,
+                                               const char *q,
+                                               unsigned long length);
+int             STDCALL mysql_send_query_cont(int *ret, MYSQL *mysql, int status);
+int             STDCALL mysql_real_query_start(int *ret, MYSQL *mysql,
+                                               const char *q,
+                                               unsigned long length);
+int             STDCALL mysql_real_query_cont(int *ret, MYSQL *mysql,
+                                              int status);
+int             STDCALL mysql_store_result_start(MYSQL_RES **ret, MYSQL *mysql);
+int             STDCALL mysql_store_result_cont(MYSQL_RES **ret, MYSQL *mysql,
+                                                int status);
+int             STDCALL mysql_shutdown_start(int *ret, MYSQL *mysql,
+                                             enum mysql_enum_shutdown_level
+                                             shutdown_level);
+int             STDCALL mysql_shutdown_cont(int *ret, MYSQL *mysql,
+                                            int status);
+int             STDCALL mysql_refresh_start(int *ret, MYSQL *mysql,
+                                            unsigned int refresh_options);
+int             STDCALL mysql_refresh_cont(int *ret, MYSQL *mysql, int status);
+int             STDCALL mysql_kill_start(int *ret, MYSQL *mysql,
+                                         unsigned long pid);
+int             STDCALL mysql_kill_cont(int *ret, MYSQL *mysql, int status);
+int             STDCALL mysql_set_server_option_start(int *ret, MYSQL *mysql,
+                                                      enum enum_mysql_set_option
+                                                      option);
+int             STDCALL mysql_set_server_option_cont(int *ret, MYSQL *mysql,
+                                                     int status);
+int             STDCALL mysql_ping_start(int *ret, MYSQL *mysql);
+int             STDCALL mysql_ping_cont(int *ret, MYSQL *mysql, int status);
+int             STDCALL mysql_stat_start(const char **ret, MYSQL *mysql);
+int             STDCALL mysql_stat_cont(const char **ret, MYSQL *mysql,
+                                        int status);
+int             STDCALL mysql_free_result_start(MYSQL_RES *result);
+int             STDCALL mysql_free_result_cont(MYSQL_RES *result, int status);
+int             STDCALL mysql_fetch_row_start(MYSQL_ROW *ret,
+                                              MYSQL_RES *result);
+int             STDCALL mysql_fetch_row_cont(MYSQL_ROW *ret, MYSQL_RES *result,
+                                             int status);
+int             STDCALL mysql_read_query_result_start(my_bool *ret,
+                                                      MYSQL *mysql);
+int             STDCALL mysql_read_query_result_cont(my_bool *ret,
+                                                     MYSQL *mysql, int status);
+int             STDCALL mysql_reset_connection_start(int *ret, MYSQL *mysql);
+int             STDCALL mysql_reset_connection_cont(int *ret, MYSQL *mysql, int status);
+int STDCALL mysql_session_track_get_next(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length);
+int STDCALL mysql_session_track_get_first(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length);
+int STDCALL mysql_stmt_prepare_start(int *ret, MYSQL_STMT *stmt,const char *query, unsigned long length);
+int STDCALL mysql_stmt_prepare_cont(int *ret, MYSQL_STMT *stmt, int status);
+int STDCALL mysql_stmt_execute_start(int *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_execute_cont(int *ret, MYSQL_STMT *stmt, int status);
+int STDCALL mysql_stmt_fetch_start(int *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch_cont(int *ret, MYSQL_STMT *stmt, int status);
+int STDCALL mysql_stmt_store_result_start(int *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_store_result_cont(int *ret, MYSQL_STMT *stmt,int status);
+int STDCALL mysql_stmt_close_start(my_bool *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_close_cont(my_bool *ret, MYSQL_STMT * stmt, int status);
+int STDCALL mysql_stmt_reset_start(my_bool *ret, MYSQL_STMT * stmt);
+int STDCALL mysql_stmt_reset_cont(my_bool *ret, MYSQL_STMT *stmt, int status);
+int STDCALL mysql_stmt_free_result_start(my_bool *ret, MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_free_result_cont(my_bool *ret, MYSQL_STMT *stmt,
+                                        int status);
+int STDCALL mysql_stmt_send_long_data_start(my_bool *ret, MYSQL_STMT *stmt,
+                                            unsigned int param_number,
+                                            const char *data,
+                                            unsigned long len);
+int STDCALL mysql_stmt_send_long_data_cont(my_bool *ret, MYSQL_STMT *stmt,
+                                           int status);
+int STDCALL mysql_reset_connection(MYSQL *mysql);
+
+/* API function calls (used by dynamic plugins) */
+struct st_mariadb_api {
+  unsigned long long (STDCALL *mysql_num_rows)(MYSQL_RES *res);
+  unsigned int (STDCALL *mysql_num_fields)(MYSQL_RES *res);
+  my_bool (STDCALL *mysql_eof)(MYSQL_RES *res);
+  MYSQL_FIELD *(STDCALL *mysql_fetch_field_direct)(MYSQL_RES *res, unsigned int fieldnr);
+  MYSQL_FIELD * (STDCALL *mysql_fetch_fields)(MYSQL_RES *res);
+  MYSQL_ROWS * (STDCALL *mysql_row_tell)(MYSQL_RES *res);
+  unsigned int (STDCALL *mysql_field_tell)(MYSQL_RES *res);
+  unsigned int (STDCALL *mysql_field_count)(MYSQL *mysql);
+  my_bool (STDCALL *mysql_more_results)(MYSQL *mysql);
+  int (STDCALL *mysql_next_result)(MYSQL *mysql);
+  unsigned long long (STDCALL *mysql_affected_rows)(MYSQL *mysql);
+  my_bool (STDCALL *mysql_autocommit)(MYSQL *mysql, my_bool mode);
+  my_bool (STDCALL *mysql_commit)(MYSQL *mysql);
+  my_bool (STDCALL *mysql_rollback)(MYSQL *mysql);
+  unsigned long long (STDCALL *mysql_insert_id)(MYSQL *mysql);
+  unsigned int (STDCALL *mysql_errno)(MYSQL *mysql);
+  const char * (STDCALL *mysql_error)(MYSQL *mysql);
+  const char * (STDCALL *mysql_info)(MYSQL *mysql);
+  unsigned long (STDCALL *mysql_thread_id)(MYSQL *mysql);
+  const char * (STDCALL *mysql_character_set_name)(MYSQL *mysql);
+  void (STDCALL *mysql_get_character_set_info)(MYSQL *mysql, MY_CHARSET_INFO *cs);
+  int (STDCALL *mysql_set_character_set)(MYSQL *mysql, const char *csname);
+  my_bool (*mariadb_get_infov)(MYSQL *mysql, enum mariadb_value value, void *arg, ...);
+  my_bool (STDCALL *mariadb_get_info)(MYSQL *mysql, enum mariadb_value value, void *arg);
+  MYSQL * (STDCALL *mysql_init)(MYSQL *mysql);
+  int (STDCALL *mysql_ssl_set)(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher);
+  const char * (STDCALL *mysql_get_ssl_cipher)(MYSQL *mysql);
+  my_bool (STDCALL *mysql_change_user)(MYSQL *mysql, const char *user, const char *passwd, const char *db);
+  MYSQL * (STDCALL *mysql_real_connect)(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
+  void (STDCALL *mysql_close)(MYSQL *sock);
+  int (STDCALL *mysql_select_db)(MYSQL *mysql, const char *db);
+  int (STDCALL *mysql_query)(MYSQL *mysql, const char *q);
+  int (STDCALL *mysql_send_query)(MYSQL *mysql, const char *q, unsigned long length);
+  my_bool (STDCALL *mysql_read_query_result)(MYSQL *mysql);
+  int (STDCALL *mysql_real_query)(MYSQL *mysql, const char *q, unsigned long length);
+  int (STDCALL *mysql_shutdown)(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level);
+  int (STDCALL *mysql_dump_debug_info)(MYSQL *mysql);
+  int (STDCALL *mysql_refresh)(MYSQL *mysql, unsigned int refresh_options);
+  int (STDCALL *mysql_kill)(MYSQL *mysql,unsigned long pid);
+  int (STDCALL *mysql_ping)(MYSQL *mysql);
+  char * (STDCALL *mysql_stat)(MYSQL *mysql);
+  char * (STDCALL *mysql_get_server_info)(MYSQL *mysql);
+  unsigned long (STDCALL *mysql_get_server_version)(MYSQL *mysql);
+  char * (STDCALL *mysql_get_host_info)(MYSQL *mysql);
+  unsigned int (STDCALL *mysql_get_proto_info)(MYSQL *mysql);
+  MYSQL_RES * (STDCALL *mysql_list_dbs)(MYSQL *mysql,const char *wild);
+  MYSQL_RES * (STDCALL *mysql_list_tables)(MYSQL *mysql,const char *wild);
+  MYSQL_RES * (STDCALL *mysql_list_fields)(MYSQL *mysql, const char *table, const char *wild);
+  MYSQL_RES * (STDCALL *mysql_list_processes)(MYSQL *mysql);
+  MYSQL_RES * (STDCALL *mysql_store_result)(MYSQL *mysql);
+  MYSQL_RES * (STDCALL *mysql_use_result)(MYSQL *mysql);
+  int (STDCALL *mysql_options)(MYSQL *mysql,enum mysql_option option, const void *arg);
+  void (STDCALL *mysql_free_result)(MYSQL_RES *result);
+  void (STDCALL *mysql_data_seek)(MYSQL_RES *result, unsigned long long offset);
+  MYSQL_ROW_OFFSET (STDCALL *mysql_row_seek)(MYSQL_RES *result, MYSQL_ROW_OFFSET);
+  MYSQL_FIELD_OFFSET (STDCALL *mysql_field_seek)(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset);
+  MYSQL_ROW (STDCALL *mysql_fetch_row)(MYSQL_RES *result);
+  unsigned long * (STDCALL *mysql_fetch_lengths)(MYSQL_RES *result);
+  MYSQL_FIELD * (STDCALL *mysql_fetch_field)(MYSQL_RES *result);
+  unsigned long (STDCALL *mysql_escape_string)(char *to,const char *from, unsigned long from_length);
+  unsigned long (STDCALL *mysql_real_escape_string)(MYSQL *mysql, char *to,const char *from, unsigned long length);
+  unsigned int (STDCALL *mysql_thread_safe)(void);
+  unsigned int (STDCALL *mysql_warning_count)(MYSQL *mysql);
+  const char * (STDCALL *mysql_sqlstate)(MYSQL *mysql);
+  int (STDCALL *mysql_server_init)(int argc, char **argv, char **groups);
+  void (STDCALL *mysql_server_end)(void);
+  void (STDCALL *mysql_thread_end)(void);
+  my_bool (STDCALL *mysql_thread_init)(void);
+  int (STDCALL *mysql_set_server_option)(MYSQL *mysql, enum enum_mysql_set_option option);
+  const char * (STDCALL *mysql_get_client_info)(void);
+  unsigned long (STDCALL *mysql_get_client_version)(void);
+  my_bool (STDCALL *mariadb_connection)(MYSQL *mysql);
+  const char * (STDCALL *mysql_get_server_name)(MYSQL *mysql);
+  MARIADB_CHARSET_INFO * (STDCALL *mariadb_get_charset_by_name)(const char *csname);
+  MARIADB_CHARSET_INFO * (STDCALL *mariadb_get_charset_by_nr)(unsigned int csnr);
+  size_t (STDCALL *mariadb_convert_string)(const char *from, size_t *from_len, MARIADB_CHARSET_INFO *from_cs, char *to, size_t *to_len, MARIADB_CHARSET_INFO *to_cs, int *errorcode);
+  int (*mysql_optionsv)(MYSQL *mysql,enum mysql_option option, ...);
+  int (*mysql_get_optionv)(MYSQL *mysql, enum mysql_option option, void *arg, ...);
+  int (STDCALL *mysql_get_option)(MYSQL *mysql, enum mysql_option option, void *arg);
+  unsigned long (STDCALL *mysql_hex_string)(char *to, const char *from, unsigned long len);
+  my_socket (STDCALL *mysql_get_socket)(MYSQL *mysql);
+  unsigned int (STDCALL *mysql_get_timeout_value)(const MYSQL *mysql);
+  unsigned int (STDCALL *mysql_get_timeout_value_ms)(const MYSQL *mysql);
+  my_bool (STDCALL *mariadb_reconnect)(MYSQL *mysql);
+  MYSQL_STMT * (STDCALL *mysql_stmt_init)(MYSQL *mysql);
+  int (STDCALL *mysql_stmt_prepare)(MYSQL_STMT *stmt, const char *query, unsigned long length);
+  int (STDCALL *mysql_stmt_execute)(MYSQL_STMT *stmt);
+  int (STDCALL *mysql_stmt_fetch)(MYSQL_STMT *stmt);
+  int (STDCALL *mysql_stmt_fetch_column)(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, unsigned int column, unsigned long offset);
+  int (STDCALL *mysql_stmt_store_result)(MYSQL_STMT *stmt);
+  unsigned long (STDCALL *mysql_stmt_param_count)(MYSQL_STMT * stmt);
+  my_bool (STDCALL *mysql_stmt_attr_set)(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr);
+  my_bool (STDCALL *mysql_stmt_attr_get)(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, void *attr);
+  my_bool (STDCALL *mysql_stmt_bind_param)(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+  my_bool (STDCALL *mysql_stmt_bind_result)(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+  my_bool (STDCALL *mysql_stmt_close)(MYSQL_STMT * stmt);
+  my_bool (STDCALL *mysql_stmt_reset)(MYSQL_STMT * stmt);
+  my_bool (STDCALL *mysql_stmt_free_result)(MYSQL_STMT *stmt);
+  my_bool (STDCALL *mysql_stmt_send_long_data)(MYSQL_STMT *stmt, unsigned int param_number, const char *data, unsigned long length);
+  MYSQL_RES *(STDCALL *mysql_stmt_result_metadata)(MYSQL_STMT *stmt);
+  MYSQL_RES *(STDCALL *mysql_stmt_param_metadata)(MYSQL_STMT *stmt);
+  unsigned int (STDCALL *mysql_stmt_errno)(MYSQL_STMT * stmt);
+  const char *(STDCALL *mysql_stmt_error)(MYSQL_STMT * stmt);
+  const char *(STDCALL *mysql_stmt_sqlstate)(MYSQL_STMT * stmt);
+  MYSQL_ROW_OFFSET (STDCALL *mysql_stmt_row_seek)(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset);
+  MYSQL_ROW_OFFSET (STDCALL *mysql_stmt_row_tell)(MYSQL_STMT *stmt);
+  void (STDCALL *mysql_stmt_data_seek)(MYSQL_STMT *stmt, unsigned long long offset);
+  unsigned long long (STDCALL *mysql_stmt_num_rows)(MYSQL_STMT *stmt);
+  unsigned long long (STDCALL *mysql_stmt_affected_rows)(MYSQL_STMT *stmt);
+  unsigned long long (STDCALL *mysql_stmt_insert_id)(MYSQL_STMT *stmt);
+  unsigned int (STDCALL *mysql_stmt_field_count)(MYSQL_STMT *stmt);
+  int (STDCALL *mysql_stmt_next_result)(MYSQL_STMT *stmt);
+  my_bool (STDCALL *mysql_stmt_more_results)(MYSQL_STMT *stmt);
+  int (STDCALL *mariadb_stmt_execute_direct)(MYSQL_STMT *stmt, const char *stmtstr, size_t length);
+  int (STDCALL *mysql_reset_connection)(MYSQL *mysql);
+};
+  
+/* these methods can be overwritten by db plugins */
+struct st_mariadb_methods {
+  MYSQL *(*db_connect)(MYSQL *mysql, const char *host, const char *user, const char *passwd,
+					   const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
+  void (*db_close)(MYSQL *mysql);
+  int (*db_command)(MYSQL *mysql,enum enum_server_command command, const char *arg,
+                    size_t length, my_bool skipp_check, void *opt_arg);
+  void (*db_skip_result)(MYSQL *mysql);
+  int (*db_read_query_result)(MYSQL *mysql);
+  MYSQL_DATA *(*db_read_rows)(MYSQL *mysql,MYSQL_FIELD *fields, unsigned int field_count);
+  int (*db_read_one_row)(MYSQL *mysql,unsigned int fields,MYSQL_ROW row, unsigned long *lengths);
+  /* prepared statements */
+  my_bool (*db_supported_buffer_type)(enum enum_field_types type);
+  my_bool (*db_read_prepare_response)(MYSQL_STMT *stmt);
+  int (*db_read_stmt_result)(MYSQL *mysql);
+  my_bool (*db_stmt_get_result_metadata)(MYSQL_STMT *stmt);
+  my_bool (*db_stmt_get_param_metadata)(MYSQL_STMT *stmt);
+  int (*db_stmt_read_all_rows)(MYSQL_STMT *stmt);
+  int (*db_stmt_fetch)(MYSQL_STMT *stmt, unsigned char **row);
+  int (*db_stmt_fetch_to_bind)(MYSQL_STMT *stmt, unsigned char *row);
+  void (*db_stmt_flush_unbuffered)(MYSQL_STMT *stmt);
+  void (*set_error)(MYSQL *mysql, unsigned int error_nr, const char *sqlstate, const char *format, ...);
+  void (*invalidate_stmts)(MYSQL *mysql, const char *function_name);
+  struct st_mariadb_api *api;
+  int (*db_read_execute_response)(MYSQL_STMT *stmt);
+  unsigned char* (*db_execute_generate_request)(MYSQL_STMT *stmt, size_t *request_len, my_bool internal);
+};
+
+/* synonyms/aliases functions */
+#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
+#define mysql_library_init mysql_server_init
+#define mysql_library_end mysql_server_end
+
+/* new api functions */
+
+#define HAVE_MYSQL_REAL_CONNECT
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif

+ 244 - 0
mariadb.mod/include/mysql/client_plugin.h

@@ -0,0 +1,244 @@
+/* Copyright (C) 2010 - 2012 Sergei Golubchik and Monty Program Ab
+                 2014 MariaDB Corporation AB
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not see <http://www.gnu.org/licenses>
+   or write to the Free Software Foundation, Inc., 
+   51 Franklin St., Fifth Floor, Boston, MA 02110, USA */
+
+/**
+  @file
+
+  MySQL Client Plugin API
+
+  This file defines the API for plugins that work on the client side
+*/
+#ifndef MYSQL_CLIENT_PLUGIN_INCLUDED
+#define MYSQL_CLIENT_PLUGIN_INCLUDED
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdarg.h>
+#include <stdlib.h>
+#endif
+
+
+#ifndef PLUGINDIR
+#define PLUGINDIR "lib/plugin"
+#endif
+
+#define plugin_declarations_sym "_mysql_client_plugin_declaration_"
+
+/* known plugin types */
+#define MYSQL_CLIENT_PLUGIN_RESERVED         0 
+#define MYSQL_CLIENT_PLUGIN_RESERVED2        1
+#define MYSQL_CLIENT_AUTHENTICATION_PLUGIN   2 /* authentication   */
+
+#define MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION  0x0100
+#define MYSQL_CLIENT_MAX_PLUGINS             3
+
+/* Connector/C specific plugin types */
+#define MARIADB_CLIENT_REMOTEIO_PLUGIN       100 /* communication IO */
+#define MARIADB_CLIENT_PVIO_PLUGIN           101
+#define MARIADB_CLIENT_TRACE_PLUGIN          102
+#define MARIADB_CLIENT_CONNECTION_PLUGIN     103
+
+#define MARIADB_CLIENT_REMOTEIO_PLUGIN_INTERFACE_VERSION 0x0100
+#define MARIADB_CLIENT_PVIO_PLUGIN_INTERFACE_VERSION 0x0100
+#define MARIADB_CLIENT_TRACE_PLUGIN_INTERFACE_VERSION 0x0100
+#define MARIADB_CLIENT_CONNECTION_PLUGIN_INTERFACE_VERSION 0x0100
+
+#define MARIADB_CLIENT_MAX_PLUGINS             4
+
+#define mysql_declare_client_plugin(X)          \
+     struct st_mysql_client_plugin_ ## X        \
+        _mysql_client_plugin_declaration_ = {   \
+          MYSQL_CLIENT_ ## X ## _PLUGIN,        \
+          MYSQL_CLIENT_ ## X ## _PLUGIN_INTERFACE_VERSION,
+#define mysql_end_client_plugin             }
+
+/* generic plugin header structure */
+#ifndef MYSQL_CLIENT_PLUGIN_HEADER
+#define MYSQL_CLIENT_PLUGIN_HEADER                      \
+  int type;                                             \
+  unsigned int interface_version;                       \
+  const char *name;                                     \
+  const char *author;                                   \
+  const char *desc;                                     \
+  unsigned int version[3];                              \
+  const char *license;                                  \
+  void *mysql_api;                                      \
+  int (*init)(char *, size_t, int, va_list);            \
+  int (*deinit)(void);                                  \
+  int (*options)(const char *option, const void *);
+struct st_mysql_client_plugin
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+};
+#endif
+
+struct st_mysql;
+
+/********* connection handler plugin specific declarations **********/
+
+typedef struct st_ma_connection_plugin
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+  /* functions */
+  MYSQL *(*connect)(MYSQL *mysql, const char *host,
+                    const char *user, const char *passwd,
+		                const char *db, unsigned int port,
+                    const char *unix_socket, unsigned long clientflag);
+  void (*close)(MYSQL *mysql);
+  int (*set_optionsv)(MYSQL *mysql, unsigned int option, ...);
+  int (*set_connection)(MYSQL *mysql,enum enum_server_command command,
+                        const char *arg,
+                        size_t length, my_bool skipp_check, void *opt_arg);
+  my_bool (*reconnect)(MYSQL *mysql);
+  int (*reset)(MYSQL *mysql);
+} MARIADB_CONNECTION_PLUGIN;
+
+#define MARIADB_DB_DRIVER(a) ((a)->ext_db)
+
+/*******************  Communication IO plugin *****************/
+#include <ma_pvio.h>
+
+typedef struct st_mariadb_client_plugin_PVIO
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+  struct st_ma_pvio_methods *methods;
+} MARIADB_PVIO_PLUGIN;
+
+/******** authentication plugin specific declarations *********/
+#include <mysql/plugin_auth_common.h>
+
+struct st_mysql_client_plugin_AUTHENTICATION
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+  int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, struct st_mysql *mysql);
+};
+
+/******** trace plugin *******/
+struct st_mysql_client_plugin_TRACE
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+};
+
+/**
+  type of the mysql_authentication_dialog_ask function
+
+  @param mysql          mysql
+  @param type           type of the input
+                        1 - ordinary string input
+                        2 - password string
+  @param prompt         prompt
+  @param buf            a buffer to store the use input
+  @param buf_len        the length of the buffer
+
+  @retval               a pointer to the user input string.
+                        It may be equal to 'buf' or to 'mysql->password'.
+                        In all other cases it is assumed to be an allocated
+                        string, and the "dialog" plugin will free() it.
+*/
+typedef char *(*mysql_authentication_dialog_ask_t)(struct st_mysql *mysql,
+                      int type, const char *prompt, char *buf, int buf_len);
+
+/********************** remote IO plugin **********************/
+#ifdef HAVE_REMOTEIO
+#include <mariadb/ma_io.h>
+
+/* Remote IO plugin */
+typedef struct st_mysql_client_plugin_REMOTEIO
+{
+  MYSQL_CLIENT_PLUGIN_HEADER
+  struct st_rio_methods *methods;
+} MARIADB_REMOTEIO_PLUGIN;
+#endif
+
+/******** using plugins ************/
+
+/**
+  loads a plugin and initializes it
+
+  @param mysql  MYSQL structure. only MYSQL_PLUGIN_DIR option value is used,
+                and last_errno/last_error, for error reporting
+  @param name   a name of the plugin to load
+  @param type   type of plugin that should be loaded, -1 to disable type check
+  @param argc   number of arguments to pass to the plugin initialization
+                function
+  @param ...    arguments for the plugin initialization function
+
+  @retval
+  a pointer to the loaded plugin, or NULL in case of a failure
+*/
+struct st_mysql_client_plugin *
+mysql_load_plugin(struct st_mysql *mysql, const char *name, int type,
+                  int argc, ...);
+
+/**
+  loads a plugin and initializes it, taking va_list as an argument
+
+  This is the same as mysql_load_plugin, but take va_list instead of
+  a list of arguments.
+
+  @param mysql  MYSQL structure. only MYSQL_PLUGIN_DIR option value is used,
+                and last_errno/last_error, for error reporting
+  @param name   a name of the plugin to load
+  @param type   type of plugin that should be loaded, -1 to disable type check
+  @param argc   number of arguments to pass to the plugin initialization
+                function
+  @param args   arguments for the plugin initialization function
+
+  @retval
+  a pointer to the loaded plugin, or NULL in case of a failure
+*/
+struct st_mysql_client_plugin * STDCALL
+mysql_load_plugin_v(struct st_mysql *mysql, const char *name, int type,
+                    int argc, va_list args);
+
+/**
+  finds an already loaded plugin by name, or loads it, if necessary
+
+  @param mysql  MYSQL structure. only MYSQL_PLUGIN_DIR option value is used,
+                and last_errno/last_error, for error reporting
+  @param name   a name of the plugin to load
+  @param type   type of plugin that should be loaded
+
+  @retval
+  a pointer to the plugin, or NULL in case of a failure
+*/
+struct st_mysql_client_plugin * STDCALL
+mysql_client_find_plugin(struct st_mysql *mysql, const char *name, int type);
+
+/**
+  adds a plugin structure to the list of loaded plugins
+
+  This is useful if an application has the necessary functionality
+  (for example, a special load data handler) statically linked into
+  the application binary. It can use this function to register the plugin
+  directly, avoiding the need to factor it out into a shared object.
+
+  @param mysql  MYSQL structure. It is only used for error reporting
+  @param plugin an st_mysql_client_plugin structure to register
+
+  @retval
+  a pointer to the plugin, or NULL in case of a failure
+*/
+struct st_mysql_client_plugin * STDCALL
+mysql_client_register_plugin(struct st_mysql *mysql,
+                             struct st_mysql_client_plugin *plugin);
+
+extern struct st_mysql_client_plugin *mysql_client_builtins[];
+
+#endif
+
+

+ 107 - 0
mariadb.mod/include/mysql/plugin_auth.h

@@ -0,0 +1,107 @@
+#ifndef MYSQL_PLUGIN_AUTH_COMMON_INCLUDED
+/* Copyright (C) 2010 Sergei Golubchik and Monty Program Ab
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+/**
+  @file
+
+  This file defines constants and data structures that are the same for
+  both client- and server-side authentication plugins.
+*/
+#define MYSQL_PLUGIN_AUTH_COMMON_INCLUDED
+
+/** the max allowed length for a user name */
+#define MYSQL_USERNAME_LENGTH 512
+
+/**
+  return values of the plugin authenticate_user() method.
+*/
+
+/**
+  Authentication failed. Additionally, all other CR_xxx values
+  (libmariadb error code) can be used too.
+
+  The client plugin may set the error code and the error message directly
+  in the MYSQL structure and return CR_ERROR. If a CR_xxx specific error
+  code was returned, an error message in the MYSQL structure will be
+  overwritten. If CR_ERROR is returned without setting the error in MYSQL,
+  CR_UNKNOWN_ERROR will be user.
+*/
+#define CR_ERROR 0
+/**
+  Authentication (client part) was successful. It does not mean that the
+  authentication as a whole was successful, usually it only means
+  that the client was able to send the user name and the password to the
+  server. If CR_OK is returned, the libmariadb reads the next packet expecting
+  it to be one of OK, ERROR, or CHANGE_PLUGIN packets.
+*/
+#define CR_OK -1
+/**
+  Authentication was successful.
+  It means that the client has done its part successfully and also that
+  a plugin has read the last packet (one of OK, ERROR, CHANGE_PLUGIN).
+  In this case, libmariadb will not read a packet from the server,
+  but it will use the data at mysql->net.read_pos.
+
+  A plugin may return this value if the number of roundtrips in the
+  authentication protocol is not known in advance, and the client plugin
+  needs to read one packet more to determine if the authentication is finished
+  or not.
+*/
+#define CR_OK_HANDSHAKE_COMPLETE -2
+
+typedef struct st_plugin_vio_info
+{
+  enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET,
+         MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol;
+  int socket;     /**< it's set, if the protocol is SOCKET or TCP */
+#ifdef _WIN32
+  HANDLE handle;  /**< it's set, if the protocol is PIPE or MEMORY */
+#endif
+} MYSQL_PLUGIN_VIO_INFO;
+
+/**
+  Provides plugin access to communication channel
+*/
+typedef struct st_plugin_vio
+{
+  /**
+    Plugin provides a pointer reference and this function sets it to the
+    contents of any incoming packet. Returns the packet length, or -1 if
+    the plugin should terminate.
+  */
+  int (*read_packet)(struct st_plugin_vio *vio, 
+                     unsigned char **buf);
+  
+  /**
+    Plugin provides a buffer with data and the length and this
+    function sends it as a packet. Returns 0 on success, 1 on failure.
+  */
+  int (*write_packet)(struct st_plugin_vio *vio, 
+                      const unsigned char *packet, 
+                      int packet_len);
+
+  /**
+    Fills in a st_plugin_vio_info structure, providing the information
+    about the connection.
+  */
+  void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info);
+
+} MYSQL_PLUGIN_VIO;
+
+#endif
+

+ 110 - 0
mariadb.mod/include/mysql/plugin_auth_common.h

@@ -0,0 +1,110 @@
+/* Copyright (C) 2010 Sergei Golubchik and Monty Program Ab
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02111-1301, USA */
+
+
+#ifndef MYSQL_PLUGIN_AUTH_COMMON_INCLUDED
+/**
+  @file
+
+  This file defines constants and data structures that are the same for
+  both client- and server-side authentication plugins.
+*/
+#define MYSQL_PLUGIN_AUTH_COMMON_INCLUDED
+
+/** the max allowed length for a user name */
+#define MYSQL_USERNAME_LENGTH 512
+
+/**
+  return values of the plugin authenticate_user() method.
+*/
+
+/**
+  Authentication failed. Additionally, all other CR_xxx values
+  (libmariadb error code) can be used too.
+
+  The client plugin may set the error code and the error message directly
+  in the MYSQL structure and return CR_ERROR. If a CR_xxx specific error
+  code was returned, an error message in the MYSQL structure will be
+  overwritten. If CR_ERROR is returned without setting the error in MYSQL,
+  CR_UNKNOWN_ERROR will be user.
+*/
+#define CR_ERROR 0
+/**
+  Authentication (client part) was successful. It does not mean that the
+  authentication as a whole was successful, usually it only means
+  that the client was able to send the user name and the password to the
+  server. If CR_OK is returned, the libmariadb reads the next packet expecting
+  it to be one of OK, ERROR, or CHANGE_PLUGIN packets.
+*/
+#define CR_OK -1
+/**
+  Authentication was successful.
+  It means that the client has done its part successfully and also that
+  a plugin has read the last packet (one of OK, ERROR, CHANGE_PLUGIN).
+  In this case, libmariadb will not read a packet from the server,
+  but it will use the data at mysql->net.read_pos.
+
+  A plugin may return this value if the number of roundtrips in the
+  authentication protocol is not known in advance, and the client plugin
+  needs to read one packet more to determine if the authentication is finished
+  or not.
+*/
+#define CR_OK_HANDSHAKE_COMPLETE -2
+
+typedef struct st_plugin_vio_info
+{
+  enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET,
+         MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol;
+#ifndef _WIN32
+  int socket;     /**< it's set, if the protocol is SOCKET or TCP */
+#else
+  SOCKET socket;     /**< it's set, if the protocol is SOCKET or TCP */
+  HANDLE handle;  /**< it's set, if the protocol is PIPE or MEMORY */
+#endif
+} MYSQL_PLUGIN_VIO_INFO;
+
+/**
+  Provides plugin access to communication channel
+*/
+typedef struct st_plugin_vio
+{
+  /**
+    Plugin provides a pointer reference and this function sets it to the
+    contents of any incoming packet. Returns the packet length, or -1 if
+    the plugin should terminate.
+  */
+  int (*read_packet)(struct st_plugin_vio *vio, 
+                     unsigned char **buf);
+  
+  /**
+    Plugin provides a buffer with data and the length and this
+    function sends it as a packet. Returns 0 on success, 1 on failure.
+  */
+  int (*write_packet)(struct st_plugin_vio *vio, 
+                      const unsigned char *packet, 
+                      int packet_len);
+
+  /**
+    Fills in a st_plugin_vio_info structure, providing the information
+    about the connection.
+  */
+  void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info);
+
+} MYSQL_PLUGIN_VIO;
+
+#endif
+

+ 1234 - 0
mariadb.mod/include/mysqld_error.h

@@ -0,0 +1,1234 @@
+/* Autogenerated file, please don't edit */
+
+#ifndef ER_ERROR_FIRST
+#define ER_ERROR_FIRST 1000
+#define ER_HASHCHK 1000
+#define ER_NISAMCHK 1001
+#define ER_NO 1002
+#define ER_YES 1003
+#define ER_CANT_CREATE_FILE 1004
+#define ER_CANT_CREATE_TABLE 1005
+#define ER_CANT_CREATE_DB 1006
+#define ER_DB_CREATE_EXISTS 1007
+#define ER_DB_DROP_EXISTS 1008
+#define ER_DB_DROP_DELETE 1009
+#define ER_DB_DROP_RMDIR 1010
+#define ER_CANT_DELETE_FILE 1011
+#define ER_CANT_FIND_SYSTEM_REC 1012
+#define ER_CANT_GET_STAT 1013
+#define ER_CANT_GET_WD 1014
+#define ER_CANT_LOCK 1015
+#define ER_CANT_OPEN_FILE 1016
+#define ER_FILE_NOT_FOUND 1017
+#define ER_CANT_READ_DIR 1018
+#define ER_CANT_SET_WD 1019
+#define ER_CHECKREAD 1020
+#define ER_DISK_FULL 1021
+#define ER_DUP_KEY 1022
+#define ER_ERROR_ON_CLOSE 1023
+#define ER_ERROR_ON_READ 1024
+#define ER_ERROR_ON_RENAME 1025
+#define ER_ERROR_ON_WRITE 1026
+#define ER_FILE_USED 1027
+#define ER_FILSORT_ABORT 1028
+#define ER_FORM_NOT_FOUND 1029
+#define ER_GET_ERRNO 1030
+#define ER_ILLEGAL_HA 1031
+#define ER_KEY_NOT_FOUND 1032
+#define ER_NOT_FORM_FILE 1033
+#define ER_NOT_KEYFILE 1034
+#define ER_OLD_KEYFILE 1035
+#define ER_OPEN_AS_READONLY 1036
+#define ER_OUTOFMEMORY 1037
+#define ER_OUT_OF_SORTMEMORY 1038
+#define ER_UNEXPECTED_EOF 1039
+#define ER_CON_COUNT_ERROR 1040
+#define ER_OUT_OF_RESOURCES 1041
+#define ER_BAD_HOST_ERROR 1042
+#define ER_HANDSHAKE_ERROR 1043
+#define ER_DBACCESS_DENIED_ERROR 1044
+#define ER_ACCESS_DENIED_ERROR 1045
+#define ER_NO_DB_ERROR 1046
+#define ER_UNKNOWN_COM_ERROR 1047
+#define ER_BAD_NULL_ERROR 1048
+#define ER_BAD_DB_ERROR 1049
+#define ER_TABLE_EXISTS_ERROR 1050
+#define ER_BAD_TABLE_ERROR 1051
+#define ER_NON_UNIQ_ERROR 1052
+#define ER_SERVER_SHUTDOWN 1053
+#define ER_BAD_FIELD_ERROR 1054
+#define ER_WRONG_FIELD_WITH_GROUP 1055
+#define ER_WRONG_GROUP_FIELD 1056
+#define ER_WRONG_SUM_SELECT 1057
+#define ER_WRONG_VALUE_COUNT 1058
+#define ER_TOO_LONG_IDENT 1059
+#define ER_DUP_FIELDNAME 1060
+#define ER_DUP_KEYNAME 1061
+#define ER_DUP_ENTRY 1062
+#define ER_WRONG_FIELD_SPEC 1063
+#define ER_PARSE_ERROR 1064
+#define ER_EMPTY_QUERY 1065
+#define ER_NONUNIQ_TABLE 1066
+#define ER_INVALID_DEFAULT 1067
+#define ER_MULTIPLE_PRI_KEY 1068
+#define ER_TOO_MANY_KEYS 1069
+#define ER_TOO_MANY_KEY_PARTS 1070
+#define ER_TOO_LONG_KEY 1071
+#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072
+#define ER_BLOB_USED_AS_KEY 1073
+#define ER_TOO_BIG_FIELDLENGTH 1074
+#define ER_WRONG_AUTO_KEY 1075
+#define ER_BINLOG_CANT_DELETE_GTID_DOMAIN 1076
+#define ER_NORMAL_SHUTDOWN 1077
+#define ER_GOT_SIGNAL 1078
+#define ER_SHUTDOWN_COMPLETE 1079
+#define ER_FORCING_CLOSE 1080
+#define ER_IPSOCK_ERROR 1081
+#define ER_NO_SUCH_INDEX 1082
+#define ER_WRONG_FIELD_TERMINATORS 1083
+#define ER_BLOBS_AND_NO_TERMINATED 1084
+#define ER_TEXTFILE_NOT_READABLE 1085
+#define ER_FILE_EXISTS_ERROR 1086
+#define ER_LOAD_INFO 1087
+#define ER_ALTER_INFO 1088
+#define ER_WRONG_SUB_KEY 1089
+#define ER_CANT_REMOVE_ALL_FIELDS 1090
+#define ER_CANT_DROP_FIELD_OR_KEY 1091
+#define ER_INSERT_INFO 1092
+#define ER_UPDATE_TABLE_USED 1093
+#define ER_NO_SUCH_THREAD 1094
+#define ER_KILL_DENIED_ERROR 1095
+#define ER_NO_TABLES_USED 1096
+#define ER_TOO_BIG_SET 1097
+#define ER_NO_UNIQUE_LOGFILE 1098
+#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099
+#define ER_TABLE_NOT_LOCKED 1100
+#define ER_UNUSED_17 1101
+#define ER_WRONG_DB_NAME 1102
+#define ER_WRONG_TABLE_NAME 1103
+#define ER_TOO_BIG_SELECT 1104
+#define ER_UNKNOWN_ERROR 1105
+#define ER_UNKNOWN_PROCEDURE 1106
+#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107
+#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108
+#define ER_UNKNOWN_TABLE 1109
+#define ER_FIELD_SPECIFIED_TWICE 1110
+#define ER_INVALID_GROUP_FUNC_USE 1111
+#define ER_UNSUPPORTED_EXTENSION 1112
+#define ER_TABLE_MUST_HAVE_COLUMNS 1113
+#define ER_RECORD_FILE_FULL 1114
+#define ER_UNKNOWN_CHARACTER_SET 1115
+#define ER_TOO_MANY_TABLES 1116
+#define ER_TOO_MANY_FIELDS 1117
+#define ER_TOO_BIG_ROWSIZE 1118
+#define ER_STACK_OVERRUN 1119
+#define ER_WRONG_OUTER_JOIN 1120
+#define ER_NULL_COLUMN_IN_INDEX 1121
+#define ER_CANT_FIND_UDF 1122
+#define ER_CANT_INITIALIZE_UDF 1123
+#define ER_UDF_NO_PATHS 1124
+#define ER_UDF_EXISTS 1125
+#define ER_CANT_OPEN_LIBRARY 1126
+#define ER_CANT_FIND_DL_ENTRY 1127
+#define ER_FUNCTION_NOT_DEFINED 1128
+#define ER_HOST_IS_BLOCKED 1129
+#define ER_HOST_NOT_PRIVILEGED 1130
+#define ER_PASSWORD_ANONYMOUS_USER 1131
+#define ER_PASSWORD_NOT_ALLOWED 1132
+#define ER_PASSWORD_NO_MATCH 1133
+#define ER_UPDATE_INFO 1134
+#define ER_CANT_CREATE_THREAD 1135
+#define ER_WRONG_VALUE_COUNT_ON_ROW 1136
+#define ER_CANT_REOPEN_TABLE 1137
+#define ER_INVALID_USE_OF_NULL 1138
+#define ER_REGEXP_ERROR 1139
+#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140
+#define ER_NONEXISTING_GRANT 1141
+#define ER_TABLEACCESS_DENIED_ERROR 1142
+#define ER_COLUMNACCESS_DENIED_ERROR 1143
+#define ER_ILLEGAL_GRANT_FOR_TABLE 1144
+#define ER_GRANT_WRONG_HOST_OR_USER 1145
+#define ER_NO_SUCH_TABLE 1146
+#define ER_NONEXISTING_TABLE_GRANT 1147
+#define ER_NOT_ALLOWED_COMMAND 1148
+#define ER_SYNTAX_ERROR 1149
+#define ER_DELAYED_CANT_CHANGE_LOCK 1150
+#define ER_TOO_MANY_DELAYED_THREADS 1151
+#define ER_ABORTING_CONNECTION 1152
+#define ER_NET_PACKET_TOO_LARGE 1153
+#define ER_NET_READ_ERROR_FROM_PIPE 1154
+#define ER_NET_FCNTL_ERROR 1155
+#define ER_NET_PACKETS_OUT_OF_ORDER 1156
+#define ER_NET_UNCOMPRESS_ERROR 1157
+#define ER_NET_READ_ERROR 1158
+#define ER_NET_READ_INTERRUPTED 1159
+#define ER_NET_ERROR_ON_WRITE 1160
+#define ER_NET_WRITE_INTERRUPTED 1161
+#define ER_TOO_LONG_STRING 1162
+#define ER_TABLE_CANT_HANDLE_BLOB 1163
+#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164
+#define ER_DELAYED_INSERT_TABLE_LOCKED 1165
+#define ER_WRONG_COLUMN_NAME 1166
+#define ER_WRONG_KEY_COLUMN 1167
+#define ER_WRONG_MRG_TABLE 1168
+#define ER_DUP_UNIQUE 1169
+#define ER_BLOB_KEY_WITHOUT_LENGTH 1170
+#define ER_PRIMARY_CANT_HAVE_NULL 1171
+#define ER_TOO_MANY_ROWS 1172
+#define ER_REQUIRES_PRIMARY_KEY 1173
+#define ER_NO_RAID_COMPILED 1174
+#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175
+#define ER_KEY_DOES_NOT_EXISTS 1176
+#define ER_CHECK_NO_SUCH_TABLE 1177
+#define ER_CHECK_NOT_IMPLEMENTED 1178
+#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179
+#define ER_ERROR_DURING_COMMIT 1180
+#define ER_ERROR_DURING_ROLLBACK 1181
+#define ER_ERROR_DURING_FLUSH_LOGS 1182
+#define ER_ERROR_DURING_CHECKPOINT 1183
+#define ER_NEW_ABORTING_CONNECTION 1184
+#define ER_UNUSED_10 1185
+#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186
+#define ER_INDEX_REBUILD 1187
+#define ER_MASTER 1188
+#define ER_MASTER_NET_READ 1189
+#define ER_MASTER_NET_WRITE 1190
+#define ER_FT_MATCHING_KEY_NOT_FOUND 1191
+#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192
+#define ER_UNKNOWN_SYSTEM_VARIABLE 1193
+#define ER_CRASHED_ON_USAGE 1194
+#define ER_CRASHED_ON_REPAIR 1195
+#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196
+#define ER_TRANS_CACHE_FULL 1197
+#define ER_SLAVE_MUST_STOP 1198
+#define ER_SLAVE_NOT_RUNNING 1199
+#define ER_BAD_SLAVE 1200
+#define ER_MASTER_INFO 1201
+#define ER_SLAVE_THREAD 1202
+#define ER_TOO_MANY_USER_CONNECTIONS 1203
+#define ER_SET_CONSTANTS_ONLY 1204
+#define ER_LOCK_WAIT_TIMEOUT 1205
+#define ER_LOCK_TABLE_FULL 1206
+#define ER_READ_ONLY_TRANSACTION 1207
+#define ER_DROP_DB_WITH_READ_LOCK 1208
+#define ER_CREATE_DB_WITH_READ_LOCK 1209
+#define ER_WRONG_ARGUMENTS 1210
+#define ER_NO_PERMISSION_TO_CREATE_USER 1211
+#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212
+#define ER_LOCK_DEADLOCK 1213
+#define ER_TABLE_CANT_HANDLE_FT 1214
+#define ER_CANNOT_ADD_FOREIGN 1215
+#define ER_NO_REFERENCED_ROW 1216
+#define ER_ROW_IS_REFERENCED 1217
+#define ER_CONNECT_TO_MASTER 1218
+#define ER_QUERY_ON_MASTER 1219
+#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220
+#define ER_WRONG_USAGE 1221
+#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222
+#define ER_CANT_UPDATE_WITH_READLOCK 1223
+#define ER_MIXING_NOT_ALLOWED 1224
+#define ER_DUP_ARGUMENT 1225
+#define ER_USER_LIMIT_REACHED 1226
+#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227
+#define ER_LOCAL_VARIABLE 1228
+#define ER_GLOBAL_VARIABLE 1229
+#define ER_NO_DEFAULT 1230
+#define ER_WRONG_VALUE_FOR_VAR 1231
+#define ER_WRONG_TYPE_FOR_VAR 1232
+#define ER_VAR_CANT_BE_READ 1233
+#define ER_CANT_USE_OPTION_HERE 1234
+#define ER_NOT_SUPPORTED_YET 1235
+#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236
+#define ER_SLAVE_IGNORED_TABLE 1237
+#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238
+#define ER_WRONG_FK_DEF 1239
+#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240
+#define ER_OPERAND_COLUMNS 1241
+#define ER_SUBQUERY_NO_1_ROW 1242
+#define ER_UNKNOWN_STMT_HANDLER 1243
+#define ER_CORRUPT_HELP_DB 1244
+#define ER_CYCLIC_REFERENCE 1245
+#define ER_AUTO_CONVERT 1246
+#define ER_ILLEGAL_REFERENCE 1247
+#define ER_DERIVED_MUST_HAVE_ALIAS 1248
+#define ER_SELECT_REDUCED 1249
+#define ER_TABLENAME_NOT_ALLOWED_HERE 1250
+#define ER_NOT_SUPPORTED_AUTH_MODE 1251
+#define ER_SPATIAL_CANT_HAVE_NULL 1252
+#define ER_COLLATION_CHARSET_MISMATCH 1253
+#define ER_SLAVE_WAS_RUNNING 1254
+#define ER_SLAVE_WAS_NOT_RUNNING 1255
+#define ER_TOO_BIG_FOR_UNCOMPRESS 1256
+#define ER_ZLIB_Z_MEM_ERROR 1257
+#define ER_ZLIB_Z_BUF_ERROR 1258
+#define ER_ZLIB_Z_DATA_ERROR 1259
+#define ER_CUT_VALUE_GROUP_CONCAT 1260
+#define ER_WARN_TOO_FEW_RECORDS 1261
+#define ER_WARN_TOO_MANY_RECORDS 1262
+#define ER_WARN_NULL_TO_NOTNULL 1263
+#define ER_WARN_DATA_OUT_OF_RANGE 1264
+#define WARN_DATA_TRUNCATED 1265
+#define ER_WARN_USING_OTHER_HANDLER 1266
+#define ER_CANT_AGGREGATE_2COLLATIONS 1267
+#define ER_DROP_USER 1268
+#define ER_REVOKE_GRANTS 1269
+#define ER_CANT_AGGREGATE_3COLLATIONS 1270
+#define ER_CANT_AGGREGATE_NCOLLATIONS 1271
+#define ER_VARIABLE_IS_NOT_STRUCT 1272
+#define ER_UNKNOWN_COLLATION 1273
+#define ER_SLAVE_IGNORED_SSL_PARAMS 1274
+#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275
+#define ER_WARN_FIELD_RESOLVED 1276
+#define ER_BAD_SLAVE_UNTIL_COND 1277
+#define ER_MISSING_SKIP_SLAVE 1278
+#define ER_UNTIL_COND_IGNORED 1279
+#define ER_WRONG_NAME_FOR_INDEX 1280
+#define ER_WRONG_NAME_FOR_CATALOG 1281
+#define ER_WARN_QC_RESIZE 1282
+#define ER_BAD_FT_COLUMN 1283
+#define ER_UNKNOWN_KEY_CACHE 1284
+#define ER_WARN_HOSTNAME_WONT_WORK 1285
+#define ER_UNKNOWN_STORAGE_ENGINE 1286
+#define ER_WARN_DEPRECATED_SYNTAX 1287
+#define ER_NON_UPDATABLE_TABLE 1288
+#define ER_FEATURE_DISABLED 1289
+#define ER_OPTION_PREVENTS_STATEMENT 1290
+#define ER_DUPLICATED_VALUE_IN_TYPE 1291
+#define ER_TRUNCATED_WRONG_VALUE 1292
+#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293
+#define ER_INVALID_ON_UPDATE 1294
+#define ER_UNSUPPORTED_PS 1295
+#define ER_GET_ERRMSG 1296
+#define ER_GET_TEMPORARY_ERRMSG 1297
+#define ER_UNKNOWN_TIME_ZONE 1298
+#define ER_WARN_INVALID_TIMESTAMP 1299
+#define ER_INVALID_CHARACTER_STRING 1300
+#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
+#define ER_CONFLICTING_DECLARATIONS 1302
+#define ER_SP_NO_RECURSIVE_CREATE 1303
+#define ER_SP_ALREADY_EXISTS 1304
+#define ER_SP_DOES_NOT_EXIST 1305
+#define ER_SP_DROP_FAILED 1306
+#define ER_SP_STORE_FAILED 1307
+#define ER_SP_LILABEL_MISMATCH 1308
+#define ER_SP_LABEL_REDEFINE 1309
+#define ER_SP_LABEL_MISMATCH 1310
+#define ER_SP_UNINIT_VAR 1311
+#define ER_SP_BADSELECT 1312
+#define ER_SP_BADRETURN 1313
+#define ER_SP_BADSTATEMENT 1314
+#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1315
+#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1316
+#define ER_QUERY_INTERRUPTED 1317
+#define ER_SP_WRONG_NO_OF_ARGS 1318
+#define ER_SP_COND_MISMATCH 1319
+#define ER_SP_NORETURN 1320
+#define ER_SP_NORETURNEND 1321
+#define ER_SP_BAD_CURSOR_QUERY 1322
+#define ER_SP_BAD_CURSOR_SELECT 1323
+#define ER_SP_CURSOR_MISMATCH 1324
+#define ER_SP_CURSOR_ALREADY_OPEN 1325
+#define ER_SP_CURSOR_NOT_OPEN 1326
+#define ER_SP_UNDECLARED_VAR 1327
+#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1328
+#define ER_SP_FETCH_NO_DATA 1329
+#define ER_SP_DUP_PARAM 1330
+#define ER_SP_DUP_VAR 1331
+#define ER_SP_DUP_COND 1332
+#define ER_SP_DUP_CURS 1333
+#define ER_SP_CANT_ALTER 1334
+#define ER_SP_SUBSELECT_NYI 1335
+#define ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG 1336
+#define ER_SP_VARCOND_AFTER_CURSHNDLR 1337
+#define ER_SP_CURSOR_AFTER_HANDLER 1338
+#define ER_SP_CASE_NOT_FOUND 1339
+#define ER_FPARSER_TOO_BIG_FILE 1340
+#define ER_FPARSER_BAD_HEADER 1341
+#define ER_FPARSER_EOF_IN_COMMENT 1342
+#define ER_FPARSER_ERROR_IN_PARAMETER 1343
+#define ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER 1344
+#define ER_VIEW_NO_EXPLAIN 1345
+#define ER_FRM_UNKNOWN_TYPE 1346
+#define ER_WRONG_OBJECT 1347
+#define ER_NONUPDATEABLE_COLUMN 1348
+#define ER_VIEW_SELECT_DERIVED 1349
+#define ER_VIEW_SELECT_CLAUSE 1350
+#define ER_VIEW_SELECT_VARIABLE 1351
+#define ER_VIEW_SELECT_TMPTABLE 1352
+#define ER_VIEW_WRONG_LIST 1353
+#define ER_WARN_VIEW_MERGE 1354
+#define ER_WARN_VIEW_WITHOUT_KEY 1355
+#define ER_VIEW_INVALID 1356
+#define ER_SP_NO_DROP_SP 1357
+#define ER_SP_GOTO_IN_HNDLR 1358
+#define ER_TRG_ALREADY_EXISTS 1359
+#define ER_TRG_DOES_NOT_EXIST 1360
+#define ER_TRG_ON_VIEW_OR_TEMP_TABLE 1361
+#define ER_TRG_CANT_CHANGE_ROW 1362
+#define ER_TRG_NO_SUCH_ROW_IN_TRG 1363
+#define ER_NO_DEFAULT_FOR_FIELD 1364
+#define ER_DIVISION_BY_ZERO 1365
+#define ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 1366
+#define ER_ILLEGAL_VALUE_FOR_TYPE 1367
+#define ER_VIEW_NONUPD_CHECK 1368
+#define ER_VIEW_CHECK_FAILED 1369
+#define ER_PROCACCESS_DENIED_ERROR 1370
+#define ER_RELAY_LOG_FAIL 1371
+#define ER_PASSWD_LENGTH 1372
+#define ER_UNKNOWN_TARGET_BINLOG 1373
+#define ER_IO_ERR_LOG_INDEX_READ 1374
+#define ER_BINLOG_PURGE_PROHIBITED 1375
+#define ER_FSEEK_FAIL 1376
+#define ER_BINLOG_PURGE_FATAL_ERR 1377
+#define ER_LOG_IN_USE 1378
+#define ER_LOG_PURGE_UNKNOWN_ERR 1379
+#define ER_RELAY_LOG_INIT 1380
+#define ER_NO_BINARY_LOGGING 1381
+#define ER_RESERVED_SYNTAX 1382
+#define ER_WSAS_FAILED 1383
+#define ER_DIFF_GROUPS_PROC 1384
+#define ER_NO_GROUP_FOR_PROC 1385
+#define ER_ORDER_WITH_PROC 1386
+#define ER_LOGGING_PROHIBIT_CHANGING_OF 1387
+#define ER_NO_FILE_MAPPING 1388
+#define ER_WRONG_MAGIC 1389
+#define ER_PS_MANY_PARAM 1390
+#define ER_KEY_PART_0 1391
+#define ER_VIEW_CHECKSUM 1392
+#define ER_VIEW_MULTIUPDATE 1393
+#define ER_VIEW_NO_INSERT_FIELD_LIST 1394
+#define ER_VIEW_DELETE_MERGE_VIEW 1395
+#define ER_CANNOT_USER 1396
+#define ER_XAER_NOTA 1397
+#define ER_XAER_INVAL 1398
+#define ER_XAER_RMFAIL 1399
+#define ER_XAER_OUTSIDE 1400
+#define ER_XAER_RMERR 1401
+#define ER_XA_RBROLLBACK 1402
+#define ER_NONEXISTING_PROC_GRANT 1403
+#define ER_PROC_AUTO_GRANT_FAIL 1404
+#define ER_PROC_AUTO_REVOKE_FAIL 1405
+#define ER_DATA_TOO_LONG 1406
+#define ER_SP_BAD_SQLSTATE 1407
+#define ER_STARTUP 1408
+#define ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR 1409
+#define ER_CANT_CREATE_USER_WITH_GRANT 1410
+#define ER_WRONG_VALUE_FOR_TYPE 1411
+#define ER_TABLE_DEF_CHANGED 1412
+#define ER_SP_DUP_HANDLER 1413
+#define ER_SP_NOT_VAR_ARG 1414
+#define ER_SP_NO_RETSET 1415
+#define ER_CANT_CREATE_GEOMETRY_OBJECT 1416
+#define ER_FAILED_ROUTINE_BREAK_BINLOG 1417
+#define ER_BINLOG_UNSAFE_ROUTINE 1418
+#define ER_BINLOG_CREATE_ROUTINE_NEED_SUPER 1419
+#define ER_EXEC_STMT_WITH_OPEN_CURSOR 1420
+#define ER_STMT_HAS_NO_OPEN_CURSOR 1421
+#define ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG 1422
+#define ER_NO_DEFAULT_FOR_VIEW_FIELD 1423
+#define ER_SP_NO_RECURSION 1424
+#define ER_TOO_BIG_SCALE 1425
+#define ER_TOO_BIG_PRECISION 1426
+#define ER_M_BIGGER_THAN_D 1427
+#define ER_WRONG_LOCK_OF_SYSTEM_TABLE 1428
+#define ER_CONNECT_TO_FOREIGN_DATA_SOURCE 1429
+#define ER_QUERY_ON_FOREIGN_DATA_SOURCE 1430
+#define ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST 1431
+#define ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE 1432
+#define ER_FOREIGN_DATA_STRING_INVALID 1433
+#define ER_CANT_CREATE_FEDERATED_TABLE 1434
+#define ER_TRG_IN_WRONG_SCHEMA 1435
+#define ER_STACK_OVERRUN_NEED_MORE 1436
+#define ER_TOO_LONG_BODY 1437
+#define ER_WARN_CANT_DROP_DEFAULT_KEYCACHE 1438
+#define ER_TOO_BIG_DISPLAYWIDTH 1439
+#define ER_XAER_DUPID 1440
+#define ER_DATETIME_FUNCTION_OVERFLOW 1441
+#define ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG 1442
+#define ER_VIEW_PREVENT_UPDATE 1443
+#define ER_PS_NO_RECURSION 1444
+#define ER_SP_CANT_SET_AUTOCOMMIT 1445
+#define ER_MALFORMED_DEFINER 1446
+#define ER_VIEW_FRM_NO_USER 1447
+#define ER_VIEW_OTHER_USER 1448
+#define ER_NO_SUCH_USER 1449
+#define ER_FORBID_SCHEMA_CHANGE 1450
+#define ER_ROW_IS_REFERENCED_2 1451
+#define ER_NO_REFERENCED_ROW_2 1452
+#define ER_SP_BAD_VAR_SHADOW 1453
+#define ER_TRG_NO_DEFINER 1454
+#define ER_OLD_FILE_FORMAT 1455
+#define ER_SP_RECURSION_LIMIT 1456
+#define ER_SP_PROC_TABLE_CORRUPT 1457
+#define ER_SP_WRONG_NAME 1458
+#define ER_TABLE_NEEDS_UPGRADE 1459
+#define ER_SP_NO_AGGREGATE 1460
+#define ER_MAX_PREPARED_STMT_COUNT_REACHED 1461
+#define ER_VIEW_RECURSIVE 1462
+#define ER_NON_GROUPING_FIELD_USED 1463
+#define ER_TABLE_CANT_HANDLE_SPKEYS 1464
+#define ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA 1465
+#define ER_REMOVED_SPACES 1466
+#define ER_AUTOINC_READ_FAILED 1467
+#define ER_USERNAME 1468
+#define ER_HOSTNAME 1469
+#define ER_WRONG_STRING_LENGTH 1470
+#define ER_NON_INSERTABLE_TABLE 1471
+#define ER_ADMIN_WRONG_MRG_TABLE 1472
+#define ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT 1473
+#define ER_NAME_BECOMES_EMPTY 1474
+#define ER_AMBIGUOUS_FIELD_TERM 1475
+#define ER_FOREIGN_SERVER_EXISTS 1476
+#define ER_FOREIGN_SERVER_DOESNT_EXIST 1477
+#define ER_ILLEGAL_HA_CREATE_OPTION 1478
+#define ER_PARTITION_REQUIRES_VALUES_ERROR 1479
+#define ER_PARTITION_WRONG_VALUES_ERROR 1480
+#define ER_PARTITION_MAXVALUE_ERROR 1481
+#define ER_PARTITION_SUBPARTITION_ERROR 1482
+#define ER_PARTITION_SUBPART_MIX_ERROR 1483
+#define ER_PARTITION_WRONG_NO_PART_ERROR 1484
+#define ER_PARTITION_WRONG_NO_SUBPART_ERROR 1485
+#define ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR 1486
+#define ER_NOT_CONSTANT_EXPRESSION 1487
+#define ER_FIELD_NOT_FOUND_PART_ERROR 1488
+#define ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR 1489
+#define ER_INCONSISTENT_PARTITION_INFO_ERROR 1490
+#define ER_PARTITION_FUNC_NOT_ALLOWED_ERROR 1491
+#define ER_PARTITIONS_MUST_BE_DEFINED_ERROR 1492
+#define ER_RANGE_NOT_INCREASING_ERROR 1493
+#define ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR 1494
+#define ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR 1495
+#define ER_PARTITION_ENTRY_ERROR 1496
+#define ER_MIX_HANDLER_ERROR 1497
+#define ER_PARTITION_NOT_DEFINED_ERROR 1498
+#define ER_TOO_MANY_PARTITIONS_ERROR 1499
+#define ER_SUBPARTITION_ERROR 1500
+#define ER_CANT_CREATE_HANDLER_FILE 1501
+#define ER_BLOB_FIELD_IN_PART_FUNC_ERROR 1502
+#define ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF 1503
+#define ER_NO_PARTS_ERROR 1504
+#define ER_PARTITION_MGMT_ON_NONPARTITIONED 1505
+#define ER_FEATURE_NOT_SUPPORTED_WITH_PARTITIONING 1506
+#define ER_DROP_PARTITION_NON_EXISTENT 1507
+#define ER_DROP_LAST_PARTITION 1508
+#define ER_COALESCE_ONLY_ON_HASH_PARTITION 1509
+#define ER_REORG_HASH_ONLY_ON_SAME_NO 1510
+#define ER_REORG_NO_PARAM_ERROR 1511
+#define ER_ONLY_ON_RANGE_LIST_PARTITION 1512
+#define ER_ADD_PARTITION_SUBPART_ERROR 1513
+#define ER_ADD_PARTITION_NO_NEW_PARTITION 1514
+#define ER_COALESCE_PARTITION_NO_PARTITION 1515
+#define ER_REORG_PARTITION_NOT_EXIST 1516
+#define ER_SAME_NAME_PARTITION 1517
+#define ER_NO_BINLOG_ERROR 1518
+#define ER_CONSECUTIVE_REORG_PARTITIONS 1519
+#define ER_REORG_OUTSIDE_RANGE 1520
+#define ER_PARTITION_FUNCTION_FAILURE 1521
+#define ER_PART_STATE_ERROR 1522
+#define ER_LIMITED_PART_RANGE 1523
+#define ER_PLUGIN_IS_NOT_LOADED 1524
+#define ER_WRONG_VALUE 1525
+#define ER_NO_PARTITION_FOR_GIVEN_VALUE 1526
+#define ER_FILEGROUP_OPTION_ONLY_ONCE 1527
+#define ER_CREATE_FILEGROUP_FAILED 1528
+#define ER_DROP_FILEGROUP_FAILED 1529
+#define ER_TABLESPACE_AUTO_EXTEND_ERROR 1530
+#define ER_WRONG_SIZE_NUMBER 1531
+#define ER_SIZE_OVERFLOW_ERROR 1532
+#define ER_ALTER_FILEGROUP_FAILED 1533
+#define ER_BINLOG_ROW_LOGGING_FAILED 1534
+#define ER_BINLOG_ROW_WRONG_TABLE_DEF 1535
+#define ER_BINLOG_ROW_RBR_TO_SBR 1536
+#define ER_EVENT_ALREADY_EXISTS 1537
+#define ER_EVENT_STORE_FAILED 1538
+#define ER_EVENT_DOES_NOT_EXIST 1539
+#define ER_EVENT_CANT_ALTER 1540
+#define ER_EVENT_DROP_FAILED 1541
+#define ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG 1542
+#define ER_EVENT_ENDS_BEFORE_STARTS 1543
+#define ER_EVENT_EXEC_TIME_IN_THE_PAST 1544
+#define ER_EVENT_OPEN_TABLE_FAILED 1545
+#define ER_EVENT_NEITHER_M_EXPR_NOR_M_AT 1546
+#define ER_UNUSED_2 1547
+#define ER_UNUSED_3 1548
+#define ER_EVENT_CANNOT_DELETE 1549
+#define ER_EVENT_COMPILE_ERROR 1550
+#define ER_EVENT_SAME_NAME 1551
+#define ER_EVENT_DATA_TOO_LONG 1552
+#define ER_DROP_INDEX_FK 1553
+#define ER_WARN_DEPRECATED_SYNTAX_WITH_VER 1554
+#define ER_CANT_WRITE_LOCK_LOG_TABLE 1555
+#define ER_CANT_LOCK_LOG_TABLE 1556
+#define ER_UNUSED_4 1557
+#define ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE 1558
+#define ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR 1559
+#define ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT 1560
+#define ER_UNUSED_13 1561
+#define ER_PARTITION_NO_TEMPORARY 1562
+#define ER_PARTITION_CONST_DOMAIN_ERROR 1563
+#define ER_PARTITION_FUNCTION_IS_NOT_ALLOWED 1564
+#define ER_DDL_LOG_ERROR 1565
+#define ER_NULL_IN_VALUES_LESS_THAN 1566
+#define ER_WRONG_PARTITION_NAME 1567
+#define ER_CANT_CHANGE_TX_CHARACTERISTICS 1568
+#define ER_DUP_ENTRY_AUTOINCREMENT_CASE 1569
+#define ER_EVENT_MODIFY_QUEUE_ERROR 1570
+#define ER_EVENT_SET_VAR_ERROR 1571
+#define ER_PARTITION_MERGE_ERROR 1572
+#define ER_CANT_ACTIVATE_LOG 1573
+#define ER_RBR_NOT_AVAILABLE 1574
+#define ER_BASE64_DECODE_ERROR 1575
+#define ER_EVENT_RECURSION_FORBIDDEN 1576
+#define ER_EVENTS_DB_ERROR 1577
+#define ER_ONLY_INTEGERS_ALLOWED 1578
+#define ER_UNSUPORTED_LOG_ENGINE 1579
+#define ER_BAD_LOG_STATEMENT 1580
+#define ER_CANT_RENAME_LOG_TABLE 1581
+#define ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT 1582
+#define ER_WRONG_PARAMETERS_TO_NATIVE_FCT 1583
+#define ER_WRONG_PARAMETERS_TO_STORED_FCT 1584
+#define ER_NATIVE_FCT_NAME_COLLISION 1585
+#define ER_DUP_ENTRY_WITH_KEY_NAME 1586
+#define ER_BINLOG_PURGE_EMFILE 1587
+#define ER_EVENT_CANNOT_CREATE_IN_THE_PAST 1588
+#define ER_EVENT_CANNOT_ALTER_IN_THE_PAST 1589
+#define ER_SLAVE_INCIDENT 1590
+#define ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT 1591
+#define ER_BINLOG_UNSAFE_STATEMENT 1592
+#define ER_SLAVE_FATAL_ERROR 1593
+#define ER_SLAVE_RELAY_LOG_READ_FAILURE 1594
+#define ER_SLAVE_RELAY_LOG_WRITE_FAILURE 1595
+#define ER_SLAVE_CREATE_EVENT_FAILURE 1596
+#define ER_SLAVE_MASTER_COM_FAILURE 1597
+#define ER_BINLOG_LOGGING_IMPOSSIBLE 1598
+#define ER_VIEW_NO_CREATION_CTX 1599
+#define ER_VIEW_INVALID_CREATION_CTX 1600
+#define ER_SR_INVALID_CREATION_CTX 1601
+#define ER_TRG_CORRUPTED_FILE 1602
+#define ER_TRG_NO_CREATION_CTX 1603
+#define ER_TRG_INVALID_CREATION_CTX 1604
+#define ER_EVENT_INVALID_CREATION_CTX 1605
+#define ER_TRG_CANT_OPEN_TABLE 1606
+#define ER_CANT_CREATE_SROUTINE 1607
+#define ER_UNUSED_11 1608
+#define ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT 1609
+#define ER_SLAVE_CORRUPT_EVENT 1610
+#define ER_LOAD_DATA_INVALID_COLUMN 1611
+#define ER_LOG_PURGE_NO_FILE 1612
+#define ER_XA_RBTIMEOUT 1613
+#define ER_XA_RBDEADLOCK 1614
+#define ER_NEED_REPREPARE 1615
+#define ER_DELAYED_NOT_SUPPORTED 1616
+#define WARN_NO_MASTER_INFO 1617
+#define WARN_OPTION_IGNORED 1618
+#define ER_PLUGIN_DELETE_BUILTIN 1619
+#define WARN_PLUGIN_BUSY 1620
+#define ER_VARIABLE_IS_READONLY 1621
+#define ER_WARN_ENGINE_TRANSACTION_ROLLBACK 1622
+#define ER_SLAVE_HEARTBEAT_FAILURE 1623
+#define ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE 1624
+#define ER_UNUSED_14 1625
+#define ER_CONFLICT_FN_PARSE_ERROR 1626
+#define ER_EXCEPTIONS_WRITE_ERROR 1627
+#define ER_TOO_LONG_TABLE_COMMENT 1628
+#define ER_TOO_LONG_FIELD_COMMENT 1629
+#define ER_FUNC_INEXISTENT_NAME_COLLISION 1630
+#define ER_DATABASE_NAME 1631
+#define ER_TABLE_NAME 1632
+#define ER_PARTITION_NAME 1633
+#define ER_SUBPARTITION_NAME 1634
+#define ER_TEMPORARY_NAME 1635
+#define ER_RENAMED_NAME 1636
+#define ER_TOO_MANY_CONCURRENT_TRXS 1637
+#define WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED 1638
+#define ER_DEBUG_SYNC_TIMEOUT 1639
+#define ER_DEBUG_SYNC_HIT_LIMIT 1640
+#define ER_DUP_SIGNAL_SET 1641
+#define ER_SIGNAL_WARN 1642
+#define ER_SIGNAL_NOT_FOUND 1643
+#define ER_SIGNAL_EXCEPTION 1644
+#define ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER 1645
+#define ER_SIGNAL_BAD_CONDITION_TYPE 1646
+#define WARN_COND_ITEM_TRUNCATED 1647
+#define ER_COND_ITEM_TOO_LONG 1648
+#define ER_UNKNOWN_LOCALE 1649
+#define ER_SLAVE_IGNORE_SERVER_IDS 1650
+#define ER_QUERY_CACHE_DISABLED 1651
+#define ER_SAME_NAME_PARTITION_FIELD 1652
+#define ER_PARTITION_COLUMN_LIST_ERROR 1653
+#define ER_WRONG_TYPE_COLUMN_VALUE_ERROR 1654
+#define ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR 1655
+#define ER_MAXVALUE_IN_VALUES_IN 1656
+#define ER_TOO_MANY_VALUES_ERROR 1657
+#define ER_ROW_SINGLE_PARTITION_FIELD_ERROR 1658
+#define ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD 1659
+#define ER_PARTITION_FIELDS_TOO_LONG 1660
+#define ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE 1661
+#define ER_BINLOG_ROW_MODE_AND_STMT_ENGINE 1662
+#define ER_BINLOG_UNSAFE_AND_STMT_ENGINE 1663
+#define ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE 1664
+#define ER_BINLOG_STMT_MODE_AND_ROW_ENGINE 1665
+#define ER_BINLOG_ROW_INJECTION_AND_STMT_MODE 1666
+#define ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE 1667
+#define ER_BINLOG_UNSAFE_LIMIT 1668
+#define ER_BINLOG_UNSAFE_INSERT_DELAYED 1669
+#define ER_BINLOG_UNSAFE_SYSTEM_TABLE 1670
+#define ER_BINLOG_UNSAFE_AUTOINC_COLUMNS 1671
+#define ER_BINLOG_UNSAFE_UDF 1672
+#define ER_BINLOG_UNSAFE_SYSTEM_VARIABLE 1673
+#define ER_BINLOG_UNSAFE_SYSTEM_FUNCTION 1674
+#define ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS 1675
+#define ER_MESSAGE_AND_STATEMENT 1676
+#define ER_SLAVE_CONVERSION_FAILED 1677
+#define ER_SLAVE_CANT_CREATE_CONVERSION 1678
+#define ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT 1679
+#define ER_PATH_LENGTH 1680
+#define ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT 1681
+#define ER_WRONG_NATIVE_TABLE_STRUCTURE 1682
+#define ER_WRONG_PERFSCHEMA_USAGE 1683
+#define ER_WARN_I_S_SKIPPED_TABLE 1684
+#define ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT 1685
+#define ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT 1686
+#define ER_SPATIAL_MUST_HAVE_GEOM_COL 1687
+#define ER_TOO_LONG_INDEX_COMMENT 1688
+#define ER_LOCK_ABORTED 1689
+#define ER_DATA_OUT_OF_RANGE 1690
+#define ER_WRONG_SPVAR_TYPE_IN_LIMIT 1691
+#define ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE 1692
+#define ER_BINLOG_UNSAFE_MIXED_STATEMENT 1693
+#define ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN 1694
+#define ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN 1695
+#define ER_FAILED_READ_FROM_PAR_FILE 1696
+#define ER_VALUES_IS_NOT_INT_TYPE_ERROR 1697
+#define ER_ACCESS_DENIED_NO_PASSWORD_ERROR 1698
+#define ER_SET_PASSWORD_AUTH_PLUGIN 1699
+#define ER_GRANT_PLUGIN_USER_EXISTS 1700
+#define ER_TRUNCATE_ILLEGAL_FK 1701
+#define ER_PLUGIN_IS_PERMANENT 1702
+#define ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN 1703
+#define ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX 1704
+#define ER_STMT_CACHE_FULL 1705
+#define ER_MULTI_UPDATE_KEY_CONFLICT 1706
+#define ER_TABLE_NEEDS_REBUILD 1707
+#define WARN_OPTION_BELOW_LIMIT 1708
+#define ER_INDEX_COLUMN_TOO_LONG 1709
+#define ER_ERROR_IN_TRIGGER_BODY 1710
+#define ER_ERROR_IN_UNKNOWN_TRIGGER_BODY 1711
+#define ER_INDEX_CORRUPT 1712
+#define ER_UNDO_RECORD_TOO_BIG 1713
+#define ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT 1714
+#define ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE 1715
+#define ER_BINLOG_UNSAFE_REPLACE_SELECT 1716
+#define ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT 1717
+#define ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT 1718
+#define ER_BINLOG_UNSAFE_UPDATE_IGNORE 1719
+#define ER_UNUSED_15 1720
+#define ER_UNUSED_16 1721
+#define ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT 1722
+#define ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC 1723
+#define ER_BINLOG_UNSAFE_INSERT_TWO_KEYS 1724
+#define ER_UNUSED_28 1725
+#define ER_UNUSED_1 1726
+#define ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST 1727
+#define ER_CANNOT_LOAD_FROM_TABLE_V2 1728
+#define ER_MASTER_DELAY_VALUE_OUT_OF_RANGE 1729
+#define ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT 1730
+#define ER_PARTITION_EXCHANGE_DIFFERENT_OPTION 1731
+#define ER_PARTITION_EXCHANGE_PART_TABLE 1732
+#define ER_PARTITION_EXCHANGE_TEMP_TABLE 1733
+#define ER_PARTITION_INSTEAD_OF_SUBPARTITION 1734
+#define ER_UNKNOWN_PARTITION 1735
+#define ER_TABLES_DIFFERENT_METADATA 1736
+#define ER_ROW_DOES_NOT_MATCH_PARTITION 1737
+#define ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX 1738
+#define ER_WARN_INDEX_NOT_APPLICABLE 1739
+#define ER_PARTITION_EXCHANGE_FOREIGN_KEY 1740
+#define ER_NO_SUCH_KEY_VALUE 1741
+#define ER_VALUE_TOO_LONG 1742
+#define ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE 1743
+#define ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE 1744
+#define ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX 1745
+#define ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT 1746
+#define ER_PARTITION_CLAUSE_ON_NONPARTITIONED 1747
+#define ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET 1748
+#define ER_UNUSED_5 1749
+#define ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE 1750
+#define ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE 1751
+#define ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE 1752
+#define ER_MTS_FEATURE_IS_NOT_SUPPORTED 1753
+#define ER_MTS_UPDATED_DBS_GREATER_MAX 1754
+#define ER_MTS_CANT_PARALLEL 1755
+#define ER_MTS_INCONSISTENT_DATA 1756
+#define ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING 1757
+#define ER_DA_INVALID_CONDITION_NUMBER 1758
+#define ER_INSECURE_PLAIN_TEXT 1759
+#define ER_INSECURE_CHANGE_MASTER 1760
+#define ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO 1761
+#define ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO 1762
+#define ER_SQLTHREAD_WITH_SECURE_SLAVE 1763
+#define ER_TABLE_HAS_NO_FT 1764
+#define ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER 1765
+#define ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION 1766
+#define ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST 1767
+#define ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL 1768
+#define ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION 1769
+#define ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL 1770
+#define ER_SKIPPING_LOGGED_TRANSACTION 1771
+#define ER_MALFORMED_GTID_SET_SPECIFICATION 1772
+#define ER_MALFORMED_GTID_SET_ENCODING 1773
+#define ER_MALFORMED_GTID_SPECIFICATION 1774
+#define ER_GNO_EXHAUSTED 1775
+#define ER_BAD_SLAVE_AUTO_POSITION 1776
+#define ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON 1777
+#define ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET 1778
+#define ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON 1779
+#define ER_GTID_MODE_REQUIRES_BINLOG 1780
+#define ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF 1781
+#define ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON 1782
+#define ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF 1783
+#define ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF 1784
+#define ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE 1785
+#define ER_GTID_UNSAFE_CREATE_SELECT 1786
+#define ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION 1787
+#define ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME 1788
+#define ER_MASTER_HAS_PURGED_REQUIRED_GTIDS 1789
+#define ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID 1790
+#define ER_UNKNOWN_EXPLAIN_FORMAT 1791
+#define ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION 1792
+#define ER_TOO_LONG_TABLE_PARTITION_COMMENT 1793
+#define ER_SLAVE_CONFIGURATION 1794
+#define ER_INNODB_FT_LIMIT 1795
+#define ER_INNODB_NO_FT_TEMP_TABLE 1796
+#define ER_INNODB_FT_WRONG_DOCID_COLUMN 1797
+#define ER_INNODB_FT_WRONG_DOCID_INDEX 1798
+#define ER_INNODB_ONLINE_LOG_TOO_BIG 1799
+#define ER_UNKNOWN_ALTER_ALGORITHM 1800
+#define ER_UNKNOWN_ALTER_LOCK 1801
+#define ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS 1802
+#define ER_MTS_RECOVERY_FAILURE 1803
+#define ER_MTS_RESET_WORKERS 1804
+#define ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 1805
+#define ER_SLAVE_SILENT_RETRY_TRANSACTION 1806
+#define ER_UNUSED_22 1807
+#define ER_TABLE_SCHEMA_MISMATCH 1808
+#define ER_TABLE_IN_SYSTEM_TABLESPACE 1809
+#define ER_IO_READ_ERROR 1810
+#define ER_IO_WRITE_ERROR 1811
+#define ER_TABLESPACE_MISSING 1812
+#define ER_TABLESPACE_EXISTS 1813
+#define ER_TABLESPACE_DISCARDED 1814
+#define ER_INTERNAL_ERROR 1815
+#define ER_INNODB_IMPORT_ERROR 1816
+#define ER_INNODB_INDEX_CORRUPT 1817
+#define ER_INVALID_YEAR_COLUMN_LENGTH 1818
+#define ER_NOT_VALID_PASSWORD 1819
+#define ER_MUST_CHANGE_PASSWORD 1820
+#define ER_FK_NO_INDEX_CHILD 1821
+#define ER_FK_NO_INDEX_PARENT 1822
+#define ER_FK_FAIL_ADD_SYSTEM 1823
+#define ER_FK_CANNOT_OPEN_PARENT 1824
+#define ER_FK_INCORRECT_OPTION 1825
+#define ER_DUP_CONSTRAINT_NAME 1826
+#define ER_PASSWORD_FORMAT 1827
+#define ER_FK_COLUMN_CANNOT_DROP 1828
+#define ER_FK_COLUMN_CANNOT_DROP_CHILD 1829
+#define ER_FK_COLUMN_NOT_NULL 1830
+#define ER_DUP_INDEX 1831
+#define ER_FK_COLUMN_CANNOT_CHANGE 1832
+#define ER_FK_COLUMN_CANNOT_CHANGE_CHILD 1833
+#define ER_FK_CANNOT_DELETE_PARENT 1834
+#define ER_MALFORMED_PACKET 1835
+#define ER_READ_ONLY_MODE 1836
+#define ER_GTID_NEXT_TYPE_UNDEFINED_GROUP 1837
+#define ER_VARIABLE_NOT_SETTABLE_IN_SP 1838
+#define ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF 1839
+#define ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY 1840
+#define ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY 1841
+#define ER_GTID_PURGED_WAS_CHANGED 1842
+#define ER_GTID_EXECUTED_WAS_CHANGED 1843
+#define ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES 1844
+#define ER_ALTER_OPERATION_NOT_SUPPORTED 1845
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON 1846
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY 1847
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION 1848
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME 1849
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE 1850
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK 1851
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE 1852
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK 1853
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC 1854
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS 1855
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS 1856
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS 1857
+#define ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE 1858
+#define ER_DUP_UNKNOWN_IN_INDEX 1859
+#define ER_IDENT_CAUSES_TOO_LONG_PATH 1860
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL 1861
+#define ER_MUST_CHANGE_PASSWORD_LOGIN 1862
+#define ER_ROW_IN_WRONG_PARTITION 1863
+#define ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX 1864
+#define ER_INNODB_NO_FT_USES_PARSER 1865
+#define ER_BINLOG_LOGICAL_CORRUPTION 1866
+#define ER_WARN_PURGE_LOG_IN_USE 1867
+#define ER_WARN_PURGE_LOG_IS_ACTIVE 1868
+#define ER_AUTO_INCREMENT_CONFLICT 1869
+#define WARN_ON_BLOCKHOLE_IN_RBR 1870
+#define ER_SLAVE_MI_INIT_REPOSITORY 1871
+#define ER_SLAVE_RLI_INIT_REPOSITORY 1872
+#define ER_ACCESS_DENIED_CHANGE_USER_ERROR 1873
+#define ER_INNODB_READ_ONLY 1874
+#define ER_STOP_SLAVE_SQL_THREAD_TIMEOUT 1875
+#define ER_STOP_SLAVE_IO_THREAD_TIMEOUT 1876
+#define ER_TABLE_CORRUPT 1877
+#define ER_TEMP_FILE_WRITE_FAILURE 1878
+#define ER_INNODB_FT_AUX_NOT_HEX_ID 1879
+#define ER_LAST_MYSQL_ERROR_MESSAGE 1880
+#define ER_ERROR_LAST_SECTION_1 1880
+
+/* New section */
+
+#define ER_ERROR_FIRST_SECTION_2 1900
+#define ER_UNUSED_18 1900
+#define ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED 1901
+#define ER_UNUSED_19 1902
+#define ER_PRIMARY_KEY_BASED_ON_GENERATED_COLUMN 1903
+#define ER_KEY_BASED_ON_GENERATED_VIRTUAL_COLUMN 1904
+#define ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN 1905
+#define ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN 1906
+#define ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN 1907
+#define ER_UNUSED_20 1908
+#define ER_UNUSED_21 1909
+#define ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS 1910
+#define ER_UNKNOWN_OPTION 1911
+#define ER_BAD_OPTION_VALUE 1912
+#define ER_UNUSED_6 1913
+#define ER_UNUSED_7 1914
+#define ER_UNUSED_8 1915
+#define ER_DATA_OVERFLOW 1916
+#define ER_DATA_TRUNCATED 1917
+#define ER_BAD_DATA 1918
+#define ER_DYN_COL_WRONG_FORMAT 1919
+#define ER_DYN_COL_IMPLEMENTATION_LIMIT 1920
+#define ER_DYN_COL_DATA 1921
+#define ER_DYN_COL_WRONG_CHARSET 1922
+#define ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES 1923
+#define ER_QUERY_CACHE_IS_DISABLED 1924
+#define ER_QUERY_CACHE_IS_GLOBALY_DISABLED 1925
+#define ER_VIEW_ORDERBY_IGNORED 1926
+#define ER_CONNECTION_KILLED 1927
+#define ER_UNUSED_12 1928
+#define ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SKIP_REPLICATION 1929
+#define ER_STORED_FUNCTION_PREVENTS_SWITCH_SKIP_REPLICATION 1930
+#define ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT 1931
+#define ER_NO_SUCH_TABLE_IN_ENGINE 1932
+#define ER_TARGET_NOT_EXPLAINABLE 1933
+#define ER_CONNECTION_ALREADY_EXISTS 1934
+#define ER_MASTER_LOG_PREFIX 1935
+#define ER_CANT_START_STOP_SLAVE 1936
+#define ER_SLAVE_STARTED 1937
+#define ER_SLAVE_STOPPED 1938
+#define ER_SQL_DISCOVER_ERROR 1939
+#define ER_FAILED_GTID_STATE_INIT 1940
+#define ER_INCORRECT_GTID_STATE 1941
+#define ER_CANNOT_UPDATE_GTID_STATE 1942
+#define ER_DUPLICATE_GTID_DOMAIN 1943
+#define ER_GTID_OPEN_TABLE_FAILED 1944
+#define ER_GTID_POSITION_NOT_FOUND_IN_BINLOG 1945
+#define ER_CANNOT_LOAD_SLAVE_GTID_STATE 1946
+#define ER_MASTER_GTID_POS_CONFLICTS_WITH_BINLOG 1947
+#define ER_MASTER_GTID_POS_MISSING_DOMAIN 1948
+#define ER_UNTIL_REQUIRES_USING_GTID 1949
+#define ER_GTID_STRICT_OUT_OF_ORDER 1950
+#define ER_GTID_START_FROM_BINLOG_HOLE 1951
+#define ER_SLAVE_UNEXPECTED_MASTER_SWITCH 1952
+#define ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO 1953
+#define ER_STORED_FUNCTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO 1954
+#define ER_GTID_POSITION_NOT_FOUND_IN_BINLOG2 1955
+#define ER_BINLOG_MUST_BE_EMPTY 1956
+#define ER_NO_SUCH_QUERY 1957
+#define ER_BAD_BASE64_DATA 1958
+#define ER_INVALID_ROLE 1959
+#define ER_INVALID_CURRENT_USER 1960
+#define ER_CANNOT_GRANT_ROLE 1961
+#define ER_CANNOT_REVOKE_ROLE 1962
+#define ER_CHANGE_SLAVE_PARALLEL_THREADS_ACTIVE 1963
+#define ER_PRIOR_COMMIT_FAILED 1964
+#define ER_IT_IS_A_VIEW 1965
+#define ER_SLAVE_SKIP_NOT_IN_GTID 1966
+#define ER_TABLE_DEFINITION_TOO_BIG 1967
+#define ER_PLUGIN_INSTALLED 1968
+#define ER_STATEMENT_TIMEOUT 1969
+#define ER_SUBQUERIES_NOT_SUPPORTED 1970
+#define ER_SET_STATEMENT_NOT_SUPPORTED 1971
+#define ER_UNUSED_9 1972
+#define ER_USER_CREATE_EXISTS 1973
+#define ER_USER_DROP_EXISTS 1974
+#define ER_ROLE_CREATE_EXISTS 1975
+#define ER_ROLE_DROP_EXISTS 1976
+#define ER_CANNOT_CONVERT_CHARACTER 1977
+#define ER_INVALID_DEFAULT_VALUE_FOR_FIELD 1978
+#define ER_KILL_QUERY_DENIED_ERROR 1979
+#define ER_NO_EIS_FOR_FIELD 1980
+#define ER_WARN_AGGFUNC_DEPENDENCE 1981
+#define WARN_INNODB_PARTITION_OPTION_IGNORED 1982
+#define ER_ERROR_LAST_SECTION_2 1982
+
+/* New section */
+
+#define ER_ERROR_FIRST_SECTION_3 2000
+#define ER_ERROR_LAST_SECTION_3 2000
+
+/* New section */
+
+#define ER_ERROR_FIRST_SECTION_4 3000
+#define ER_FILE_CORRUPT 3000
+#define ER_ERROR_ON_MASTER 3001
+#define ER_INCONSISTENT_ERROR 3002
+#define ER_STORAGE_ENGINE_NOT_LOADED 3003
+#define ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER 3004
+#define ER_WARN_LEGACY_SYNTAX_CONVERTED 3005
+#define ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN 3006
+#define ER_CANNOT_DISCARD_TEMPORARY_TABLE 3007
+#define ER_FK_DEPTH_EXCEEDED 3008
+#define ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 3009
+#define ER_WARN_TRIGGER_DOESNT_HAVE_CREATED 3010
+#define ER_REFERENCED_TRG_DOES_NOT_EXIST_MYSQL 3011
+#define ER_EXPLAIN_NOT_SUPPORTED 3012
+#define ER_INVALID_FIELD_SIZE 3013
+#define ER_MISSING_HA_CREATE_OPTION 3014
+#define ER_ENGINE_OUT_OF_MEMORY 3015
+#define ER_PASSWORD_EXPIRE_ANONYMOUS_USER 3016
+#define ER_SLAVE_SQL_THREAD_MUST_STOP 3017
+#define ER_NO_FT_MATERIALIZED_SUBQUERY 3018
+#define ER_INNODB_UNDO_LOG_FULL 3019
+#define ER_INVALID_ARGUMENT_FOR_LOGARITHM 3020
+#define ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP 3021
+#define ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO 3022
+#define ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS 3023
+#define ER_QUERY_TIMEOUT 3024
+#define ER_NON_RO_SELECT_DISABLE_TIMER 3025
+#define ER_DUP_LIST_ENTRY 3026
+#define ER_SQL_MODE_NO_EFFECT 3027
+#define ER_AGGREGATE_ORDER_FOR_UNION 3028
+#define ER_AGGREGATE_ORDER_NON_AGG_QUERY 3029
+#define ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR 3030
+#define ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER 3031
+#define ER_SERVER_OFFLINE_MODE 3032
+#define ER_GIS_DIFFERENT_SRIDS 3033
+#define ER_GIS_UNSUPPORTED_ARGUMENT 3034
+#define ER_GIS_UNKNOWN_ERROR 3035
+#define ER_GIS_UNKNOWN_EXCEPTION 3036
+#define ER_GIS_INVALID_DATA 3037
+#define ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION 3038
+#define ER_BOOST_GEOMETRY_CENTROID_EXCEPTION 3039
+#define ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION 3040
+#define ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION 3041
+#define ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION 3042
+#define ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION 3043
+#define ER_STD_BAD_ALLOC_ERROR 3044
+#define ER_STD_DOMAIN_ERROR 3045
+#define ER_STD_LENGTH_ERROR 3046
+#define ER_STD_INVALID_ARGUMENT 3047
+#define ER_STD_OUT_OF_RANGE_ERROR 3048
+#define ER_STD_OVERFLOW_ERROR 3049
+#define ER_STD_RANGE_ERROR 3050
+#define ER_STD_UNDERFLOW_ERROR 3051
+#define ER_STD_LOGIC_ERROR 3052
+#define ER_STD_RUNTIME_ERROR 3053
+#define ER_STD_UNKNOWN_EXCEPTION 3054
+#define ER_GIS_DATA_WRONG_ENDIANESS 3055
+#define ER_CHANGE_MASTER_PASSWORD_LENGTH 3056
+#define ER_USER_LOCK_WRONG_NAME 3057
+#define ER_USER_LOCK_DEADLOCK 3058
+#define ER_REPLACE_INACCESSIBLE_ROWS 3059
+#define ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS 3060
+#define ER_ERROR_LAST_SECTION_4 3060
+
+/* New section */
+
+#define ER_ERROR_FIRST_SECTION_5 4000
+#define ER_UNUSED_26 4000
+#define ER_UNUSED_27 4001
+#define ER_WITH_COL_WRONG_LIST 4002
+#define ER_TOO_MANY_DEFINITIONS_IN_WITH_CLAUSE 4003
+#define ER_DUP_QUERY_NAME 4004
+#define ER_RECURSIVE_WITHOUT_ANCHORS 4005
+#define ER_UNACCEPTABLE_MUTUAL_RECURSION 4006
+#define ER_REF_TO_RECURSIVE_WITH_TABLE_IN_DERIVED 4007
+#define ER_NOT_STANDARD_COMPLIANT_RECURSIVE 4008
+#define ER_WRONG_WINDOW_SPEC_NAME 4009
+#define ER_DUP_WINDOW_NAME 4010
+#define ER_PARTITION_LIST_IN_REFERENCING_WINDOW_SPEC 4011
+#define ER_ORDER_LIST_IN_REFERENCING_WINDOW_SPEC 4012
+#define ER_WINDOW_FRAME_IN_REFERENCED_WINDOW_SPEC 4013
+#define ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS 4014
+#define ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION 4015
+#define ER_WINDOW_FUNCTION_IN_WINDOW_SPEC 4016
+#define ER_NOT_ALLOWED_WINDOW_FRAME 4017
+#define ER_NO_ORDER_LIST_IN_WINDOW_SPEC 4018
+#define ER_RANGE_FRAME_NEEDS_SIMPLE_ORDERBY 4019
+#define ER_WRONG_TYPE_FOR_ROWS_FRAME 4020
+#define ER_WRONG_TYPE_FOR_RANGE_FRAME 4021
+#define ER_FRAME_EXCLUSION_NOT_SUPPORTED 4022
+#define ER_WINDOW_FUNCTION_DONT_HAVE_FRAME 4023
+#define ER_INVALID_NTILE_ARGUMENT 4024
+#define ER_CONSTRAINT_FAILED 4025
+#define ER_EXPRESSION_IS_TOO_BIG 4026
+#define ER_ERROR_EVALUATING_EXPRESSION 4027
+#define ER_CALCULATING_DEFAULT_VALUE 4028
+#define ER_EXPRESSION_REFERS_TO_UNINIT_FIELD 4029
+#define ER_PARTITION_DEFAULT_ERROR 4030
+#define ER_REFERENCED_TRG_DOES_NOT_EXIST 4031
+#define ER_INVALID_DEFAULT_PARAM 4032
+#define ER_BINLOG_NON_SUPPORTED_BULK 4033
+#define ER_BINLOG_UNCOMPRESS_ERROR 4034
+#define ER_JSON_BAD_CHR 4035
+#define ER_JSON_NOT_JSON_CHR 4036
+#define ER_JSON_EOS 4037
+#define ER_JSON_SYNTAX 4038
+#define ER_JSON_ESCAPING 4039
+#define ER_JSON_DEPTH 4040
+#define ER_JSON_PATH_EOS 4041
+#define ER_JSON_PATH_SYNTAX 4042
+#define ER_JSON_PATH_DEPTH 4043
+#define ER_JSON_PATH_NO_WILDCARD 4044
+#define ER_JSON_PATH_ARRAY 4045
+#define ER_JSON_ONE_OR_ALL 4046
+#define ER_UNSUPPORTED_COMPRESSED_TABLE 4047
+#define ER_GEOJSON_INCORRECT 4048
+#define ER_GEOJSON_TOO_FEW_POINTS 4049
+#define ER_GEOJSON_NOT_CLOSED 4050
+#define ER_JSON_PATH_EMPTY 4051
+#define ER_SLAVE_SAME_ID 4052
+#define ER_FLASHBACK_NOT_SUPPORTED 4053
+#define ER_KEYS_OUT_OF_ORDER 4054
+#define ER_OVERLAPPING_KEYS 4055
+#define ER_REQUIRE_ROW_BINLOG_FORMAT 4056
+#define ER_ISOLATION_MODE_NOT_SUPPORTED 4057
+#define ER_ON_DUPLICATE_DISABLED 4058
+#define ER_UPDATES_WITH_CONSISTENT_SNAPSHOT 4059
+#define ER_ROLLBACK_ONLY 4060
+#define ER_ROLLBACK_TO_SAVEPOINT 4061
+#define ER_ISOLATION_LEVEL_WITH_CONSISTENT_SNAPSHOT 4062
+#define ER_UNSUPPORTED_COLLATION 4063
+#define ER_METADATA_INCONSISTENCY 4064
+#define ER_CF_DIFFERENT 4065
+#define ER_RDB_TTL_DURATION_FORMAT 4066
+#define ER_RDB_STATUS_GENERAL 4067
+#define ER_RDB_STATUS_MSG 4068
+#define ER_RDB_TTL_UNSUPPORTED 4069
+#define ER_RDB_TTL_COL_FORMAT 4070
+#define ER_PER_INDEX_CF_DEPRECATED 4071
+#define ER_KEY_CREATE_DURING_ALTER 4072
+#define ER_SK_POPULATE_DURING_ALTER 4073
+#define ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG 4074
+#define ER_NET_OK_PACKET_TOO_LARGE 4075
+#define ER_GEOJSON_EMPTY_COORDINATES 4076
+#define ER_MYROCKS_CANT_NOPAD_COLLATION 4077
+#define ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION 4078
+#define ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION 4079
+#define ER_WRONG_PARAMCOUNT_TO_CURSOR 4080
+#define ER_UNKNOWN_STRUCTURED_VARIABLE 4081
+#define ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD 4082
+#define ER_END_IDENTIFIER_DOES_NOT_MATCH 4083
+#define ER_SEQUENCE_RUN_OUT 4084
+#define ER_SEQUENCE_INVALID_DATA 4085
+#define ER_SEQUENCE_INVALID_TABLE_STRUCTURE 4086
+#define ER_SEQUENCE_ACCESS_ERROR 4087
+#define ER_SEQUENCE_BINLOG_FORMAT 4088
+#define ER_NOT_SEQUENCE 4089
+#define ER_NOT_SEQUENCE2 4090
+#define ER_UNKNOWN_SEQUENCES 4091
+#define ER_UNKNOWN_VIEW 4092
+#define ER_WRONG_INSERT_INTO_SEQUENCE 4093
+#define ER_SP_STACK_TRACE 4094
+#define ER_PACKAGE_ROUTINE_IN_SPEC_NOT_DEFINED_IN_BODY 4095
+#define ER_PACKAGE_ROUTINE_FORWARD_DECLARATION_NOT_DEFINED 4096
+#define ER_COMPRESSED_COLUMN_USED_AS_KEY 4097
+#define ER_UNKNOWN_COMPRESSION_METHOD 4098
+#define ER_WRONG_NUMBER_OF_VALUES_IN_TVC 4099
+#define ER_FIELD_REFERENCE_IN_TVC 4100
+#define ER_WRONG_TYPE_FOR_PERCENTILE_FUNC 4101
+#define ER_ARGUMENT_NOT_CONSTANT 4102
+#define ER_ARGUMENT_OUT_OF_RANGE 4103
+#define ER_WRONG_TYPE_OF_ARGUMENT 4104
+#define ER_NOT_AGGREGATE_FUNCTION 4105
+#define ER_INVALID_AGGREGATE_FUNCTION 4106
+#define ER_INVALID_VALUE_TO_LIMIT 4107
+#define ER_INVISIBLE_NOT_NULL_WITHOUT_DEFAULT 4108
+#define ER_UPDATE_INFO_WITH_SYSTEM_VERSIONING 4109
+#define ER_VERS_FIELD_WRONG_TYPE 4110
+#define ER_VERS_ENGINE_UNSUPPORTED 4111
+#define ER_UNUSED_23 4112
+#define ER_PARTITION_WRONG_TYPE 4113
+#define WARN_VERS_PART_FULL 4114
+#define WARN_VERS_PARAMETERS 4115
+#define ER_VERS_DROP_PARTITION_INTERVAL 4116
+#define ER_UNUSED_25 4117
+#define WARN_VERS_PART_NON_HISTORICAL 4118
+#define ER_VERS_ALTER_NOT_ALLOWED 4119
+#define ER_VERS_ALTER_ENGINE_PROHIBITED 4120
+#define ER_VERS_RANGE_PROHIBITED 4121
+#define ER_CONFLICTING_FOR_SYSTEM_TIME 4122
+#define ER_VERS_TABLE_MUST_HAVE_COLUMNS 4123
+#define ER_VERS_NOT_VERSIONED 4124
+#define ER_MISSING 4125
+#define ER_VERS_PERIOD_COLUMNS 4126
+#define ER_PART_WRONG_VALUE 4127
+#define ER_VERS_WRONG_PARTS 4128
+#define ER_VERS_NO_TRX_ID 4129
+#define ER_VERS_ALTER_SYSTEM_FIELD 4130
+#define ER_DROP_VERSIONING_SYSTEM_TIME_PARTITION 4131
+#define ER_VERS_DB_NOT_SUPPORTED 4132
+#define ER_VERS_TRT_IS_DISABLED 4133
+#define ER_VERS_DUPLICATE_ROW_START_END 4134
+#define ER_VERS_ALREADY_VERSIONED 4135
+#define ER_UNUSED_24 4136
+#define ER_VERS_NOT_SUPPORTED 4137
+#define ER_VERS_TRX_PART_HISTORIC_ROW_NOT_SUPPORTED 4138
+#define ER_INDEX_FILE_FULL 4139
+#define ER_UPDATED_COLUMN_ONLY_ONCE 4140
+#define ER_EMPTY_ROW_IN_TVC 4141
+#define ER_VERS_QUERY_IN_PARTITION 4142
+#define ER_KEY_DOESNT_SUPPORT 4143
+#define ER_ALTER_OPERATION_TABLE_OPTIONS_NEED_REBUILD 4144
+#define ER_BACKUP_LOCK_IS_ACTIVE 4145
+#define ER_BACKUP_NOT_RUNNING 4146
+#define ER_BACKUP_WRONG_STAGE 4147
+#define ER_BACKUP_STAGE_FAILED 4148
+#define ER_BACKUP_UNKNOWN_STAGE 4149
+#define ER_USER_IS_BLOCKED 4150
+#define ER_ACCOUNT_HAS_BEEN_LOCKED 4151
+#define ER_PERIOD_TEMPORARY_NOT_ALLOWED 4152
+#define ER_PERIOD_TYPES_MISMATCH 4153
+#define ER_MORE_THAN_ONE_PERIOD 4154
+#define ER_PERIOD_FIELD_WRONG_ATTRIBUTES 4155
+#define ER_PERIOD_NOT_FOUND 4156
+#define ER_PERIOD_COLUMNS_UPDATED 4157
+#define ER_PERIOD_CONSTRAINT_DROP 4158
+#define ER_TOO_LONG_KEYPART 4159
+#define ER_TOO_LONG_DATABASE_COMMENT 4160
+#define ER_UNKNOWN_DATA_TYPE 4161
+#define ER_UNKNOWN_OPERATOR 4162
+#define ER_WARN_HISTORY_ROW_START_TIME 4163
+#define ER_PART_STARTS_BEYOND_INTERVAL 4164
+#define ER_GALERA_REPLICATION_NOT_SUPPORTED 4165
+#define ER_LOAD_INFILE_CAPABILITY_DISABLED 4166
+#define ER_NO_SECURE_TRANSPORTS_CONFIGURED 4167
+#define ER_SLAVE_IGNORED_SHARED_TABLE 4168
+#define ER_NO_AUTOINCREMENT_WITH_UNIQUE 4169
+#define ER_KEY_CONTAINS_PERIOD_FIELDS 4170
+#define ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS 4171
+#define ER_NOT_ALLOWED_IN_THIS_CONTEXT 4172
+#define ER_DATA_WAS_COMMITED_UNDER_ROLLBACK 4173
+#define ER_PK_INDEX_CANT_BE_IGNORED 4174
+#define ER_BINLOG_UNSAFE_SKIP_LOCKED 4175
+#define ER_JSON_TABLE_ERROR_ON_FIELD 4176
+#define ER_JSON_TABLE_ALIAS_REQUIRED 4177
+#define ER_JSON_TABLE_SCALAR_EXPECTED 4178
+#define ER_JSON_TABLE_MULTIPLE_MATCHES 4179
+#define ER_WITH_TIES_NEEDS_ORDER 4180
+#define ER_REMOVED_ORPHAN_TRIGGER 4181
+#define ER_STORAGE_ENGINE_DISABLED 4182
+#define ER_ERROR_LAST 4182
+#endif /* ER_ERROR_FIRST */

BIN
mariadb.mod/lib/win32arm/libmariadb.a


+ 235 - 0
mariadb.mod/lib/win32arm/libmariadb.def

@@ -0,0 +1,235 @@
+LIBRARY libmariadb
+EXPORTS
+	ma_pvio_register_callback
+	mariadb_cancel
+	mariadb_connection
+	mariadb_convert_string
+	mariadb_deinitialize_ssl
+	mariadb_dyncol_check
+	mariadb_dyncol_column_cmp_named
+	mariadb_dyncol_column_count
+	mariadb_dyncol_create_many_named
+	mariadb_dyncol_create_many_num
+	mariadb_dyncol_exists_named
+	mariadb_dyncol_exists_num
+	mariadb_dyncol_free
+	mariadb_dyncol_get_named
+	mariadb_dyncol_get_num
+	mariadb_dyncol_has_names
+	mariadb_dyncol_json
+	mariadb_dyncol_list_named
+	mariadb_dyncol_list_num
+	mariadb_dyncol_unpack
+	mariadb_dyncol_update_many_named
+	mariadb_dyncol_update_many_num
+	mariadb_dyncol_val_double
+	mariadb_dyncol_val_long
+	mariadb_dyncol_val_str
+	mariadb_field_attr
+	mariadb_free_rpl_event
+	mariadb_get_charset_by_name
+	mariadb_get_charset_by_nr
+	mariadb_get_info
+	mariadb_get_infov
+	mariadb_reconnect
+	mariadb_rpl_close
+	mariadb_rpl_fetch
+	mariadb_rpl_get_optionsv
+	mariadb_rpl_init_ex
+	mariadb_rpl_open
+	mariadb_rpl_optionsv
+	mariadb_stmt_execute_direct
+	mariadb_stmt_fetch_fields
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_autocommit_cont
+	mysql_autocommit_start
+	mysql_change_user
+	mysql_change_user_cont
+	mysql_change_user_start
+	mysql_character_set_name
+	mysql_client_find_plugin
+	mysql_client_register_plugin
+	mysql_close
+	mysql_close_cont
+	mysql_close_start
+	mysql_commit
+	mysql_commit_cont
+	mysql_commit_start
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_dump_debug_info_cont
+	mysql_dump_debug_info_start
+	mysql_embedded
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_fetch_row_cont
+	mysql_fetch_row_start
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_free_result_cont
+	mysql_free_result_start
+	mysql_get_character_set_info
+	mysql_get_charset_by_name
+	mysql_get_charset_by_nr
+	mysql_get_client_info
+	mysql_get_client_version
+	mysql_get_host_info
+	mysql_get_option
+	mysql_get_optionv
+	mysql_get_parameters
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_get_server_name
+	mysql_get_server_version
+	mysql_get_socket
+	mysql_get_ssl_cipher
+	mysql_get_timeout_value
+	mysql_get_timeout_value_ms
+	mysql_hex_string
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_kill_cont
+	mysql_kill_start
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_fields_cont
+	mysql_list_fields_start
+	mysql_list_processes
+	mysql_list_tables
+	mysql_load_plugin
+	mysql_load_plugin_v
+	mysql_more_results
+	mysql_net_field_length
+	mysql_net_read_packet
+	mysql_next_result
+	mysql_next_result_cont
+	mysql_next_result_start
+	mysql_num_fields
+	mysql_num_rows
+	mysql_options4
+	mysql_options
+	mysql_optionsv
+	mysql_ping
+	mysql_ping_cont
+	mysql_ping_start
+	mysql_ps_fetch_functions
+	mysql_query
+	mysql_query_cont
+	mysql_query_start
+	mysql_read_query_result
+	mysql_read_query_result_cont
+	mysql_read_query_result_start
+	mysql_real_connect
+	mysql_real_connect_cont
+	mysql_real_connect_start
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_real_query_cont
+	mysql_real_query_start
+	mysql_refresh
+	mysql_refresh_cont
+	mysql_refresh_start
+	mysql_reset_connection
+	mysql_reset_connection_cont
+	mysql_reset_connection_start
+	mysql_rollback
+	mysql_rollback_cont
+	mysql_rollback_start
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_select_db_cont
+	mysql_select_db_start
+	mysql_send_query
+	mysql_send_query_cont
+	mysql_send_query_start
+	mysql_server_end
+	mysql_server_init
+	mysql_session_track_get_first
+	mysql_session_track_get_next
+	mysql_set_character_set
+	mysql_set_character_set_cont
+	mysql_set_character_set_start
+	mysql_set_local_infile_default
+	mysql_set_local_infile_handler
+	mysql_set_server_option
+	mysql_set_server_option_cont
+	mysql_set_server_option_start
+	mysql_shutdown
+	mysql_shutdown_cont
+	mysql_shutdown_start
+	mysql_sqlstate
+	mysql_ssl_set
+	mysql_stat
+	mysql_stat_cont
+	mysql_stat_start
+	mysql_stmt_affected_rows
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_stmt_close
+	mysql_stmt_close_cont
+	mysql_stmt_close_start
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_execute
+	mysql_stmt_execute_cont
+	mysql_stmt_execute_start
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_stmt_fetch_cont
+	mysql_stmt_fetch_start
+	mysql_stmt_field_count
+	mysql_stmt_free_result
+	mysql_stmt_free_result_cont
+	mysql_stmt_free_result_start
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_more_results
+	mysql_stmt_next_result
+	mysql_stmt_next_result_cont
+	mysql_stmt_next_result_start
+	mysql_stmt_num_rows
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_stmt_prepare
+	mysql_stmt_prepare_cont
+	mysql_stmt_prepare_start
+	mysql_stmt_reset
+	mysql_stmt_reset_cont
+	mysql_stmt_reset_start
+	mysql_stmt_result_metadata
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_send_long_data
+	mysql_stmt_send_long_data_cont
+	mysql_stmt_send_long_data_start
+	mysql_stmt_sqlstate
+	mysql_stmt_store_result
+	mysql_stmt_store_result_cont
+	mysql_stmt_store_result_start
+	mysql_stmt_warning_count
+	mysql_store_result
+	mysql_store_result_cont
+	mysql_store_result_start
+	mysql_thread_end
+	mysql_thread_id
+	mysql_thread_init
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count

+ 3 - 0
mariadb.mod/lib/win32arm/notes.txt

@@ -0,0 +1,3 @@
+# generated using the following :
+
+dlltool -m arm -k -d libmariadb.def -l libmariadb.a

BIN
mariadb.mod/lib/win32arm64/libmariadb.a


+ 235 - 0
mariadb.mod/lib/win32arm64/libmariadb.def

@@ -0,0 +1,235 @@
+LIBRARY libmariadb
+EXPORTS
+	ma_pvio_register_callback
+	mariadb_cancel
+	mariadb_connection
+	mariadb_convert_string
+	mariadb_deinitialize_ssl
+	mariadb_dyncol_check
+	mariadb_dyncol_column_cmp_named
+	mariadb_dyncol_column_count
+	mariadb_dyncol_create_many_named
+	mariadb_dyncol_create_many_num
+	mariadb_dyncol_exists_named
+	mariadb_dyncol_exists_num
+	mariadb_dyncol_free
+	mariadb_dyncol_get_named
+	mariadb_dyncol_get_num
+	mariadb_dyncol_has_names
+	mariadb_dyncol_json
+	mariadb_dyncol_list_named
+	mariadb_dyncol_list_num
+	mariadb_dyncol_unpack
+	mariadb_dyncol_update_many_named
+	mariadb_dyncol_update_many_num
+	mariadb_dyncol_val_double
+	mariadb_dyncol_val_long
+	mariadb_dyncol_val_str
+	mariadb_field_attr
+	mariadb_free_rpl_event
+	mariadb_get_charset_by_name
+	mariadb_get_charset_by_nr
+	mariadb_get_info
+	mariadb_get_infov
+	mariadb_reconnect
+	mariadb_rpl_close
+	mariadb_rpl_fetch
+	mariadb_rpl_get_optionsv
+	mariadb_rpl_init_ex
+	mariadb_rpl_open
+	mariadb_rpl_optionsv
+	mariadb_stmt_execute_direct
+	mariadb_stmt_fetch_fields
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_autocommit_cont
+	mysql_autocommit_start
+	mysql_change_user
+	mysql_change_user_cont
+	mysql_change_user_start
+	mysql_character_set_name
+	mysql_client_find_plugin
+	mysql_client_register_plugin
+	mysql_close
+	mysql_close_cont
+	mysql_close_start
+	mysql_commit
+	mysql_commit_cont
+	mysql_commit_start
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_dump_debug_info_cont
+	mysql_dump_debug_info_start
+	mysql_embedded
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_fetch_row_cont
+	mysql_fetch_row_start
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_free_result_cont
+	mysql_free_result_start
+	mysql_get_character_set_info
+	mysql_get_charset_by_name
+	mysql_get_charset_by_nr
+	mysql_get_client_info
+	mysql_get_client_version
+	mysql_get_host_info
+	mysql_get_option
+	mysql_get_optionv
+	mysql_get_parameters
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_get_server_name
+	mysql_get_server_version
+	mysql_get_socket
+	mysql_get_ssl_cipher
+	mysql_get_timeout_value
+	mysql_get_timeout_value_ms
+	mysql_hex_string
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_kill_cont
+	mysql_kill_start
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_fields_cont
+	mysql_list_fields_start
+	mysql_list_processes
+	mysql_list_tables
+	mysql_load_plugin
+	mysql_load_plugin_v
+	mysql_more_results
+	mysql_net_field_length
+	mysql_net_read_packet
+	mysql_next_result
+	mysql_next_result_cont
+	mysql_next_result_start
+	mysql_num_fields
+	mysql_num_rows
+	mysql_options4
+	mysql_options
+	mysql_optionsv
+	mysql_ping
+	mysql_ping_cont
+	mysql_ping_start
+	mysql_ps_fetch_functions
+	mysql_query
+	mysql_query_cont
+	mysql_query_start
+	mysql_read_query_result
+	mysql_read_query_result_cont
+	mysql_read_query_result_start
+	mysql_real_connect
+	mysql_real_connect_cont
+	mysql_real_connect_start
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_real_query_cont
+	mysql_real_query_start
+	mysql_refresh
+	mysql_refresh_cont
+	mysql_refresh_start
+	mysql_reset_connection
+	mysql_reset_connection_cont
+	mysql_reset_connection_start
+	mysql_rollback
+	mysql_rollback_cont
+	mysql_rollback_start
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_select_db_cont
+	mysql_select_db_start
+	mysql_send_query
+	mysql_send_query_cont
+	mysql_send_query_start
+	mysql_server_end
+	mysql_server_init
+	mysql_session_track_get_first
+	mysql_session_track_get_next
+	mysql_set_character_set
+	mysql_set_character_set_cont
+	mysql_set_character_set_start
+	mysql_set_local_infile_default
+	mysql_set_local_infile_handler
+	mysql_set_server_option
+	mysql_set_server_option_cont
+	mysql_set_server_option_start
+	mysql_shutdown
+	mysql_shutdown_cont
+	mysql_shutdown_start
+	mysql_sqlstate
+	mysql_ssl_set
+	mysql_stat
+	mysql_stat_cont
+	mysql_stat_start
+	mysql_stmt_affected_rows
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_stmt_close
+	mysql_stmt_close_cont
+	mysql_stmt_close_start
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_execute
+	mysql_stmt_execute_cont
+	mysql_stmt_execute_start
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_stmt_fetch_cont
+	mysql_stmt_fetch_start
+	mysql_stmt_field_count
+	mysql_stmt_free_result
+	mysql_stmt_free_result_cont
+	mysql_stmt_free_result_start
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_more_results
+	mysql_stmt_next_result
+	mysql_stmt_next_result_cont
+	mysql_stmt_next_result_start
+	mysql_stmt_num_rows
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_stmt_prepare
+	mysql_stmt_prepare_cont
+	mysql_stmt_prepare_start
+	mysql_stmt_reset
+	mysql_stmt_reset_cont
+	mysql_stmt_reset_start
+	mysql_stmt_result_metadata
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_send_long_data
+	mysql_stmt_send_long_data_cont
+	mysql_stmt_send_long_data_start
+	mysql_stmt_sqlstate
+	mysql_stmt_store_result
+	mysql_stmt_store_result_cont
+	mysql_stmt_store_result_start
+	mysql_stmt_warning_count
+	mysql_store_result
+	mysql_store_result_cont
+	mysql_store_result_start
+	mysql_thread_end
+	mysql_thread_id
+	mysql_thread_init
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count

+ 3 - 0
mariadb.mod/lib/win32arm64/notes.txt

@@ -0,0 +1,3 @@
+# generated using the following :
+
+dlltool -m arm64 -k -d libmariadb.def -l libmariadb.a

BIN
mariadb.mod/lib/win32x64/libmariadb.a


+ 235 - 0
mariadb.mod/lib/win32x64/libmariadb.def

@@ -0,0 +1,235 @@
+LIBRARY libmariadb
+EXPORTS
+	ma_pvio_register_callback
+	mariadb_cancel
+	mariadb_connection
+	mariadb_convert_string
+	mariadb_deinitialize_ssl
+	mariadb_dyncol_check
+	mariadb_dyncol_column_cmp_named
+	mariadb_dyncol_column_count
+	mariadb_dyncol_create_many_named
+	mariadb_dyncol_create_many_num
+	mariadb_dyncol_exists_named
+	mariadb_dyncol_exists_num
+	mariadb_dyncol_free
+	mariadb_dyncol_get_named
+	mariadb_dyncol_get_num
+	mariadb_dyncol_has_names
+	mariadb_dyncol_json
+	mariadb_dyncol_list_named
+	mariadb_dyncol_list_num
+	mariadb_dyncol_unpack
+	mariadb_dyncol_update_many_named
+	mariadb_dyncol_update_many_num
+	mariadb_dyncol_val_double
+	mariadb_dyncol_val_long
+	mariadb_dyncol_val_str
+	mariadb_field_attr
+	mariadb_free_rpl_event
+	mariadb_get_charset_by_name
+	mariadb_get_charset_by_nr
+	mariadb_get_info
+	mariadb_get_infov
+	mariadb_reconnect
+	mariadb_rpl_close
+	mariadb_rpl_fetch
+	mariadb_rpl_get_optionsv
+	mariadb_rpl_init_ex
+	mariadb_rpl_open
+	mariadb_rpl_optionsv
+	mariadb_stmt_execute_direct
+	mariadb_stmt_fetch_fields
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_autocommit_cont
+	mysql_autocommit_start
+	mysql_change_user
+	mysql_change_user_cont
+	mysql_change_user_start
+	mysql_character_set_name
+	mysql_client_find_plugin
+	mysql_client_register_plugin
+	mysql_close
+	mysql_close_cont
+	mysql_close_start
+	mysql_commit
+	mysql_commit_cont
+	mysql_commit_start
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_dump_debug_info_cont
+	mysql_dump_debug_info_start
+	mysql_embedded
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_fetch_row_cont
+	mysql_fetch_row_start
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_free_result_cont
+	mysql_free_result_start
+	mysql_get_character_set_info
+	mysql_get_charset_by_name
+	mysql_get_charset_by_nr
+	mysql_get_client_info
+	mysql_get_client_version
+	mysql_get_host_info
+	mysql_get_option
+	mysql_get_optionv
+	mysql_get_parameters
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_get_server_name
+	mysql_get_server_version
+	mysql_get_socket
+	mysql_get_ssl_cipher
+	mysql_get_timeout_value
+	mysql_get_timeout_value_ms
+	mysql_hex_string
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_kill_cont
+	mysql_kill_start
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_fields_cont
+	mysql_list_fields_start
+	mysql_list_processes
+	mysql_list_tables
+	mysql_load_plugin
+	mysql_load_plugin_v
+	mysql_more_results
+	mysql_net_field_length
+	mysql_net_read_packet
+	mysql_next_result
+	mysql_next_result_cont
+	mysql_next_result_start
+	mysql_num_fields
+	mysql_num_rows
+	mysql_options4
+	mysql_options
+	mysql_optionsv
+	mysql_ping
+	mysql_ping_cont
+	mysql_ping_start
+	mysql_ps_fetch_functions
+	mysql_query
+	mysql_query_cont
+	mysql_query_start
+	mysql_read_query_result
+	mysql_read_query_result_cont
+	mysql_read_query_result_start
+	mysql_real_connect
+	mysql_real_connect_cont
+	mysql_real_connect_start
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_real_query_cont
+	mysql_real_query_start
+	mysql_refresh
+	mysql_refresh_cont
+	mysql_refresh_start
+	mysql_reset_connection
+	mysql_reset_connection_cont
+	mysql_reset_connection_start
+	mysql_rollback
+	mysql_rollback_cont
+	mysql_rollback_start
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_select_db_cont
+	mysql_select_db_start
+	mysql_send_query
+	mysql_send_query_cont
+	mysql_send_query_start
+	mysql_server_end
+	mysql_server_init
+	mysql_session_track_get_first
+	mysql_session_track_get_next
+	mysql_set_character_set
+	mysql_set_character_set_cont
+	mysql_set_character_set_start
+	mysql_set_local_infile_default
+	mysql_set_local_infile_handler
+	mysql_set_server_option
+	mysql_set_server_option_cont
+	mysql_set_server_option_start
+	mysql_shutdown
+	mysql_shutdown_cont
+	mysql_shutdown_start
+	mysql_sqlstate
+	mysql_ssl_set
+	mysql_stat
+	mysql_stat_cont
+	mysql_stat_start
+	mysql_stmt_affected_rows
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_stmt_close
+	mysql_stmt_close_cont
+	mysql_stmt_close_start
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_execute
+	mysql_stmt_execute_cont
+	mysql_stmt_execute_start
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_stmt_fetch_cont
+	mysql_stmt_fetch_start
+	mysql_stmt_field_count
+	mysql_stmt_free_result
+	mysql_stmt_free_result_cont
+	mysql_stmt_free_result_start
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_more_results
+	mysql_stmt_next_result
+	mysql_stmt_next_result_cont
+	mysql_stmt_next_result_start
+	mysql_stmt_num_rows
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_stmt_prepare
+	mysql_stmt_prepare_cont
+	mysql_stmt_prepare_start
+	mysql_stmt_reset
+	mysql_stmt_reset_cont
+	mysql_stmt_reset_start
+	mysql_stmt_result_metadata
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_send_long_data
+	mysql_stmt_send_long_data_cont
+	mysql_stmt_send_long_data_start
+	mysql_stmt_sqlstate
+	mysql_stmt_store_result
+	mysql_stmt_store_result_cont
+	mysql_stmt_store_result_start
+	mysql_stmt_warning_count
+	mysql_store_result
+	mysql_store_result_cont
+	mysql_store_result_start
+	mysql_thread_end
+	mysql_thread_id
+	mysql_thread_init
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count

+ 3 - 0
mariadb.mod/lib/win32x64/notes.txt

@@ -0,0 +1,3 @@
+# generated using the following :
+
+dlltool -m i386:x86-64 -k -d libmariadb.def -l libmariadb.a

BIN
mariadb.mod/lib/win32x86/libmariadb.a


+ 235 - 0
mariadb.mod/lib/win32x86/libmariadb.def

@@ -0,0 +1,235 @@
+LIBRARY libmariadb
+EXPORTS
+	ma_pvio_register_callback
+	mariadb_cancel
+	mariadb_connection
+	mariadb_convert_string
+	mariadb_deinitialize_ssl
+	mariadb_dyncol_check
+	mariadb_dyncol_column_cmp_named
+	mariadb_dyncol_column_count
+	mariadb_dyncol_create_many_named
+	mariadb_dyncol_create_many_num
+	mariadb_dyncol_exists_named
+	mariadb_dyncol_exists_num
+	mariadb_dyncol_free
+	mariadb_dyncol_get_named
+	mariadb_dyncol_get_num
+	mariadb_dyncol_has_names
+	mariadb_dyncol_json
+	mariadb_dyncol_list_named
+	mariadb_dyncol_list_num
+	mariadb_dyncol_unpack
+	mariadb_dyncol_update_many_named
+	mariadb_dyncol_update_many_num
+	mariadb_dyncol_val_double
+	mariadb_dyncol_val_long
+	mariadb_dyncol_val_str
+	mariadb_field_attr
+	mariadb_free_rpl_event
+	mariadb_get_charset_by_name
+	mariadb_get_charset_by_nr
+	mariadb_get_info
+	mariadb_get_infov
+	mariadb_reconnect
+	mariadb_rpl_close
+	mariadb_rpl_fetch
+	mariadb_rpl_get_optionsv
+	mariadb_rpl_init_ex
+	mariadb_rpl_open
+	mariadb_rpl_optionsv
+	mariadb_stmt_execute_direct
+	mariadb_stmt_fetch_fields
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_autocommit_cont
+	mysql_autocommit_start
+	mysql_change_user
+	mysql_change_user_cont
+	mysql_change_user_start
+	mysql_character_set_name
+	mysql_client_find_plugin
+	mysql_client_register_plugin
+	mysql_close
+	mysql_close_cont
+	mysql_close_start
+	mysql_commit
+	mysql_commit_cont
+	mysql_commit_start
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_dump_debug_info_cont
+	mysql_dump_debug_info_start
+	mysql_embedded
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_fetch_row_cont
+	mysql_fetch_row_start
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_free_result_cont
+	mysql_free_result_start
+	mysql_get_character_set_info
+	mysql_get_charset_by_name
+	mysql_get_charset_by_nr
+	mysql_get_client_info
+	mysql_get_client_version
+	mysql_get_host_info
+	mysql_get_option
+	mysql_get_optionv
+	mysql_get_parameters
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_get_server_name
+	mysql_get_server_version
+	mysql_get_socket
+	mysql_get_ssl_cipher
+	mysql_get_timeout_value
+	mysql_get_timeout_value_ms
+	mysql_hex_string
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_kill_cont
+	mysql_kill_start
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_fields_cont
+	mysql_list_fields_start
+	mysql_list_processes
+	mysql_list_tables
+	mysql_load_plugin
+	mysql_load_plugin_v
+	mysql_more_results
+	mysql_net_field_length
+	mysql_net_read_packet
+	mysql_next_result
+	mysql_next_result_cont
+	mysql_next_result_start
+	mysql_num_fields
+	mysql_num_rows
+	mysql_options4
+	mysql_options
+	mysql_optionsv
+	mysql_ping
+	mysql_ping_cont
+	mysql_ping_start
+	mysql_ps_fetch_functions
+	mysql_query
+	mysql_query_cont
+	mysql_query_start
+	mysql_read_query_result
+	mysql_read_query_result_cont
+	mysql_read_query_result_start
+	mysql_real_connect
+	mysql_real_connect_cont
+	mysql_real_connect_start
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_real_query_cont
+	mysql_real_query_start
+	mysql_refresh
+	mysql_refresh_cont
+	mysql_refresh_start
+	mysql_reset_connection
+	mysql_reset_connection_cont
+	mysql_reset_connection_start
+	mysql_rollback
+	mysql_rollback_cont
+	mysql_rollback_start
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_select_db_cont
+	mysql_select_db_start
+	mysql_send_query
+	mysql_send_query_cont
+	mysql_send_query_start
+	mysql_server_end
+	mysql_server_init
+	mysql_session_track_get_first
+	mysql_session_track_get_next
+	mysql_set_character_set
+	mysql_set_character_set_cont
+	mysql_set_character_set_start
+	mysql_set_local_infile_default
+	mysql_set_local_infile_handler
+	mysql_set_server_option
+	mysql_set_server_option_cont
+	mysql_set_server_option_start
+	mysql_shutdown
+	mysql_shutdown_cont
+	mysql_shutdown_start
+	mysql_sqlstate
+	mysql_ssl_set
+	mysql_stat
+	mysql_stat_cont
+	mysql_stat_start
+	mysql_stmt_affected_rows
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_stmt_close
+	mysql_stmt_close_cont
+	mysql_stmt_close_start
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_execute
+	mysql_stmt_execute_cont
+	mysql_stmt_execute_start
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_stmt_fetch_cont
+	mysql_stmt_fetch_start
+	mysql_stmt_field_count
+	mysql_stmt_free_result
+	mysql_stmt_free_result_cont
+	mysql_stmt_free_result_start
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_more_results
+	mysql_stmt_next_result
+	mysql_stmt_next_result_cont
+	mysql_stmt_next_result_start
+	mysql_stmt_num_rows
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_stmt_prepare
+	mysql_stmt_prepare_cont
+	mysql_stmt_prepare_start
+	mysql_stmt_reset
+	mysql_stmt_reset_cont
+	mysql_stmt_reset_start
+	mysql_stmt_result_metadata
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_send_long_data
+	mysql_stmt_send_long_data_cont
+	mysql_stmt_send_long_data_start
+	mysql_stmt_sqlstate
+	mysql_stmt_store_result
+	mysql_stmt_store_result_cont
+	mysql_stmt_store_result_start
+	mysql_stmt_warning_count
+	mysql_store_result
+	mysql_store_result_cont
+	mysql_store_result_start
+	mysql_thread_end
+	mysql_thread_id
+	mysql_thread_init
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count

+ 3 - 0
mariadb.mod/lib/win32x86/notes.txt

@@ -0,0 +1,3 @@
+# generated using the following :
+
+dlltool -m i386 -k -d libmariadb.def -l libmariadb.a

+ 941 - 0
mariadb.mod/mariadb.bmx

@@ -0,0 +1,941 @@
+' Copyright (c) 2007-2022 Bruce A Henderson
+' All rights reserved.
+'
+' Redistribution and use in source and binary forms, with or without
+' modification, are permitted provided that the following conditions are met:
+'     * Redistributions of source code must retain the above copyright
+'       notice, this list of conditions and the following disclaimer.
+'     * Redistributions in binary form must reproduce the above copyright
+'       notice, this list of conditions and the following disclaimer in the
+'       documentation and/or other materials provided with the distribution.
+'     * Neither the auther nor the names of its contributors may be used to 
+'       endorse or promote products derived from this software without specific
+'       prior written permission.
+'
+' THIS SOFTWARE IS PROVIDED BY Bruce A Henderson ``AS IS'' AND ANY
+' EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+' WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+' DISCLAIMED. IN NO EVENT SHALL Bruce A Henderson BE LIABLE FOR ANY
+' DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+' (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+' LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+' ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+' (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+' SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+'
+SuperStrict
+
+Rem
+bbdoc: Database Driver - MariaDB
+about: A MariaDB database driver for #Database.Core
+End Rem
+Module Database.MariaDB
+
+ModuleInfo "Version: 1.00"
+ModuleInfo "Author: Bruce A Henderson"
+ModuleInfo "License: BSD"
+ModuleInfo "Copyright: Wrapper - 2007-2022 Bruce A Henderson"
+
+ModuleInfo "History: 1.00 Initial Release"
+
+?win32x86
+ModuleInfo "LD_OPTS: -L%PWD%/lib/win32x86"
+?win32x64
+ModuleInfo "LD_OPTS: -L%PWD%/lib/win32x64"
+?win32arm
+ModuleInfo "LD_OPTS: -L%PWD%/lib/win32arm"
+?win32arm64
+ModuleInfo "LD_OPTS: -L%PWD%/lib/win32arm64"
+?macos
+ModuleInfo "CC_OPTS: `pkg-config --cflags libmariadb`"
+ModuleInfo "LD_OPTS: `pkg-config --libs-only-L libmariadb`"
+?linux
+ModuleInfo "CC_OPTS: `pkg-config --cflags libmariadb`"
+ModuleInfo "LD_OPTS: `pkg-config --libs-only-L libmariadb`"
+?
+
+Import Database.Core
+
+Import "common.bmx"
+
+Type TDBMariaDB Extends TDBConnection
+
+	Field clientVersion:Int
+	Field serverVersion:Int
+
+	Function Create:TDBConnection(dbname:String = Null, host:String = Null, ..
+		port:Int = Null, user:String = Null, password:String = Null, server:String = Null, options:String = Null)
+		
+		Local this:TDBMariaDB = New TDBMariaDB
+		
+		this.init(dbname, host, port, user, password, server, options)
+		
+		this.clientVersion = mysql_get_client_version()
+		
+		If this._dbname Then
+			this.open(user, password)
+		End If
+		
+		Return this
+		
+	End Function
+
+	Method close()
+		If _isOpen Then
+
+			free() ' tidy up queries and stuff
+			
+			mysql_close(handle)
+			handle = Null
+			_isOpen = False
+		End If
+	End Method
+
+	Method isOpen:Int()
+		If _isOpen Then
+			' really check that the database is open
+			If mysql_ping(handle) Then
+				setError("Connection has closed", Null, TDatabaseError.ERROR_CONNECTION, mysql_errno(handle))
+				_isOpen = False
+			End If
+		End If
+		
+		Return _isOpen
+	End Method
+		
+	Method commit:Int()
+		If Not _isOpen Then
+			Return False
+		End If
+		
+		If mysql_query(handle, "COMMIT") Then
+			setError("Error committing transaction", Null, TDatabaseError.ERROR_TRANSACTION, mysql_errno(handle))
+			Return False
+		End If
+		
+		Return True
+	End Method
+	
+	Method getTables:String[]()
+		Local list:String[]
+		
+		If Not _isOpen Then
+			Return list
+		End If
+		
+		Local tableList:TList = New TList
+		Local tablesHandle:Byte Ptr = mysql_list_tables(handle, Null)
+		
+		If tablesHandle Then
+			Local row:Byte Ptr = mysql_fetch_row(tablesHandle)
+
+			While row
+				Local s:String = String.FromUTF8String(bmx_mysql_rowField_chars(row, 0))
+				tableList.addLast(s)
+			
+				row = mysql_fetch_row(tablesHandle)
+			Wend
+			
+			mysql_free_result(tablesHandle)
+		End If
+		
+		If tableList.count() > 0 Then
+			list = New String[tableList.count()]
+			Local i:Int = 0
+			For Local s:String = EachIn tableList
+				list[i] = s
+				i:+ 1
+			Next
+		End If
+		
+		Return list
+	End Method
+
+	Method getTableInfo:TDBTable(tableName:String, withDDL:Int = False)
+		If Not _isOpen Then
+			Return Null
+		End If
+		
+		Local query:TDatabaseQuery = TDatabaseQuery.Create(Self)
+		
+		Local table:TDBTable
+
+		Local sql:String = "SHOW COLUMNS FROM " + tableName
+			
+		If query.execute(sql) Then
+			table = New TDBTable
+			table.name = tableName
+			
+			Local cols:TList = New TList
+			
+			For Local rec:TQueryRecord = EachIn query
+
+				Local name:String = rec.GetString(0)
+				Local _type:String = rec.GetString(1).Split("(")[0]
+				Local dbType:Int
+				Select _type
+					Case "boolean", "bool", "tinyint", "smallint", "mediumint", "int", "integer"
+						dbType = DBTYPE_INT
+					Case "bigint"
+						dbType = DBTYPE_LONG
+					Case "real", "double", "decimal"
+						dbType = DBTYPE_DOUBLE
+					Case "float"
+						dbType = DBTYPE_FLOAT
+					Case "date"
+						dbType = DBTYPE_DATE
+					Case "timestamp", "datetime"
+						dbType = DBTYPE_DATETIME
+					Case "time"
+						dbType = DBTYPE_TIME
+					Case "tinyblob", "blob", "mediumblob", "longblob"
+						dbType = DBTYPE_BLOB
+					Default
+						dbType = DBTYPE_STRING
+				End Select
+				
+				Local nullable:Int
+				If rec.GetString(2) = "YES" Then
+					nullable = True
+				End If
+				
+				Local defaultValue:TDBType = rec.value(4)
+				
+				cols.AddLast(TDBColumn.Create(name, dbType, nullable, defaultValue))
+			Next
+			
+			table.SetCountColumns(cols.count())
+			Local i:Int
+			For Local col:TDBColumn = EachIn cols
+				table.SetColumn(i, col)
+				i:+ 1
+			Next
+			
+			cols.Clear()
+			
+			If withDDL Then
+				sql = "SHOW CREATE TABLE " + tableName
+				If query.execute(sql) Then
+					
+					For Local rec:TQueryRecord = EachIn query
+						table.ddl:+ rec.GetString(1) + ";~n~n"
+					Next
+
+				End If
+				
+			End If
+		Else
+			' no table?
+		End If
+		
+		Return table
+	End Method
+	
+	Method open:Int(user:String = Null, pass:String = Null)
+		If _isOpen Then
+			close()
+		End If
+		
+		If user Then
+			_user = user
+		End If
+		
+		If pass Then
+			_password = pass
+		End If
+		
+		' initialize the handle
+		handle = mysql_init(0)
+		
+		If handle Then
+		
+			Local ret:Int = 0
+			
+			Local d:Byte Ptr = _dbname.ToUTF8String()
+
+			If _host Then
+				Local h:Byte Ptr = _host.ToUTF8String()
+				If _user Then
+					Local u:Byte Ptr = _user.ToUTF8String()
+					If _password
+						Local p:Byte Ptr = _password.ToUTF8String()
+						ret = mysql_real_connect(handle, h, u, p, d, _port, Null, _options.ToInt())
+						MemFree(p)
+					Else
+						ret = mysql_real_connect(handle, h, u, Null, d, _port, Null, _options.ToInt())
+					End If
+					MemFree(u)
+				Else
+					ret = mysql_real_connect(handle, h, Null, Null, d, _port, Null, _options.ToInt())
+				End If
+				MemFree(h)
+			Else
+				If _user Then
+					Local u:Byte Ptr = _user.ToUTF8String()
+					If _password
+						Local p:Byte Ptr = _password.ToUTF8String()
+						ret = mysql_real_connect(handle, Null, u, p, d, _port, Null, _options.ToInt())
+						MemFree(p)
+					Else
+						ret = mysql_real_connect(handle, Null, u, Null, d, _port, Null, _options.ToInt())
+					End If
+					MemFree(u)
+				Else
+					ret = mysql_real_connect(handle, Null, Null, Null, d, _port, Null, _options.ToInt())
+				End If
+			End If
+			
+			If Not ret Then
+				setError("Error connecting to database", String.FromUTF8String(mysql_error(handle)), TDatabaseError.ERROR_CONNECTION, mysql_errno(handle))
+				Return False
+			End If
+			
+			If mysql_select_db(handle, _dbname) Then
+				setError("Error opening database '" + _dbname + "'", String.FromUTF8String(mysql_error(handle)), TDatabaseError.ERROR_CONNECTION, mysql_errno(handle))
+				Return False
+			End If
+		Else
+			setError("Error initializing database", Null, TDatabaseError.ERROR_CONNECTION, 0)
+			Return False
+		End If
+		
+		If clientVersion >= 50007 Then
+			mysql_set_character_set(handle, "utf8")
+		End If
+		
+		serverVersion = mysql_get_server_version(handle)
+		
+		_isOpen = True
+		Return True
+	End Method
+	
+	Method rollback:Int()
+		If Not _isOpen Then
+			Return False
+		End If
+		
+		If mysql_query(handle, "ROLLBACK") Then
+			setError("Error rolling back transaction", Null, TDatabaseError.ERROR_TRANSACTION, mysql_errno(handle))
+			Return False
+		End If
+		
+		Return True
+	End Method
+	
+	Method startTransaction:Int()
+		If Not _isOpen Then
+			Return False
+		End If
+		
+		If mysql_query(handle, "BEGIN WORK") Then
+			setError("Error starting transaction", Null, TDatabaseError.ERROR_TRANSACTION, mysql_errno(handle))
+			Return False
+		End If
+		
+		Return True
+	End Method
+	
+	Method databaseHandle:Byte Ptr()
+		Return handle
+	End Method
+	
+	Method createResultSet:TQueryResultSet()
+		Return TMySQLResultSet.Create(Self)
+	End Method
+
+	Method nativeErrorMessage:String(err:Int)
+	End Method
+	
+	Method hasPrepareSupport:Int()
+		Return True
+	End Method
+
+	Method hasTransactionSupport:Int()
+		Return True
+	End Method
+
+End Type
+
+Type TMySQLField
+
+	Field mySQLField:Byte Ptr
+	Field dataValue:Byte Ptr
+	Field dataLength:Int
+	Field isNull:Int
+	Field flag:Int
+
+	Method clear()
+		mySQLField = Null
+		If dataValue Then
+			MemFree(dataValue)
+			dataValue = Null
+		End If
+		dataLength = 0
+		isNull = 0
+	End Method
+	
+	Method Delete()
+		clear()
+	End Method
+	
+End Type
+
+Type TMySQLResultSet Extends TQueryResultSet
+
+	' a pointer to a mysql result
+	Field resultHandle:Byte Ptr
+	Field row:Byte Ptr
+	
+	' a pointer to a mysql prepared statement
+	Field stmtHandle:Byte Ptr
+	Field metaHandle:Byte Ptr
+	
+	Field preparedQuery:Int
+	Field _rowsAffected:Int
+
+	Field parameterBindings:Byte Ptr
+	Field selectBindings:Byte Ptr
+	
+	Field mySQLFields:TMySQLField[]
+
+	Function Create:TQueryResultSet(db:TDBConnection, sql:String = Null)
+		Local this:TMySQLResultSet = New TMySQLResultSet
+		
+		this.init(db, sql)
+		this.rec = TQueryRecord.Create()
+		
+		Return this
+	End Function
+
+	Method executeQuery:Int(statement:String)
+	
+		If Not conn.isOpen() Then
+			Return False
+		End If
+		
+		preparedQuery = False
+		
+		Local q:Byte Ptr = statement.ToUTF8String()
+		
+		If mysql_real_query(conn.handle, q, _strlen(q)) Then
+			conn.setError("Error executing query", String.FromUTF8String(mysql_error(conn.handle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(conn.handle))
+			Return False
+		End If
+		
+		resultHandle = mysql_store_result(conn.handle)
+		
+		If Not resultHandle And mysql_field_count(conn.handle) > 0 Then
+			conn.setError("Error storing result set", String.FromUTF8String(mysql_error(conn.handle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(conn.handle))
+			Return False
+		End If
+		
+		Local fieldCount:Int = mysql_field_count(conn.handle)
+
+		initRecord(fieldCount)
+
+		Local af:Long
+		bmx_mysql_affected_rows(conn.handle, Varptr af)
+		_rowsAffected = af
+		
+		If fieldCount <> 0 Then
+			
+			For Local i:Int = 0 Until fieldCount
+				Local _field:Byte Ptr = mysql_fetch_field_direct(resultHandle, i)
+				
+				Local qf:TQueryField = TQueryField.Create(bmx_mysql_field_name(_field), dbTypeFromNative(Null, bmx_mysql_field_type(_field), bmx_mysql_field_flags(_field)))
+				qf.length = bmx_mysql_field_length(_field)
+				qf.precision = bmx_mysql_field_decimals(_field)
+				
+				rec.setField(i, qf)
+				
+			Next
+		End If
+		
+		_isActive = True
+		Return True
+	End Method
+	
+	Method prepare:Int(statement:String)
+	
+		cleanup()
+		
+		If Not statement Or statement.length = 0 Then
+			Return False
+		End If
+		
+		' initialize the statement if required
+		If Not stmtHandle Then
+			stmtHandle = mysql_stmt_init(conn.handle)
+		End If
+		
+		If Not stmtHandle Then
+			conn.setError("Error preparing statement", String.FromUTF8String(mysql_error(conn.handle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(conn.handle))
+			Return False
+		End If
+		
+		' prepare the statement
+		Local q:Byte Ptr = statement.ToUTF8String()
+		Local result:Int = mysql_stmt_prepare(stmtHandle, q, _strlen(q))
+		MemFree(q)
+		
+		If result Then
+			conn.setError("Error preparing statement", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+			cleanup()
+			Return False
+		End If
+		
+		' if the param count > 0 there are "?" in the SQL that need to be bound
+		If mysql_stmt_param_count(stmtHandle) > 0 Then
+			parameterBindings = bmx_mysql_makeBindings(mysql_stmt_param_count(stmtHandle))
+		End If
+		
+		' **********************************
+		' setup bindings for inbound data...
+		If Not metaHandle Then
+			metaHandle = mysql_stmt_result_metadata(stmtHandle)
+		End If
+		
+		If metaHandle Then
+
+			Local fieldCount:Int = mysql_num_fields(metaHandle)
+			initRecord(fieldCount)
+
+			mySQLFields = New TMySQLField[fieldCount]
+		
+			selectBindings = bmx_mysql_makeBindings(fieldCount)
+			
+			For Local i:Int = 0 Until fieldCount
+			
+				Local _field:Byte Ptr = mysql_fetch_field(metaHandle)
+
+				mySQLFields[i] = New TMySQLField
+				
+				mySQLFields[i].mySQLField = _field
+				mySQLFields[i].dataLength = bmx_mysql_field_length(_field) + 1
+				' make some space for the data...
+				mySQLFields[i].dataValue = MemAlloc(Size_T(mySQLFields[i].dataLength))
+				
+				Local ty:Int = bmx_mysql_field_type(_field)
+				' build result set field information
+				Local qf:TQueryField = TQueryField.Create(bmx_mysql_field_name(_field), dbTypeFromNative(Null, ty, bmx_mysql_field_flags(_field)))
+				qf.length = bmx_mysql_field_length(_field)
+				qf.precision = bmx_mysql_field_decimals(_field)
+				rec.setField(i, qf)
+
+				bmx_mysql_inbind(selectBindings, i, _field, mySQLFields[i].dataValue, Varptr mySQLFields[i].dataLength, Varptr mySQLFields[i].isNull, ty)
+			Next
+
+		End If
+		
+		Return True
+	End Method
+	
+	Method execute:Int()
+
+		If Not preparedQuery Then
+			Return False
+		End If
+		
+		If Not stmtHandle Then
+			Return False
+		End If
+		
+		index = SQL_BeforeFirstRow
+		
+		Local result:Int = 0
+		
+		result = bmx_mysql_stmt_reset(stmtHandle)
+		If result Then
+			conn.setError("Error resetting statement", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+			Return False
+		End If
+
+		' BIND stuff
+		Local values:TDBType[] = boundValues
+
+		Local paramCount:Int = mysql_stmt_param_count(stmtHandle)
+
+		Local strings:Byte Ptr[]
+		Local times:Byte Ptr[]
+
+		If paramCount = bindCount Then
+
+			strings = New Byte Ptr[paramCount]
+			times = New Byte Ptr[paramCount]
+		
+			For Local i:Int = 0 Until paramCount
+
+				Local isNull:Int = False
+				
+				If Not values[i] Or values[i].isNull() Then
+					isNull = True
+				Else
+					Select values[i].kind()
+						Case DBTYPE_INT
+							bmx_mysql_bind_int(parameterBindings, i, Varptr TDBInt(values[i]).value)
+						Case DBTYPE_FLOAT
+							bmx_mysql_bind_float(parameterBindings, i, Varptr TDBFloat(values[i]).value)
+						Case DBTYPE_DOUBLE
+							bmx_mysql_bind_double(parameterBindings, i, Varptr TDBDouble(values[i]).value)
+						Case DBTYPE_LONG
+							bmx_mysql_bind_long(parameterBindings, i, Varptr TDBLong(values[i]).value)
+						Case DBTYPE_STRING
+							local s:Byte Ptr = values[i].getString().ToUTF8String()
+							strings[i] = s
+							bmx_mysql_bind_string(parameterBindings, i, s, _strlen(s))
+							
+						Case DBTYPE_BLOB
+							bmx_mysql_bind_blob(parameterBindings, i, TDBBlob(values[i]).value, TDBBlob(values[i])._size)
+
+						Case DBTYPE_DATE
+							Local date:TDBDate = TDBDate(values[i])
+							times[i] = bmx_mysql_makeTime()
+							bmx_mysql_bind_date(parameterBindings, i, times[i], date.getYear(), date.getMonth(), date.getDay())
+						Case DBTYPE_DATETIME
+							Local date:TDBDateTime = TDBDateTime(values[i])
+							times[i] = bmx_mysql_makeTime()
+							bmx_mysql_bind_datetime(parameterBindings, i, times[i], date.getYear(), date.getMonth(), date.getDay(), date.getHour(), date.getMinute(), date.getSecond())
+						Case DBTYPE_TIME
+							Local date:TDBTime = TDBTime(values[i])
+							times[i] = bmx_mysql_makeTime()
+							bmx_mysql_bind_time(parameterBindings, i, times[i], date.getHour(), date.getMinute(), date.getSecond())
+					End Select
+				End If
+
+			Next
+
+			' actually bind the parameters
+			result = bmx_mysql_stmt_bind_param(stmtHandle, parameterBindings)
+
+			If result Then
+				conn.setError("Error binding values", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+			
+				' free up the strings
+				For Local i:Int = 0 Until paramCount
+					If strings[i] Then
+						MemFree(strings[i])
+					End If
+					
+					If times[i] Then
+						bmx_mysql_deleteTime(times[i])
+					End If
+				Next
+				
+				Return False
+			End If
+			
+		End If
+	
+		' execute the statement
+		result = mysql_stmt_execute(stmtHandle)
+
+		' free up the strings
+		If strings Or times Then
+			For Local i:Int = 0 Until paramCount
+				If strings[i] Then
+					MemFree(strings[i])
+				End If
+				
+				If times[i] Then
+					bmx_mysql_deleteTime(times[i])
+				End If
+			Next
+		End If
+		
+		If result Then
+			conn.setError("Error executing statement", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+			Return False
+		End If
+		
+		Local af:Long
+		bmx_mysql_stmt_affected_rows(stmtHandle, Varptr af)
+		_rowsAffected = af
+
+		' if this is set, then there is data returned from the statement execution
+		' in which case we need to bind the results for the result set
+		If metaHandle Then
+
+			result = bmx_mysql_stmt_bind_result(stmtHandle, selectBindings)
+
+			If result Then
+				conn.setError("Error binding result", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+				Return False
+			End If
+
+			result = mysql_stmt_store_result(stmtHandle)
+
+			If result Then
+				conn.setError("Error storing result", String.FromUTF8String(mysql_stmt_error(stmtHandle)), TDatabaseError.ERROR_STATEMENT, mysql_errno(stmtHandle))
+				Return False
+			End If
+		
+		End If
+
+
+		_isActive = True
+		Return True
+	End Method
+
+	Method initRecord(size:Int)
+
+		rec.clear()
+
+		If size > 0 Then		
+			rec.init(size)
+		End If
+		
+		resetValues(size)
+	End Method
+	
+	Method firstRow:Int()
+		If index = SQL_BeforeFirstRow Then
+			Return nextRow()
+		End If
+		
+		Return False
+	End Method
+	
+	Method nextRow:Int()
+		If preparedQuery Then
+			If Not stmtHandle Then
+				Return False
+			End If
+			
+			Local result:Int = bmx_mysql_stmt_fetch(stmtHandle)
+			If result Then
+				Return False
+			End If
+		Else
+			row = mysql_fetch_row(resultHandle)
+			If Not row Then
+				Return False
+			End If
+		End If
+		
+		' now populate the values[] array with the fetched data !
+		For Local i:Int = 0 Until rec.count()
+		
+			If values[i] Then
+				values[i].clear()
+			End If
+
+			
+			If preparedQuery Then
+			
+				If Not mySQLFields[i].isNull Then
+				
+					Local fieldLength:Int = mySQLFields[i].dataLength
+
+					' it seems that we need to retrieve all values as if they were "strings"...
+					' Don't ask... it doesn't work otherwise. (except on Windows... haw)
+					Select rec.fields[i].fType
+						Case DBTYPE_INT
+							values[i] = New TDBInt
+							values[i].setInt(bmx_mysql_char_to_int(mySQLFields[i].dataValue))
+						Case DBTYPE_LONG
+							values[i] = New TDBLong
+							values[i].setLong(bmx_mysql_char_to_long(mySQLFields[i].dataValue))
+						Case DBTYPE_FLOAT
+							values[i] = New TDBFloat
+							values[i].setFloat(bmx_mysql_char_to_float(mySQLFields[i].dataValue))
+						Case DBTYPE_DOUBLE
+							values[i] = New TDBDouble
+							values[i].setDouble(bmx_mysql_char_to_double(mySQLFields[i].dataValue))
+						Case DBTYPE_DATE
+							values[i] = TDBDate.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+						Case DBTYPE_DATETIME
+							values[i] = TDBDateTime.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+						Case DBTYPE_TIME
+							values[i] = TDBTime.SetFromString(String.fromBytes(mySQLFields[i].dataValue, fieldLength))
+						Case DBTYPE_BLOB
+							values[i] = TDBBlob.Set(mySQLFields[i].dataValue, fieldLength)
+						Default
+							values[i] = New TDBString
+							values[i].setString(sizedUTF8toISO8859(mySQLFields[i].dataValue, fieldLength))
+					End Select
+					
+				End If
+				
+			Else
+				' a non-prepared query
+				
+				If Not bmx_mysql_rowField_isNull(row, i) Then
+				
+					Local fieldLength:Int = bmx_mysql_getLength(mysql_fetch_lengths(resultHandle), i)
+				
+					Select rec.fields[i].fType
+						Case DBTYPE_INT
+							values[i] = New TDBInt
+							values[i].setInt(String.fromBytes(bmx_mysql_rowField_chars(row, i), fieldLength).toInt())
+						Case DBTYPE_LONG
+							values[i] = New TDBLong
+							values[i].setLong(String.fromBytes(bmx_mysql_rowField_chars(row, i), fieldLength).toLong())
+						Case DBTYPE_FLOAT
+							values[i] = New TDBFloat
+							values[i].setFloat(String.fromBytes(bmx_mysql_rowField_chars(row, i), fieldLength).toFloat())
+						Case DBTYPE_DOUBLE
+							values[i] = New TDBDouble
+							values[i].setDouble(String.fromBytes(bmx_mysql_rowField_chars(row, i), fieldLength).toDouble())
+						Case DBTYPE_DATE
+							values[i] = TDBDate.SetFromString(String.FromUTF8Bytes(bmx_mysql_rowField_chars(row, i), fieldLength))
+						Case DBTYPE_DATETIME
+							values[i] = TDBDateTime.SetFromString(String.FromUTF8Bytes(bmx_mysql_rowField_chars(row, i), fieldLength))
+						Case DBTYPE_TIME
+							values[i] = TDBTime.SetFromString(String.FromUTF8Bytes(bmx_mysql_rowField_chars(row, i), fieldLength))
+						Case DBTYPE_BLOB
+							values[i] = TDBBlob.Set(bmx_mysql_rowField_chars(row, i), fieldLength)
+						Default
+							values[i] = New TDBString
+							values[i].setString(String.FromUTF8Bytes(bmx_mysql_rowField_chars(row, i), fieldLength))
+					End Select
+					
+				End If
+				
+			End If
+		Next		
+		
+		
+		index:+ 1
+		
+		Return True
+	End Method
+	
+	Method lastInsertedId:Long()
+		If Not isActive()
+			Return -1
+		End If
+		
+		Local id:Long = -1
+		
+		If preparedQuery Then
+			bmx_mysql_stmt_insert_id(stmtHandle, Varptr id)
+		Else
+			bmx_mysql_insert_id(conn.handle, Varptr id)
+		End If
+		
+		Return id
+	End Method
+	
+	Method rowsAffected:Int()
+		Return _rowsAffected
+	End Method
+
+	Function dbTypeFromNative:Int(name:String, _type:Int = 0, _flags:Int = 0)
+	
+		Local dbType:Int
+		
+		Select _type
+			Case MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, MYSQL_TYPE_INT24
+				dbType = DBTYPE_INT
+			Case MYSQL_TYPE_YEAR
+				dbType = DBTYPE_INT
+			Case MYSQL_TYPE_LONGLONG
+				dbType = DBTYPE_LONG
+			Case MYSQL_TYPE_FLOAT
+				dbType = DBTYPE_FLOAT
+			Case MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DECIMAL
+				dbType = DBTYPE_DOUBLE
+			Case MYSQL_TYPE_DATE
+				dbType = DBTYPE_DATE
+			Case MYSQL_TYPE_TIME
+				dbType = DBTYPE_TIME
+			Case MYSQL_TYPE_DATETIME, MYSQL_TYPE_TIMESTAMP
+				dbType = DBTYPE_DATETIME
+			Case MYSQL_TYPE_BLOB, MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB
+				If _flags & 128 Then ' binary !
+					dbType = DBTYPE_BLOB
+				Else ' String!
+					dbType = DBTYPE_STRING
+				End If
+			Default
+				dbType = DBTYPE_STRING
+		End Select
+		
+		Return dbType
+	End Function
+
+	Method cleanup()
+
+		If resultHandle Then
+			mysql_free_result(resultHandle)
+			resultHandle = Null
+		End If
+		
+		If stmtHandle Then
+			If bmx_mysql_stmt_close(stmtHandle) Then
+			
+			End If
+			stmtHandle = Null
+		End If
+		
+		If metaHandle Then
+			mysql_free_result(metaHandle)
+			metaHandle = Null
+		End If
+		
+		If parameterBindings Then
+			bmx_mysql_deleteBindings(parameterBindings)
+			parameterBindings = Null
+		End If
+
+		If selectBindings Then
+			bmx_mysql_deleteBindings(selectBindings)
+			selectBindings = Null
+		End If
+	
+		If mySQLFields Then
+			For Local i:Int = 0 Until mySQLFields.length
+				If mySQLFields[i] Then
+					mySQLFields[i].clear()
+					mySQLFields[i] = Null
+				End If
+			Next
+		End If
+		
+		index = SQL_BeforeFirstRow
+		rec.clear()
+		_isActive = False
+		
+		preparedQuery = True
+	End Method
+	
+	Method clear()
+		cleanup()
+	
+		Super.clear()
+	End Method
+	
+	Method reset()
+		clear()
+	End Method
+	
+	Method free()
+		clear()
+	End Method
+	
+	Method Delete()
+		free()
+	End Method
+	
+End Type
+
+
+
+
+Type TMariaDBDatabaseLoader Extends TDatabaseLoader
+
+	Method New()
+		_type = "MARIADB"
+	End Method
+
+	Method LoadDatabase:TDBConnection( dbname:String = Null, host:String = Null, ..
+		port:Int = Null, user:String = Null, password:String = Null, ..
+		server:String = Null, options:String = Null )
+	
+		Return TDBMariaDB.Create(dbName, host, port, user, password, server, options)
+		
+	End Method
+
+End Type
+
+AddDatabaseLoader New TMariaDBDatabaseLoader

+ 99 - 0
mariadb.mod/tests/blob_test.bmx

@@ -0,0 +1,99 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+Import BRL.RamStream
+Import BRL.JPGLoader
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print "Didn't work..."
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+
+Local names:String[][] = [ ..
+	[ "Alfred", "Aho", "alfred-aho.jpg" ],   ..
+	[ "Brian", "Kernighan", "brian-kernighan.jpg" ], ..
+	[ "Peter", "Weinberger", "pjw.jpg" ] ]
+
+If db.isOpen() Then
+
+	db.executeQuery("DROP TABLE if exists person")
+	
+	Local s:String = "CREATE TABLE if not exists person (id integer primary key AUTO_INCREMENT, " + ..
+	  " forename varchar(30)," + ..
+	  " surname varchar(30), stamp datetime, image blob )"
+
+	db.executeQuery(s)
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' get a new query object 
+	Local query:TDatabaseQuery = TDatabaseQuery.Create(db)
+
+	' prepare the insert statement
+	' by preparing it once, the database can reuse it on succesive inserts which is more efficient.
+	query.prepare("INSERT INTO person values (NULL, ?, ?, ?, ?)")
+	
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' iterate round the array inserting new entries
+	For Local i:Int = 0 Until 3
+		query.bindValue(0, TDBString.Set(names[i][0]))
+		query.bindValue(1, TDBString.Set(names[i][1]))
+		query.bindValue(2, TDBDateTime.Set(2007, 4 + i, 30, 10, 4, 16))
+
+		' load some data (raw jpg data)		
+		Local b:Byte[] = LoadByteArray("images/" + names[i][2])
+		' bind it (copying the data)
+		query.bindValue(3, TDBBlob.Set(b, b.length))
+
+		query.execute()
+		
+		If db.hasError() Then
+			errorAndClose(db)
+		End If
+	Next
+		
+	query = db.executeQuery("SELECT * from person")
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	While query.nextRow()
+		Local record:TQueryRecord = query.rowRecord()
+		
+		Print (record.GetInt(0) + ". Name = " + record.GetString(1) + " " + record.GetString(2))
+		Print TDBDateTime(record.value(3)).format()
+		
+		' get the blob data
+		Local b:TDBBlob = TDBBlob(record.value(4))
+		' create a pixmap (from the raw jpg data)
+		Local pix:TPixmap = LoadPixmap(CreateRamStream(b.getBlob(), b.size(), True, False))
+		If pix Then
+			Print "Dimension = " + pix.width + ", " + pix.height
+		End If
+	Wend
+	
+			
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print db.error().toString()
+	db.close()
+	End
+End Function
+

BIN
mariadb.mod/tests/images/alfred-aho.jpg


BIN
mariadb.mod/tests/images/brian-kernighan.jpg


BIN
mariadb.mod/tests/images/pjw.jpg


+ 43 - 0
mariadb.mod/tests/tableinfo.bmx

@@ -0,0 +1,43 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+
+If db.isOpen() Then
+
+	Local table:TDBTable = db.getTableInfo("person", True)
+
+	If table Then	
+		Print "name = " + table.name
+		For Local i:Int = 0 Until table.columns.length
+			Print i + " : " + table.columns[i].name
+		Next
+		Print "DDL : ~n" + table.ddl
+	Else
+		Print "No table information found"
+	End If
+
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function
+
+

+ 69 - 0
mariadb.mod/tests/test_01.bmx

@@ -0,0 +1,69 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+
+Local names:String[][] = [ ..
+	[ "Alfred", "Aho" ],   ..
+	[ "Brian", "Kernighan" ], ..
+	[ "Peter", "Weinberger" ] ]
+
+If db.isOpen() Then
+
+	db.executeQuery("DROP TABLE if exists person")
+	
+	Local s:String = "CREATE TABLE if not exists person (id integer primary key AUTO_INCREMENT, " + ..
+	  " forename varchar(30)," + ..
+	  " surname varchar(30), stamp datetime )"
+
+	db.executeQuery(s)
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	For Local i:Int = 0 Until names.length
+		Local query:TDatabaseQuery = db.executeQuery("INSERT INTO person values (NULL, '" + names[i][0] + "', '" + names[i][1] + "', now())")
+
+		Print "LastInserted id = " + query.lastInsertedId()
+		
+		If db.hasError() Then
+			errorAndClose(db)
+		End If
+	Next
+
+	Local query:TDatabaseQuery = db.executeQuery("SELECT * from person")
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	While query.nextRow()
+		Local record:TQueryRecord = query.rowRecord()
+		
+		Print(record.getInt(0) + ". Name = " + record.getString(1) + " " + record.getString(2))
+		Print TDBDateTime(record.value(3)).format()
+	Wend
+	
+			
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function

+ 88 - 0
mariadb.mod/tests/test_02.bmx

@@ -0,0 +1,88 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+Local names:String[][] = [ ..
+	[ "Alfred", "Aho" ],   ..
+	[ "Brian", "Kernighan" ], ..
+	[ "Peter", "Weinberger" ] ]
+
+If db.isOpen() Then
+
+	db.executeQuery("DROP TABLE if exists person")
+
+	' Create a new table
+	Local s:String = "CREATE TABLE if not exists person (id integer primary key AUTO_INCREMENT, " + ..
+	  " forename varchar(30)," + ..
+	  " surname varchar(30), stamp datetime, num integer )"
+
+	db.executeQuery(s)
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' get a new query object 
+	Local query:TDatabaseQuery = TDatabaseQuery.Create(db)
+
+	' prepare the insert statement
+	' by preparing it once, the database can reuse it on succesive inserts which is more efficient.
+	query.prepare("INSERT INTO person values (NULL, ?, ?, ?, ?)")
+	
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' iterate round the array inserting new entries
+	For Local i:Int = 0 Until 3
+		query.bindValue(0, TDBString.Set(names[i][0]))
+		query.bindValue(1, TDBString.Set(names[i][1]))
+		query.bindValue(2, TDBDateTime.Set(2007, 4 + i, 30, 10, 4, 16))
+		query.bindValue(3, TDBInt.Set(i + 10))
+
+		query.execute()
+		
+		If db.hasError() Then
+			errorAndClose(db)
+		End If
+	Next
+	
+	' select
+	query = db.executeQuery("SELECT * from person")
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	While query.nextRow()
+		Local record:TQueryRecord = query.rowRecord()
+		
+		Print("Name = " + record.getString(1) + " " + record.getString(2))
+		Print TDBDateTime(record.value(3)).format()
+		Print record.getInt(4)
+	Wend
+	
+			
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function
+
+

+ 120 - 0
mariadb.mod/tests/test_03.bmx

@@ -0,0 +1,120 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+Import BRL.RandomDefault
+
+Type TPersonStuff
+	Field forename:String
+	Field surname:String
+	Field dataInt:Int
+	Field dataFloat:Float
+	Field dataDouble:Double
+	Field dataLong:Long
+End Type
+
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+If db.isOpen() Then
+
+	' Load up some data for insertion...
+
+	Local names:String[][] = [ ..
+		[ "Alfred", "Aho" ],   ..
+		[ "Brian", "Kernighan" ], ..
+		[ "Peter", "Weinberger" ] ]
+		
+	Local pstuff:TPersonStuff[] = New TPersonStuff[names.length]
+	For Local i:Int = 0 Until names.length
+		pstuff[i] = New TPersonStuff
+		pstuff[i].forename = names[i][0]
+		pstuff[i].surname = names[i][1]
+		pstuff[i].dataInt = Rnd(1, 10)
+		pstuff[i].dataFloat = Rnd(1, 10)
+		pstuff[i].dataDouble = Rnd(1, 10)
+		pstuff[i].dataLong = Rnd(1, 100000000000:Long)
+	Next
+
+
+	db.executeQuery("DROP TABLE if exists person")
+'DebugStop
+	' Create a new table
+	Local s:String = "CREATE TABLE if not exists person (id integer primary key AUTO_INCREMENT, " + ..
+	  " forename varchar(30), surname varchar(30), dataint integer, datafloat float, datadouble double, datalong bigint )"
+
+	db.executeQuery(s)
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' get a new query object 
+	Local query:TDatabaseQuery = TDatabaseQuery.Create(db)
+
+	' prepare the insert statement
+	' by preparing it once, the database can reuse it on succesive inserts which is more efficient.
+	query.prepare("INSERT INTO person values (NULL, ?, ?, ?, ?, ?, ?)")
+	
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' iterate round the array inserting new entries
+	For Local i:Int = 0 Until names.length
+		query.bindValue(0, TDBString.Set(pstuff[i].forename))
+		query.bindValue(1, TDBString.Set(pstuff[i].surname))
+		query.bindValue(2, TDBInt.Set(pstuff[i].dataInt))
+		query.bindValue(3, TDBFloat.Set(pstuff[i].dataFloat))
+		query.bindValue(4, TDBDouble.Set(pstuff[i].datadouble))
+		query.bindValue(5, TDBLong.Set(pstuff[i].dataLong))
+'DebugStop
+		query.execute()
+		
+		If db.hasError() Then
+			errorAndClose(db)
+		End If
+	Next
+	
+	' select
+	query = db.executeQuery("SELECT * FROM person")
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+'	While query.nextRow()
+'		Local record:TQueryRecord = query.rowRecord()
+	For Local record:TQueryRecord = EachIn query
+		
+		Local i:Int = record.value(0).getInt() - 1
+		Print(" IN  - " + pstuff[i].forename + " : " + pstuff[i].surname + " : " + pstuff[i].dataInt + ..
+			" : " + pstuff[i].dataFloat + " : " + pstuff[i].dataDouble + " : " + pstuff[i].dataLong)
+		
+		Print(" OUT - " + record.getString(1) + " : " + record.getString(2) + ..
+			" : " + record.getInt(3) + " : " + record.getFloat(4) + ..
+			" : " + record.getDouble(5) + " : " + record.getLong(6) )
+'	Wend
+	Next
+			
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function
+
+
+

+ 130 - 0
mariadb.mod/tests/test_04.bmx

@@ -0,0 +1,130 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+Import BRL.RandomDefault
+
+Type TPersonStuff
+	Field forename:String
+	Field surname:String
+	Field dataInt:Int
+	Field dataFloat:Float
+	Field dataDouble:Double
+	Field dataLong:Long
+End Type
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+Local names:String[][] = [ ..
+	[ "Alfred", "Aho" ],   ..
+	[ "Brian", "Kernighan" ], ..
+	[ "Peter", "Weinberger" ] ]
+	
+Local pstuff:TPersonStuff[] = New TPersonStuff[names.length]
+For Local i:Int = 0 Until names.length
+	pstuff[i] = New TPersonStuff
+	pstuff[i].forename = names[i][0]
+	pstuff[i].surname = names[i][1]
+	pstuff[i].dataInt = Rnd(1, 10)
+	pstuff[i].dataFloat = Rnd(1, 10)
+	pstuff[i].dataDouble = Rnd(1, 10)
+	pstuff[i].dataLong = Rnd(1, 100000000000:Long)
+Next
+	
+
+If db.isOpen() Then
+
+	db.executeQuery("DROP TABLE if exists person")
+'DebugStop
+	' Create a new table
+	Local s:String = "CREATE TABLE if not exists person (id integer primary key AUTO_INCREMENT, " + ..
+	  " forename varchar(30), surname varchar(30), dataint integer, datafloat float, datadouble double, datalong bigint )"
+
+	db.executeQuery(s)
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' get a new query object 
+	Local query:TDatabaseQuery = TDatabaseQuery.Create(db)
+
+	' prepare the insert statement
+	' by preparing it once, the database can reuse it on succesive inserts which is more efficient.
+	query.prepare("INSERT INTO person values (NULL, ?, ?, ?, ?, ?, ?)")
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	' iterate around the array inserting new entries
+	For Local i:Int = 0 Until names.length
+		query.bindValue(0, TDBString.Set(pstuff[i].forename))
+		query.bindValue(1, TDBString.Set(pstuff[i].surname))
+		query.bindValue(2, TDBInt.Set(pstuff[i].dataInt))
+		query.bindValue(3, TDBFloat.Set(pstuff[i].dataFloat))
+		query.bindValue(4, TDBDouble.Set(pstuff[i].datadouble))
+		query.bindValue(5, TDBLong.Set(pstuff[i].dataLong))
+
+		query.execute()
+		
+		If db.hasError() Then
+			errorAndClose(db)
+		End If
+	Next
+
+	' prepare select
+	query.prepare("SELECT * FROM person WHERE surname LIKE ?")
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	query.bindValue(0, TDBString.Set("%n%"))
+'DebugStop
+	query.execute()
+
+	If db.hasError() Then
+		errorAndClose(db)
+	End If
+
+	While query.nextRow()
+
+		Local record:TQueryRecord = query.rowRecord()
+		
+		' auto_increment starts at 1...
+		Local i:Int = record.value(0).getInt() - 1
+
+		' compare what went in, to what went out.
+		Print(" IN  - " + pstuff[i].forename + " : " + pstuff[i].surname + " : " + pstuff[i].dataInt + ..
+			" : " + pstuff[i].dataFloat + " : " + pstuff[i].dataDouble + " : " + pstuff[i].dataLong)
+		
+		Print(" OUT - " + record.getString(1) + " : " + record.getString(2) + ..
+			" : " + record.getInt(3) + " : " + record.getFloat(4) + ..
+			" : " + record.getDouble(5) + " : " + record.getLong(6) )
+	Wend
+			
+	db.close()
+
+End If
+
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function
+
+
+
+

+ 39 - 0
mariadb.mod/tests/test_05.bmx

@@ -0,0 +1,39 @@
+SuperStrict
+
+Framework Database.MariaDB
+Import BRL.filesystem
+Import BRL.StandardIO
+
+Local db:TDBConnection = LoadDatabase("MARIADB", "maxtest", Null, 0, "brucey", "brucey")
+
+If Not db Then
+	Print("Didn't work...")
+	End
+End If
+
+If db.hasError() Then
+	errorAndClose(db)
+End If
+
+
+If db.isOpen() Then
+
+	' get a list of tables in the database
+	Local list:String[] = db.getTables()
+	
+	If list Then
+		For Local i:Int = 0 Until list.length
+			Print("   " + (i + 1) + ".   " + list[i])
+		Next
+	End If
+
+	db.close()
+	
+End If
+
+Function errorAndClose(db:TDBConnection)
+	Print(db.error().toString())
+	db.close()
+	End
+End Function
+