Skip to content

Commit

Permalink
add mysql8.c3l (#39)
Browse files Browse the repository at this point in the history
Co-authored-by: Christoffer Lerno <[email protected]>
  • Loading branch information
louis77 and lerno authored Dec 30, 2024
1 parent 469736c commit e6dd243
Show file tree
Hide file tree
Showing 3 changed files with 207 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ This repository contains external libraries for use with C3.
- OpenGL
- Vulkan (WIP)
- GLFW https://www.glfw.org/ - WIP
- MySQL 8 https://dev.mysql.com/doc/c-api/8.0/en/
- SQLite 3 https://sqlite.com/c3ref/intro.html

## Guide for writing bindings
Expand Down
45 changes: 45 additions & 0 deletions libraries/mysql8.c3l/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"provides": "mysql8",
"targets": {
"macos-aarch64": {
"linked-libraries": [
"mysqlclient"
]
},
"macos-x64": {
"linked-libraries": [
"mysqlclient"
]
},
"linux-x64": {
"linked-libraries": [
"mysqlclient"
]
},
"linux-x86": {
"linked-libraries": [
"mysqlclient"
]
},
"openbsd-x86": {
"linked-libraries": [
"mysqlclient"
]
},
"openbsd-x64": {
"linked-libraries": [
"mysqlclient"
]
},
"freebsd-x64": {
"linked-libraries": [
"mysqlclient"
]
},
"freebsd-x86": {
"linked-libraries": [
"mysqlclient"
]
}
}
}
161 changes: 161 additions & 0 deletions libraries/mysql8.c3l/mysql8.c3i
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
// mysql8.c3i
// Binding originally created by Louis @ https://github.com/louis77

module mysql8;

def Mysql = void*;
def MysqlRes = void*;
def MysqlRow = void**;
def MysqlStmt = void*;

const int MYSQL_NO_DATA = 100;

distinct FieldType = int;

const FieldType TYPE_DECIMAL = 0;
const FieldType TYPE_TINY = 1;
const FieldType TYPE_SHORT = 2;
const FieldType TYPE_LONG = 3;
const FieldType TYPE_FLOAT = 4;
const FieldType TYPE_DOUBLE = 5;
const FieldType TYPE_NULL = 6;
const FieldType TYPE_TIMESTAMP = 7;
const FieldType TYPE_LONGLONG = 8;
const FieldType TYPE_INT24 = 9;
const FieldType TYPE_DATE = 10;
const FieldType TYPE_TIME = 11;
const FieldType TYPE_DATETIME = 12;
const FieldType TYPE_YEAR = 13;
const FieldType TYPE_NEWDATE = 14; // Unused
const FieldType TYPE_VARCHAR = 15;
const FieldType TYPE_BIT = 16;
const FieldType TYPE_TIMESTAMP2 = 17;
const FieldType TYPE_DATETIME2 = 18; /**< Internal to MySQL. Not used in protocol */
const FieldType TYPE_TIME2 = 19; /**< Internal to MySQL. Not used in protocol */
const FieldType TYPE_TYPED_ARRAY = 20; /**< Used for replication only */
const FieldType TYPE_INVALID = 243;
const FieldType TYPE_JSON = 245;
const FieldType TYPE_NEWDECIMAL = 246;
const FieldType TYPE_ENUM = 247;
const FieldType TYPE_SET = 248;
const FieldType TYPE_TINY_BLOB = 249;
const FieldType TYPE_MEDIUM_BLOB = 250;
const FieldType TYPE_LONG_BLOB = 251;
const FieldType TYPE_BLOB = 252;
const FieldType TYPE_VAR_STRING = 253;
const FieldType TYPE_STRING = 254;
const FieldType TYPE_GEOMETRY = 255;

enum MysqlOption : CInt {
OPT_CONNECT_TIMEOUT,
OPT_COMPRESS,
OPT_NAMED_PIPE,
INIT_COMMAND,
READ_DEFAULT_FILE,
READ_DEFAULT_GROUP,
SET_CHARSET_DIR,
SET_CHARSET_NAME,
OPT_LOCAL_INFILE,
OPT_PROTOCOL,
SHARED_MEMORY_BASE_NAME,
OPT_READ_TIMEOUT,
OPT_WRITE_TIMEOUT,
OPT_USE_RESULT,
REPORT_DATA_TRUNCATION,
OPT_RECONNECT,
PLUGIN_DIR,
DEFAULT_AUTH,
OPT_BIND,
OPT_SSL_KEY,
OPT_SSL_CERT,
OPT_SSL_CA,
OPT_SSL_CAPATH,
OPT_SSL_CIPHER,
OPT_SSL_CRL,
OPT_SSL_CRLPATH,
OPT_CONNECT_ATTR_RESET,
OPT_CONNECT_ATTR_ADD,
OPT_CONNECT_ATTR_DELETE,
SERVER_PUBLIC_KEY,
ENABLE_CLEARTEXT_PLUGIN,
OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
OPT_MAX_ALLOWED_PACKET,
OPT_NET_BUFFER_LENGTH,
OPT_TLS_VERSION,
OPT_SSL_MODE,
OPT_GET_SERVER_PUBLIC_KEY,
OPT_RETRY_COUNT,
OPT_OPTIONAL_RESULTSET_METADATA,
OPT_SSL_FIPS_MODE,
OPT_TLS_CIPHERSUITES,
OPT_COMPRESSION_ALGORITHMS,
OPT_ZSTD_COMPRESSION_LEVEL,
OPT_LOAD_DATA_LOCAL_DIR,
OPT_USER_PASSWORD,
OPT_SSL_SESSION_DATA,
OPT_TLS_SNI_SERVERNAME
}

enum Autocommit : CInt {
AUTOCOMMIT_OFF,
AUTOCOMMIT_ON
}

extern fn CULong affected_rows(Mysql mysql) @extern("mysql_affected_rows");
extern fn bool autocommit(Mysql mysql, Autocommit mode) @extern("mysql_autocommit");
extern fn void close(Mysql mysql) @extern("mysql_close");
extern fn bool commit(Mysql mysql) @extern("mysql_commit");
extern fn Mysql init(Mysql mysql) @extern("mysql_init");
extern fn CUInt errno(Mysql mysql) @extern("mysql_errno");
extern fn ZString error(Mysql mysql) @extern("mysql_error");
extern fn MysqlRow fetch_row(MysqlRes result) @extern("mysql_fetch_row");
extern fn void free_result(MysqlRes result) @extern("mysql_free_result");
extern fn void library_end() @extern("mysql_server_end");
extern fn CInt library_init(CInt argc, void* argv, void* groups) @extern("mysql_server_init");
extern fn CUInt num_fields(MysqlRes result) @extern("mysql_num_fields");
extern fn CInt options(Mysql *mysql, MysqlOption option, void *arg) @extern("mysql_options");
extern fn CInt ping(Mysql mysql) @extern("mysql_ping");
extern fn Mysql real_connect(Mysql mysql, ZString host, ZString user, ZString passwd, ZString db, CUInt port, ZString unix_socket, CULong client_flag) @extern("mysql_real_connect");
extern fn CInt real_query(Mysql mysql, ZString stmt_str, CULong length) @extern("mysql_real_query");
extern fn bool rollback(Mysql mysql) @extern("mysql_rollback");
extern fn MysqlRes use_result(Mysql mysql) @extern("mysql_use_result");

// Prepared Statement Functions

struct MysqlBind {
CULong *length; /* output length pointer */
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 */
bool *error;
CUChar *row_ptr; /* for the current data position */
void* store_param_func;
void* fetch_result;
void* skip_result;

CULong buffer_length; /* output buffer length, must be set when fetching str/binary */
CULong offset; /* offset position for char/binary fetch */
CULong length_value; /* Used if length is 0 */
CUInt param_number; /* For null count and error messages */
CUInt pack_length; /* Internal length for packed data */
FieldType buffer_type; /* buffer type */ // ENUM enum_field_types
bool error_value; /* used if error is 0 */
bool is_unsigned; /* set if integer type is unsigned */
bool long_data_used; /* If used with mysql_send_long_data */
bool is_null_value; /* Used if is_null is 0 */
void *extension;
}

extern fn CULong stmt_affected_rows(MysqlStmt stmt) @extern("mysql_stmt_affected_rows");
extern fn bool stmt_bind_param(MysqlStmt stmt, MysqlBind* bind) @extern("mysql_stmt_bind_param");
extern fn bool stmt_close(MysqlStmt stmt) @extern("mysql_stmt_close");
extern fn CInt stmt_execute(MysqlStmt stmt) @extern("mysql_stmt_execute");
extern fn CInt stmt_fetch(MysqlStmt stmt) @extern("mysql_stmt_fetch");
extern fn CInt stmt_fetch_column(MysqlStmt stmt, MysqlBind* bind, CUInt column, CULong offset) @extern("mysql_stmt_fetch_column");
extern fn CUInt stmt_field_count(MysqlStmt stmt) @extern("mysql_stmt_field_count");
extern fn bool stmt_free_result(MysqlStmt stmt) @extern("mysql_stmt_free_result");
extern fn MysqlStmt stmt_init(Mysql mysql) @extern("mysql_stmt_init");
extern fn CInt stmt_next_result(MysqlStmt stmt) @extern("mysql_stmt_next_result");
extern fn CInt stmt_prepare(MysqlStmt stmt, ZString stmt_str, CULong length) @extern("mysql_stmt_prepare");
extern fn CInt stmt_store_result(MysqlStmt stmt) @extern("mysql_stmt_store_result");
extern fn bool stmt_bind_result(MysqlStmt stmt, MysqlBind *bind) @extern("mysql_stmt_bind_result");

0 comments on commit e6dd243

Please sign in to comment.