#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 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); }