int PlatDbAccess::exec_trans(const vector<string>& sqls, int & last_insert_id , int & affected_rows, unsigned int uin) { int index = get_conn_index(uin); ACE_Guard<ACE_Thread_Mutex> guard(db_conn_lock_[index]); // 标识是否在使用 如果不使用了 请注意清理 db_conn_flag_[index] = 1; ACE_DEBUG((LM_TRACE, "[%D] PlatDbAccess exec_trans sql vec size=%d,conn index=%d\n", sqls.size(), index)); PlatDbConn* db_conn = get_db_conn(index); if (db_conn == NULL) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess get db conn failed\n")); db_conn_flag_[index] = 0; return -1; } int ret = 0; ret = db_conn->exec_trans(sqls, last_insert_id, affected_rows); if (ret != 0) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess exec_trans failed,%s\n", db_conn->get_err_msg() )); if(ret == -1) // -1 表示服务器连接断开 { ret = db_conn->exec_trans(sqls, last_insert_id, affected_rows); if(ret == -1) //重连还失败,清理这个连接对象 { fini(index); } } } db_conn_flag_[index] = 0; return stat_return(ret); }
int PlatDbAccess::exec_multi_query(const char* sql, vector<MYSQL_RES*>& result_set_list , unsigned int uin) { int index = get_conn_index(uin); ACE_Guard<ACE_Thread_Mutex> guard(db_conn_lock_[index]); // 标识是否在使用 如果不使用了 请注意清理 db_conn_flag_[index] = 1; // 1表示正在使用 ACE_DEBUG(( LM_TRACE, "[%D] PlatDbAccess exec query sql=%s\n", sql )); PlatDbConn* db_conn = get_db_conn(index); if (db_conn == NULL) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess get db conn failed\n")); db_conn_flag_[index] = 0; return -1; } int ret = 0; ret = db_conn->exec_multi_query(sql, result_set_list); if (ret != 0) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess exec query failed,idx=%d,%s\n" , index, db_conn->get_err_msg() )); if(ret == -1) // -1 表示服务器连接断开,尝试重连 try again { ret = db_conn->exec_multi_query(sql, result_set_list); if(ret == -1) //重连还失败,清理这个连接对象 { fini(index); } } } db_conn_flag_[index] = 0; return stat_return(ret); }
//使用的时候连接状态db_conn_flag_ 设置为 1 使用完设置为 0 //线程和连接绑定的时候不受此变量影响 int PlatDbAccess::exec_update(const char* sql, int& last_insert_id , int& affected_rows, unsigned int uin) { int index = get_conn_index(uin); ACE_Guard<ACE_Thread_Mutex> guard(db_conn_lock_[index]); // 标识是否在使用 如果不使用了 请注意清理 db_conn_flag_[index] = 1; ACE_DEBUG((LM_TRACE, "[%D] PlatDbAccess exec update sql=%s,conn index=%d\n", sql, index)); PlatDbConn* db_conn = get_db_conn(index); if (db_conn == NULL) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess get db conn failed\n")); db_conn_flag_[index] = 0; return -1; } int ret = 0; ret = db_conn->exec_update(sql, last_insert_id, affected_rows); if (ret != 0) { ACE_DEBUG((LM_ERROR, "[%D] PlatDbAccess exec update failed,ret=%d,%s,try again\n" , ret, db_conn->get_err_msg() )); if(ret == -1) // -1 表示服务器连接断开,尝试重连 try again { ret = db_conn->exec_update(sql, last_insert_id, affected_rows); if(ret == -1) //重连还失败,清理这个连接对象 { fini(index); } } } db_conn_flag_[index] = 0; return stat_return(ret); }
static uint32 _srv_SMBtcon_NT1(PSESS_HND sess_hnd, uint16 *conn_tid, Q_TCON_ANDX_4 *q4, Q_TCON_ANDX_D_4 *qd4, R_TCON_ANDX_3 *r3, R_TCON_ANDX_D_3 *rd3) { PCONN_HND conn_hnd = NULL; int snum = -1; SMBSTR *dir_path = NULL; const char *path = smbstrA(&qd4->path); const char *dev = smbstrA(&qd4->device); char *service; struct vfs_connection_struct *vfs_conn; struct smb_connection_struct *conn; BOOL is_ipc; BOOL is_print; uint32 err = NT_STATUS_NOPROBLEMO; conn_hnd = find_conn_hnd_by_index(sess_hnd, *conn_tid); if (conn_hnd != NULL) { DEBUG(10,("close connection %d\n", *conn_tid)); conn_close_hnd(conn_hnd); } if (path == NULL || dev == NULL) return ERRDOS|ERRnosuchshare; DEBUG(10,("path: [%s] device: [%s]\n", path, dev)); service = strchr(path+2, '\\') + 1; snum = lp_servicenumber(service); if (snum < 0) { err = ERRDOS|ERRnosuchshare; goto end; } if (!create_conn_hnd(sess_hnd, &conn_hnd, NULL) || conn_hnd == NULL || !get_conn_index(conn_hnd, conn_tid)) { err = NT_STATUS_INVALID_HANDLE; goto end; } is_ipc = strequal(dev, "IPC") || strequal(service, "IPC$"); is_print = strequal(dev, "LPT:"); vfs_conn = g_new(struct vfs_connection_struct, 1); if (vfs_conn == NULL) { err = NT_STATUS_NO_MEMORY; goto end; } conn = g_new(struct smb_connection_struct, 1); if (conn == NULL) { err = NT_STATUS_NO_MEMORY; goto end; } if (is_ipc) { rd3->service = "IPC"; smbstr_initA(&rd3->nativefs, "", 0); dir_path = NULL; vfs_init_ipc(vfs_conn, snum); smbvfs_init_ipc(conn, snum); } else if (is_print) { rd3->service = "LPT:"; smbstr_initA(&rd3->nativefs, "", 0); dir_path = smbstr_setA("", 0); vfs_init_print(vfs_conn, snum); smbvfs_init_print(conn, snum); } else { rd3->service = "A:"; smbstr_initA(&rd3->nativefs, lp_fstype(snum), 0); dir_path = smbstr_setA(lp_pathname(snum), 0); vfs_init_fs(vfs_conn, snum); smbvfs_init_fs(conn, snum); } vfs_conn->connectpath = smbstr_dup(dir_path); if (!set_conn_info(conn_hnd, vfs_conn, conn, smbstr_dup(&qd4->path), dir_path)) { err = NT_STATUS_INVALID_HANDLE; goto end; } DEBUG(10,("service: [%s] snum: [%d] tid: [%d]\n", dir_path ? smbstrA(dir_path) : "", snum, *conn_tid)); end: if (err) { DEBUG(10,("error:[%x]\n", err)); conn_close_hnd(conn_hnd); } return err; }