112 lines
2.3 KiB
C++
112 lines
2.3 KiB
C++
#pragma once
|
|
|
|
struct MySQLFieldInfo {
|
|
String name;
|
|
String table;
|
|
String db;
|
|
u64 length;
|
|
String def;
|
|
u64 max_length;
|
|
u64 flags;
|
|
u32 type;
|
|
};
|
|
|
|
struct MySQL {
|
|
|
|
void* connection = 0;
|
|
u32 _preload_next_error_code = 0;
|
|
u32 affected_rows = 0;
|
|
u32 field_count = 0;
|
|
u32 row_count = 0;
|
|
u64 insert_id = 0;
|
|
String statement_info = ""; //
|
|
bool request_cleanup_delete = false;
|
|
bool request_pooled = false;
|
|
u32 request_leases = 0;
|
|
String request_host;
|
|
String request_username;
|
|
String request_password;
|
|
|
|
std::vector<MySQLFieldInfo> field_info;
|
|
|
|
bool connect(String host = "localhost", String username = "root", String password = "");
|
|
void disconnect();
|
|
String error();
|
|
String escape(String raw, char quote_char = '\'');
|
|
String parse_query_parameters(String query, StringMap m);
|
|
DValue query(String q);
|
|
DValue query(String q, StringMap params);
|
|
DValue get_pending_result();
|
|
|
|
// Unregisters non-pooled instances from request tracking. mysql_connect()
|
|
// handles remain request-owned until cleanup after their leases are released.
|
|
~MySQL() { disconnect(); }
|
|
|
|
};
|
|
|
|
inline MySQL* mysql_connect(String host = "localhost", String username = "root", String password = "")
|
|
{
|
|
if(context)
|
|
{
|
|
for(void* raw : context->resources.mysql_connections)
|
|
{
|
|
MySQL* db = (MySQL*)raw;
|
|
if(db && db->request_pooled && db->connection && db->request_host == host && db->request_username == username && db->request_password == password)
|
|
{
|
|
db->request_leases++;
|
|
return(db);
|
|
}
|
|
}
|
|
}
|
|
MySQL* db = new MySQL();
|
|
db->request_cleanup_delete = true;
|
|
db->request_pooled = context != 0;
|
|
db->request_leases = 1;
|
|
db->request_host = host;
|
|
db->request_username = username;
|
|
db->request_password = password;
|
|
db->connect(host, username, password);
|
|
return(db);
|
|
}
|
|
|
|
inline void mysql_disconnect(MySQL* m)
|
|
{
|
|
if(!m)
|
|
return;
|
|
if(m->request_pooled)
|
|
{
|
|
if(m->request_leases > 0)
|
|
m->request_leases--;
|
|
return;
|
|
}
|
|
m->disconnect();
|
|
delete m;
|
|
}
|
|
|
|
inline String mysql_error(MySQL* m)
|
|
{
|
|
return(m->error());
|
|
}
|
|
|
|
String mysql_escape(String raw, char quote_char);
|
|
|
|
inline DValue mysql_query(MySQL* m, String q)
|
|
{
|
|
return(m->query(q));
|
|
}
|
|
|
|
inline DValue mysql_query(MySQL* m, String q, StringMap params)
|
|
{
|
|
return(m->query(q, params));
|
|
}
|
|
|
|
inline u64 mysql_insert_id(MySQL* m)
|
|
{
|
|
return(m->insert_id);
|
|
}
|
|
|
|
inline u32 mysql_affected_rows(MySQL* m)
|
|
{
|
|
return(m ? m->affected_rows : 0);
|
|
}
|