Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
//使用的时候连接状态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);
}
Пример #4
0
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;
}