Пример #1
0
// 动态加载 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);
}
Пример #2
0
// 动态加载 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);
}