📄 csqlctlibrary.cpp
字号:
#include "CSqlCtlibrary.h"#include "comlog.h"#if 0CS_CONTEXT * CSYBASEDriverPrivate::cs_context = NULL; //将cs_context指针初始化为空int CSYBASEDriverPrivate::cs_con_count = 0; //将cs_con_count初始化为0#endif/*================================================================================** 函数名称: CSYBASEDriverPrivate::CSYBASEDriverPrivate** 主要功能: 构造实现** 入口参数: 无 ** 序号 参数类型 参数名称 作用 说明** ** ** ** 出口参数:无** 修改记录:=================================================================================== */CSYBASEDriverPrivate::CSYBASEDriverPrivate (){ //将用户名、密码、服务器名、数据库名、应用名置为空 strcpy (i_username, ""); strcpy (i_password, ""); strcpy (i_server, ""); strcpy (i_dbname, ""); strcpy (i_appname, ""); i_return_code = CS_FAIL; //将上一次ct调用结果置为失败 # if defined(_REENTRANT) ZcMutexLocker context_locker (zc_global_mutexpool->get ((void*)(&CSYBASEDriverPrivate::cs_context))); # endif #if 0 if (cs_con_count == 0) //应用进程里第一次构造此类对象,需要初始化上下文结构 { syb_ctx_init (); //进行上下文结构初始化 } ++cs_con_count; //连接个数加1 #endif};CSYBASEDriverPrivate::~CSYBASEDriverPrivate (){ # if defined(_REENTRANT) ZcMutexLocker context_locker (zc_global_mutexpool->get ((void*)(&CSYBASEDriverPrivate::cs_context))); # endif #if 0 --cs_con_count; //连接个数减1 if (cs_con_count == 0) //如果是最后的类对象 { syb_ctx_cleanup (); //将上下文结构清除 } #endif};/*================================================================================** 函数名称: CSYBASEDriverPrivate::syb_ctx_init** 主要功能: 初始化上下文结构** 入口参数: 无 ** 序号 参数类型 参数名称 作用 说明** 出口参数:** 类型: 作用** int 成功返回SYBASE_RETURN_SUCCEED,失败返回SYBASE_RETURN_FAIL** 修改记录:=================================================================================== */int CSYBASEDriverPrivate::syb_ctx_init (){ CS_RETCODE retcode1; CS_RETCODE retcode2; CS_RETCODE retcode3; CS_INT netio_type = CS_SYNC_IO; // TRACE("临时调试"); i_return_code = cs_ctx_alloc (SYBASE_CTLIB_VERSION, &cs_context); if (i_return_code != CS_SUCCEED) { ERRLOG(NULL,0,"上下文结构分配失败"); return SYBASE_RETURN_FAIL; } LOG(NULL,0,"上下文结构分配成功,进行上下文结构的初始化"); i_return_code = ct_init (cs_context, SYBASE_CTLIB_VERSION); if (i_return_code != CS_SUCCEED) { ERRLOG(NULL,0,"初始化上下文结构失败,清除上下文结构"); cs_ctx_drop (cs_context); cs_context = NULL; return SYBASE_RETURN_FAIL; } LOG(NULL,0,"上下文结构初始化成功"); #ifdef SYBASE_API_DEBUG if (i_return_code == CS_SUCCEED) { retcode1 = ct_debug (cs_context, NULL, CS_SET_FLAG, CS_DBG_API_STATES, NULL,CS_UNUSED); if (retcode1 != CS_SUCCEED) { // DB_TRACE (6, "SYBASE", ("syb_ctx_init: ct_debug() failed\n")); } } #endif #if 0 if (i_return_code == CS_SUCCEED) { //注册共享库消息处理回掉 retcode2 = cs_config (cs_context,CS_SET,CS_MESSAGE_CB,(void*)syb_csmsg_cb,CS_UNUSED, NULL); if (retcode2 != CS_SUCCEED) { // DB_TRACE (6, "SYBASE", ("syb_ctx_init: ct_config(csmsg) failed\n")); } } #endif #if 0 if (i_return_code == CS_SUCCEED) { //配置同步输入输出方式 retcode3 = ct_config (cs_context, CS_SET, CS_NETIO, &netio_type,CS_UNUSED, NULL); if (retcode3 != CS_SUCCEED) { // DB_TRACE (6, "SYBASE", ("syb_ctx_init: ct_config(netio) failed\n")); } } #endif return SYBASE_RETURN_SUCCEED; //成功返回SYBASE_RETURN_SUCCEED}/*================================================================================** 函数名称: CSYBASEDriverPrivate::syb_ctx_cleanup ** 主要功能: 清除上下文结构** 入口参数: 无 ** 序号 参数类型 参数名称 作用 说明** ** ** ** 出口参数:** 类型: 作用** int 成功返回SYBASE_RETURN_SUCCEED,失败返回SYBASE_RETURN_FAIL** 修改记录:=================================================================================== */intCSYBASEDriverPrivate::syb_ctx_cleanup (){ CS_RETCODE retcode; CS_INT exit_option; i_return_code = CS_SUCCEED; if(cs_context!=NULL) { i_return_code = ct_exit (cs_context, CS_UNUSED); //正常退出处理 if (i_return_code != CS_SUCCEED) //失败 {// DB_TRACE (6, "SYBASE", ("syb_ctx_cleanup: ct_exit(CS_UNUSED) failed\n")); i_return_code = ct_exit (cs_context, CS_FORCE_EXIT); //强行退出 if (i_return_code != CS_SUCCEED) {// DB_TRACE (6, "SYBASE",("syb_ctx_cleanup: ct_exit(CS_FORCE_EXIT) failed\n")); } } i_return_code = cs_ctx_drop (cs_context); //清除上下文结构 cs_context = NULL; } if (i_return_code != CS_SUCCEED) //清除失败 {// DB_TRACE (6, "SYBASE", ("syb_ctx_cleanup: cs_ctx_drop() failed\n")); return SYBASE_RETURN_FAIL; } return SYBASE_RETURN_SUCCEED;}/*================================================================================** 函数名称: CSYBASEDriverPrivate::syb_connect** 主要功能: 进行连接**** 入口参数:** 序号 参数类型 参数名称 作用 说明** 1 const char * username 用户名** 2 const char * password 密码** 3 const char * server server名** 4 const char * dbname 数据库名** 5 const char * appname 应用名** 出口参数:** 类型: 作用** int 成功返回SYBASE_RETURN_SUCCEED,失败返回SYBASE_RETURN_FAIL **** 修改记录=================================================================================== */intCSYBASEDriverPrivate::syb_connect (const char *username,const char *password,\ const char *server,const char *dbname, const char *appname){ CS_INT len; CS_RETCODE retcode; CS_RETCODE query_code; CS_INT restype; CS_BOOL hafailover = CS_TRUE;// TRACE("临时调试"); LOG5(NULL,0,"打开数据库驱动联结,参数:[%s],[%s],[%s],[%s],[%s]",\ username,password,server,dbname,appname); strcpy (i_username, username); strcpy (i_password, password); strcpy (i_server, server); strcpy (i_dbname, dbname); strcpy (i_appname, appname); if ((i_return_code == CS_SUCCEED) && (username != NULL)) { LOG(NULL,0,"联接成功且用户名不为空,设置用户名"); if ((i_return_code = ct_con_props (i_driver_connection, CS_SET, CS_USERNAME, (CS_CHAR *) username, CS_NULLTERM, NULL)) != CS_SUCCEED) { ERRLOG(NULL,0,"设置用户名失败,异常返回"); return SYBASE_RETURN_FAIL; } else { LOG(NULL,0,"设置用户名成功"); } } if ((i_return_code == CS_SUCCEED) && (password != NULL)) { LOG(NULL,0,"联接成功且密码不为空,设置密码"); if ((i_return_code = ct_con_props (i_driver_connection, CS_SET, CS_PASSWORD, (CS_CHAR *) password, CS_NULLTERM, NULL)) != CS_SUCCEED) { ERRLOG(NULL,0,"设置密码失败,异常返回"); return SYBASE_RETURN_FAIL; } else { LOG(NULL,0,"设置密码成功"); } } if ((i_return_code == CS_SUCCEED) && (appname != NULL)) { LOG(NULL,0,"联接成功且应用名不为空,设置应用名"); if ((retcode = ct_con_props (i_driver_connection, CS_SET, CS_APPNAME, (CS_CHAR *) appname, CS_NULLTERM, NULL)) != CS_SUCCEED) { ERRLOG(NULL,0,"设置应用名失败,异常返回"); } else { LOG(NULL,0,"设置应用名成功"); } } #ifdef HAFAILOVER if (i_return_code == CS_SUCCEED) { LOG(NULL,0,"联接成功,设置CS_HAFAILOVER属性"); if ((retcode = ct_con_props (i_driver_connection, CS_SET, CS_HAFAILOVER, &hafailover, CS_UNUSED, NULL)) != CS_SUCCEED) { ERRLOG(NULL,0,"设置CS_HAFAILOVER属性失败,异常返回"); } else { LOG(NULL,0,"设置CS_HAFAILOVER属性成功"); } } #endif /* HAFAILOVER */ #if 1 if (i_return_code == CS_SUCCEED) { CS_BOOL b_mybool = CS_TRUE; LOG(NULL,0,"联接成功,设置CS_BULK_LOGIN属性"); i_return_code = ct_con_props (i_driver_connection, CS_SET, CS_BULK_LOGIN, &b_mybool, CS_UNUSED, NULL); //设置联接支持bcp if (i_return_code != CS_SUCCEED) { ERRLOG(NULL,0,"设置CS_BULK_LOGIN属性失败,异常返回"); return SYBASE_RETURN_FAIL; } else { LOG(NULL,0,"设置CS_BULK_LOGIN属性成功"); } } #endif #if 1 if (i_return_code == CS_SUCCEED) { LOG(NULL,0,"以上设置成功,则打开一个联接"); len = (server == NULL) ? 0 : CS_NULLTERM; i_return_code = ct_connect (i_driver_connection, (CS_CHAR *) server, len); if (i_return_code != CS_SUCCEED) { ERRLOG(NULL,0,"连接服务器失败,异常返回"); return SYBASE_RETURN_FAIL; } else { LOG(NULL,0,"连接服务器成功"); } } #endif if ((dbname != NULL) && (strcmp (dbname, "") != 0)) { LOG1(NULL,0,"数据库不为空,应用[%s]数据库,并返回应用结果",dbname); int nRet = syb_use_db (dbname); if(nRet==SYBASE_RETURN_FAIL) { ERRLOG1(NULL,0,"应用[%s]数据库,注销连接",dbname); syb_con_cleanup(); } return nRet; } else { LOG(NULL,0,"连接成功且无数据库设置"); return SYBASE_RETURN_SUCCEED; }}/*================================================================================ ** 函数名称: CSYBASEDriverPrivate::syb_use_db ** 主要功能: 应用数据库 ** ** 入口参数: ** 序号 参数类型 参数名称 作用 说明 ** 1 const char * dbname 数据库名 ** ** ** ** ** 出口参数: ** 类型: 作用 ** int 成功返回SYBASE_RETURN_SUCCEED,失败返回SYBASE_RETURN_FAIL ** ** 修改记录 =================================================================================== */intCSYBASEDriverPrivate::syb_use_db (const char *dbname){ CS_RETCODE retcode; CS_RETCODE query_code; CS_COMMAND *cmd; CS_INT restype; strcpy (i_dbname, dbname); //记录数据库名 char cmdbuf[SYBASE_MAXSTRINGLEN]; if (dbname != NULL && (strcmp (dbname, "") != 0)) //数据库名不为空 { retcode = ct_cmd_alloc (i_driver_connection, &cmd); //分配命令结构 if (retcode != CS_SUCCEED) {// DB_TRACE (6, "SYBASE", ("ct_cmd_alloc failed\n")); return SYBASE_RETURN_FAIL; } sprintf (cmdbuf, "use %s\n", dbname); //构造应用数据库的命令 if ((retcode = ct_command (cmd, CS_LANG_CMD, cmdbuf, CS_NULLTERM, CS_UNUSED)) != CS_SUCCEED) //准备命令失败 {// DB_TRACE (6, "SYBASE", ("ct_command() failed\n")); ct_cancel (NULL, cmd, CS_CANCEL_ALL); //撤销命令 retcode = ct_cmd_drop (cmd); cmd = NULL; if (retcode != CS_SUCCEED) {// DB_TRACE (0, "SYBASE", ("ct_cmd_drop failed\n")); } return SYBASE_RETURN_FAIL; //返回失败 } //准备命令成功,往下执行 if ((retcode = ct_send (cmd)) != CS_SUCCEED) //发送失败 {// DB_TRACE (6, "SYBASE", ("ct_send() failed\n")); ct_cancel (NULL, cmd, CS_CANCEL_ALL); retcode = ct_cmd_drop (cmd); //清除命令结构 cmd = NULL; if (retcode != CS_SUCCEED) {// DB_TRACE (0, "SYBASE", ("ct_cmd_drop failed\n")); } return SYBASE_RETURN_FAIL; //返回失败 } query_code = CS_SUCCEED; while ((retcode = ct_results (cmd, &restype)) == CS_SUCCEED) //得到结果集 { switch ((int) restype) { case CS_CMD_SUCCEED: case CS_CMD_DONE: break; //成功跳出 case CS_CMD_FAIL: default: query_code = CS_FAIL; //失败置失败标志 break; } } //lyg //ct_cancel (NULL, cmd, CS_CANCEL_ALL); //用取消后续动作对命令作结束处理 retcode = ct_cmd_drop (cmd); //清除命令结构 cmd = NULL; if (retcode != CS_SUCCEED) {// DB_TRACE (0, "SYBASE", ("ct_cmd_drop failed\n")); } if (query_code != CS_SUCCEED) //得到结果集失败 { return SYBASE_RETURN_FAIL; //返回失败 } else //得到结果集成功 { return SYBASE_RETURN_SUCCEED; //返回成功 } } else //数据库名为空 { return SYBASE_RETURN_FAIL; //返回失败 }}/*================================================================================** 函数名称: CSYBASEDriverPrivate::syb_con_init** 主要功能: 初始化联接结构** 入口参数: 无 ** 序号 参数类型 参数名称 作用 说明** ** ** ** 出口参数:** 类型: 作用** int 成功返回SYBASE_RETURN_SUCCEED,失败返回SYBASE_RETURN_FAIL** 修改记录:=================================================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -