// 动态加载 libpg.dll 库 static void __pgsql_dll_load(void) { if (__pgsql_dll != NULL) { logger("pgsql(%s) has been loaded!", __pgsql_path.c_str()); return; } const char* path; const char* ptr = acl::db_handle::get_loadpath(); if (ptr) path = ptr; else #ifdef ACL_WINDOWS path = "libpg.dll"; #else path = "libpg.so"; #endif __pgsql_dll = acl_dlopen(path); if (__pgsql_dll == NULL) logger_fatal("load %s error: %s", path, acl_dlerror()); // 记录动态库路径,以便于在动态库卸载时输出库路径名 __pgsql_path = path; __dbconnect = (PQconnectdb_fn) acl_dlsym(__pgsql_dll, "PQconnectdb"); if (__dbconnect == NULL) logger_fatal("load PQconnectdb from %s error %s", path, acl_dlerror()); __dbstatus = (PQstatus_fn) acl_dlsym(__pgsql_dll, "PQstatus"); if (__dbstatus == NULL) logger_fatal("load PQstatus from %s error %s", path, acl_dlerror()); __dbexec = (PQexec_fn) acl_dlsym(__pgsql_dll, "PQexec"); if (__dbexec == NULL) logger_fatal("load PQexec from %s error %s", path, acl_dlerror()); __dbresult_status = (PQresultStatus_fn) acl_dlsym(__pgsql_dll, "PQresultStatus"); if (__dbresult_status == NULL) logger_fatal("load PQresultStatus from %s error %s", path, acl_dlerror()); __dberror_message = (PQerrorMessage_fn) acl_dlsym(__pgsql_dll, "PQerrorMessage"); if (__dberror_message == NULL) logger_fatal("load PQerrorMessage from %s error %s", path, acl_dlerror()); __dbfinish = (PQfinish_fn) acl_dlsym(__pgsql_dll, "PQfinish"); if (__dbfinish == NULL) logger_fatal("load PQfinish_fn from %s error %s", path, acl_dlerror()); __dbclear = (PQclear_fn) acl_dlsym(__pgsql_dll, "PQclear"); if (__dbclear == NULL) logger_fatal("load PQclear from %s error %s", path, acl_dlerror()); __dbnfields = (PQnfields_fn) acl_dlsym(__pgsql_dll, "PQnfields"); if (__dbnfields == NULL) logger_fatal("loas PQnfields from %s error %s", path, acl_dlerror()); __dbfname = (PQfname_fn) acl_dlsym(__pgsql_dll, "PQfname"); if (__dbfname == NULL) logger_fatal("load PQfname from %s error %s", path, acl_dlerror()); __dbntuples = (PQntuples_fn) acl_dlsym(__pgsql_dll, "PQntuples"); if (__dbntuples == NULL) logger_fatal("load PQntuples from %s error %s", path, acl_dlerror()); __dbget_value = (PQgetvalue_fn) acl_dlsym(__pgsql_dll, "PQgetvalue"); if (__dbget_value == NULL) logger_fatal("load PQgetvalue from %s error %s", path, acl_dlerror()); __dbcmd_tuples = (PQcmdTuples_fn) acl_dlsym(__pgsql_dll, "PQcmdTuples"); if (__dbcmd_tuples == NULL) logger_fatal("load PQcmdTuples from %s error %s", path, acl_dlerror()); logger("%s loaded!", path); atexit(__pgsql_dll_unload); }
// 动态加载 libmysql.dll 库 static void __mysql_dll_load(void) { if (__mysql_dll != NULL) { logger("mysql(%s) has been loaded!", __mysql_path.c_str()); return; } const char* path; const char* ptr = acl::db_handle::get_loadpath(); if (ptr) path = ptr; else #ifdef ACL_WINDOWS path = "libmysql.dll"; #else path = "libmysqlclient_r.so"; #endif __mysql_dll = acl_dlopen(path); if (__mysql_dll == NULL) logger_fatal("load %s error: %s", path, acl_dlerror()); // 记录动态库路径,以便于在动态库卸载时输出库路径名 __mysql_path = path; __mysql_libversion = (mysql_libversion_fn) acl_dlsym(__mysql_dll, "mysql_get_client_version"); if (__mysql_libversion == NULL) logger_fatal("load mysql_get_client_version from %s error: %s", path, acl_dlerror()); __mysql_client_info = (mysql_client_info_fn) acl_dlsym(__mysql_dll, "mysql_get_client_info"); if (__mysql_client_info == NULL) logger_fatal("load mysql_get_client_info from %s error: %s", path, acl_dlerror()); __mysql_init = (mysql_init_fn) acl_dlsym(__mysql_dll, "mysql_init"); if (__mysql_init == NULL) logger_fatal("load mysql_init from %s error: %s", path, acl_dlerror()); __mysql_open = (mysql_open_fn) acl_dlsym(__mysql_dll, "mysql_real_connect"); if (__mysql_open == NULL) logger_fatal("load mysql_real_connect from %s error: %s", path, acl_dlerror()); __mysql_close = (mysql_close_fn) acl_dlsym(__mysql_dll, "mysql_close"); if (__mysql_close == NULL) logger_fatal("load mysql_close from %s error: %s", path, acl_dlerror()); __mysql_options = (mysql_options_fn) acl_dlsym(__mysql_dll, "mysql_options"); if (__mysql_options == NULL) logger_fatal("load mysql_options from %s error: %s", path, acl_dlerror()); __mysql_autocommit = (mysql_autocommit_fn) acl_dlsym(__mysql_dll, "mysql_autocommit"); if (__mysql_autocommit == NULL) logger_fatal("load mysql_autocommit from %s error: %s", path, acl_dlerror()); __mysql_errno = (mysql_errno_fn) acl_dlsym(__mysql_dll, "mysql_errno"); if (__mysql_errno == NULL) logger_fatal("load mysql_errno from %s error: %s", path, acl_dlerror()); __mysql_error = (mysql_error_fn) acl_dlsym(__mysql_dll, "mysql_error"); if (__mysql_error == NULL) logger_fatal("load mysql_error from %s error: %s", path, acl_dlerror()); __mysql_query = (mysql_query_fn) acl_dlsym(__mysql_dll, "mysql_query"); if (__mysql_query == NULL) logger_fatal("load mysql_query from %s error: %s", path, acl_dlerror()); __mysql_num_fields = (mysql_num_fields_fn) acl_dlsym(__mysql_dll, "mysql_num_fields"); if (__mysql_num_fields == NULL) logger_fatal("load mysql_num_fields from %s error: %s", path, acl_dlerror()); __mysql_fetch_fields = (mysql_fetch_fields_fn) acl_dlsym(__mysql_dll, "mysql_fetch_fields"); if (__mysql_fetch_fields == NULL) logger_fatal("load mysql_fetch_fields from %s error: %s", path, acl_dlerror()); __mysql_fetch_row = (mysql_fetch_row_fn) acl_dlsym(__mysql_dll, "mysql_fetch_row"); if (__mysql_fetch_row == NULL) logger_fatal("load mysql_fetch_row from %s error: %s", path, acl_dlerror()); __mysql_store_result = (mysql_store_result_fn) acl_dlsym(__mysql_dll, "mysql_store_result"); if (__mysql_store_result == NULL) logger_fatal("load mysql_store_result from %s error: %s", path, acl_dlerror()); __mysql_num_rows = (mysql_num_rows_fn) acl_dlsym(__mysql_dll, "mysql_num_rows"); if (__mysql_num_rows == NULL) logger_fatal("load mysql_num_rows from %s error: %s", path, acl_dlerror()); __mysql_free_result = (mysql_free_result_fn) acl_dlsym(__mysql_dll, "mysql_free_result"); if (__mysql_free_result == NULL) logger_fatal("load mysql_free_result from %s error: %s", path, acl_dlerror()); __mysql_affected_rows = (mysql_affected_rows_fn) acl_dlsym(__mysql_dll, "mysql_affected_rows"); if (__mysql_affected_rows == NULL) logger_fatal("load mysql_affected_rows from %s error: %s", path, acl_dlerror()); __mysql_set_character_set = (mysql_set_character_set_fn) acl_dlsym(__mysql_dll, "mysql_set_character_set"); if (__mysql_affected_rows == NULL) logger_fatal("load mysql_set_character_set_fn %s error: %s", path, acl_dlerror()); __mysql_character_set_name = (mysql_character_set_name_fn) acl_dlsym(__mysql_dll, "mysql_character_set_name"); if (__mysql_affected_rows == NULL) logger_fatal("load mysql_character_set_name from %s error: %s", path, acl_dlerror()); __mysql_thread_init = (mysql_thread_init_fn) acl_dlsym(__mysql_dll, "mysql_thread_init"); if (__mysql_thread_init == NULL) logger_warn("load mysql_thread_init from %s error: %s", path, acl_dlerror()); __mysql_thread_end = (mysql_thread_end_fn) acl_dlsym(__mysql_dll, "mysql_thread_end"); if (__mysql_thread_end == NULL) logger_warn("load mysql_thread_end from %s error: %s", path, acl_dlerror()); __mysql_server_init = (mysql_server_init_fn) acl_dlsym(__mysql_dll, "mysql_server_init"); if (__mysql_server_init == NULL) logger_warn("load mysql_server_init from %s error: %s", path, acl_dlerror()); __mysql_server_end = (mysql_server_end_fn) acl_dlsym(__mysql_dll, "mysql_server_end"); if (__mysql_server_end == NULL) logger_warn("load mysql_server_end from %s error: %s", path, acl_dlerror()); logger("%s loaded!", path); atexit(__mysql_dll_unload); }