⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csqlbcpresult.cpp

📁 很好用的数据库连接组件
💻 CPP
字号:
#include "stdafx.h" 
#include "CSqlBcpResult.h" 
#include "CSqlError.h"
#include "CVariant.h" 
#include "comlog.h"
/*!
    .CSqlBcpResult内部的属性类,用于实现
*/
class CSqlBcpResultPrivate 
{
public :
	const CSqlDriver * sqldriver ;
	bool active ;
	int columns ;
	int rows ;
	// 发送了多少行
	int lastRows ;
	// 上次bcp了多少行
	int count ;
	//  上次checkpoint到现在总共多少行
	bool ownBuf ;
	//  是否自己new的buffer
	char(*buf)[256];
	// buf 指针 
	CSqlError error ;
	string table ;
	// 要bcp的表
};

CSqlBcpResult::CSqlBcpResult(const CSqlDriver*db)
{
    TRACE("临时调试");
    d = new CSqlBcpResultPrivate();
    d->sqldriver = db ;
    d->columns = 0 ;
    d->rows = 0 ;
    d->lastRows = 0 ;
    d->count = 0 ;
    d->buf = NULL ;
    d->ownBuf = false ;
    d->active = FALSE ;
}

/*!
    Destroys the object and frees any allocated resources.
*/

CSqlBcpResult ::~CSqlBcpResult()
{
    if(d->ownBuf)
    {
        delete[]d->buf ;
        d->buf = NULL ;
    }
    delete d ;
    d = NULL ;
}

void 
CSqlBcpResult::setActive(bool a)
{
    d->active = a ;
}

/*================================================================================
** 函数名称:	bool CSqlBcpResult::start (const string & tableName)
** 主要功能:	开始一个bcp过程但不bind
** 入口参数:		
** 序号	参数类新	参数名称	作用			说明
** 1	const string&	tableName   表名	
** 出口参数:	类型: 	bool		作用:是否成功
** 修改记录:
** 序号	修改人		修改日期	修改内容			修改目的
**	
=================================================================================== */

bool CSqlBcpResult::start(const string& tableName)
{
	//TRACE("bool CSqlBcpResult::start(...)");
	if(d->active)
	{
		 LOG(NULL,0,"如果系统中正在进行相关BCP处理,强制BCP处理终止" );
		 end();
	}
	d->active = false ;
	d->columns = fCheckTable(tableName);
	
	LOG2(NULL,0,"进行BCP操作预处理 -- 0 --:操作表 = [%s];列数 = [%d]",tableName.c_str(),d->columns);
	
	if(d->columns ==0 )
	{
		ERRLOG1(NULL,0 ,"操作表[%s]不存在,异常返回" , tableName.c_str() );
		return false ;
	}
	
	if(!fStart(tableName))
	{
		// LOG1(NULL , 0 , "start table %s bcp process fail ");
		return false ;
	}
	//DB_TRACE(5,"CSqlBcpResult",("fStart (tableName)\n"));
	// clear buf allocated last time 
	if(d->ownBuf && d->buf)
	{
		delete[] d->buf ;
		d->ownBuf = false ;
		d->buf = NULL ;
	}
	d->table = tableName ;
	return true ;
}


/*================================================================================
** 函数名称:	bool CSqlBcpResult::bind (char buf[][256], int len)
** 主要功能:	进行bind操作,如果buf==0 会主动new一个buffer.
** 入口参数:		
** 序号	参数类新	参数名称	作用			说明
** 1	char buf[][256]          被绑定的buffer指针
** 2    int         len          缓冲区长度-1 	
** 出口参数:	类型: 	bool		作用:是否成功
** 修改记录:
** 序号	修改人		修改日期	修改内容			修改目的
**	
=================================================================================== */

bool CSqlBcpResult::bind(char buf[][256],int len)
{
	//TRACE("bool CSqlBcpResult::bind(...)");
	LOG1(NULL,0,"进行BIND操作 -- 0 --:绑定列数为[%d]",len);
	//DB_TRACE(5,"ltb",("begin bind \n"));
	/*
		if (d->active)
		{
			//  LOG(NULL , 0 , " bcp is in processing , can not bind again " );
			return false;
		}
	*/
	if(d->columns == 0)
	{
		// LOG1(NULL , 0 , "need begin() fist " );
		return false ;
	}
	if(len && len < d->columns)
	{
		// LOG2(NULL , 0 , "buf size is shorter than columns of table : %d < %d " , len , d-columns);
		return false ;
	}
    
	char(* i_buf)[256];
	if(buf == NULL)
	{
		LOG(NULL,0,"buf = null");
		i_buf = new char[d->columns + 1][256];
		if(!i_buf)
		{
			//LOG(NULL , 0 , "can not allocate memory " );
			return false ;
		}
		//DB_TRACE(5,"ltb",(" bind %d\n",d->columns));
		if(!fBind(i_buf,d->columns))
		{
			delete[] i_buf ;
			i_buf = NULL ;
			return false ;
		}
		d->ownBuf = true ;
		d->buf = i_buf ;
	}
	else 
	{
		LOG(NULL,0,"buf!=NULL");
		//DB_TRACE(5,"ltb",(" bind %d\n",d->columns));
		if(!fBind(buf,d->columns))
		{
			return false ;
		}
		d->ownBuf=false ;
		d->buf=buf ;
	}
	d->active = true ;
	d->rows = 0 ;
	return true ;
}

/*================================================================================
** 函数名称:	bool CSqlBcpResult::begin (const string & tableName)
** 主要功能:	开始一个bcp过程,不需要再进行bind操作,程序主动分配buffer
** 入口参数:		
** 序号	参数类新	参数名称	作用			说明
** 1	const string&	tableName   表名	
** 出口参数:	类型: 	bool		作用:是否成功
** 修改记录:
** 序号	修改人		修改日期	修改内容			修改目的
**	
=================================================================================== */

bool CSqlBcpResult::begin(const string&tableName)
{
    if(!start(tableName))
    {
        return false ;
    }
    return bind();
}

/*
    send row to bcp 
    if rows larger than MAXONCELINE , bcp rows using end() function 
*/
bool CSqlBcpResult::send()
{
	if(!d->active)
	{
		return false ;
	}
	LOG(NULL,0,"调用CSYBASEBcpResult::fSend(...)");
	if(fSend())
	{
		d->rows++;
		d->count++;
		if(((d->rows)%MAXONCELINE)==0)
		{
			end(false);
			//  录入但不结束bcp过程。
		}
		return true ;
	}
	else 
	{
		ERRLOG(NULL,0,"调用CSYBASEBcpResult::fSend(...),操作失败");
		return false ;
	}
}
/*================================================================================
** 函数名称:	bool CSqlBcpResult::end (bool needClose)
** 主要功能:	对发送的所有行进行提交,如果needClose为真,会结束bcp
**              如果提交的总行数大于MAXCHECKLINE会自动checkpoing
** 入口参数:		
** 序号	参数类新	参数名称	作用			说明
** 1	bool         needClose   是否需要结束bcp	
** 出口参数:	类型: 	bool		作用:是否成功
** 修改记录:
** 序号	修改人		修改日期	修改内容			修改目的
**	
=================================================================================== */

/*
    bcp rows 
    if all rows bcped large than MAXCHECKLINE ,
    call checkpoint  
*/

bool CSqlBcpResult::end(bool needClose)
{
	if(!d->active)
	{
		return false ;
	}
	LOG(NULL,0,"调用CSYBASEBcpResult::fEnd(...)");
	bool ret=fEnd(needClose);
	if((d->count!=0)&&(d->count%MAXCHECKLINE==0))
	{
		fCheckPoint();
		d->count=0 ;
	}
	if(needClose)
	{
		d->active=false ;
		d->lastRows=d->rows ;
		d->rows=0 ;
	}
	return ret ;
}
/*================================================================================
** 函数名称:	bool CSqlBcpResult::set (int cols, const CVariant & v)
** 主要功能:	设置缓冲区列的内容
** 入口参数:		
** 序号	参数类新	参数名称	作用			说明
** 1	int         cols        列索引
** 2    const CVariant& v       要设置的值	
** 出口参数:	类型: 	bool		作用:是否成功
** 修改记录:
** 序号	修改人		修改日期	修改内容			修改目的
**	
=================================================================================== */


bool CSqlBcpResult::set(int cols,const CVariant&v)
{
    if(!d->buf&&(cols>d->columns))
    {
        return false ;
    }
    strcpy(d->buf[cols],v.toPchar());
    return true ;
}
#if 1 
bool CSqlBcpResult::set(int cols,const char*v)
{
    if(!d->buf&&(cols>d->columns))
    {
        return false ;
    }
    strcpy(d->buf[cols],v);
    return true ;
}
bool CSqlBcpResult::set(int cols,int v)
{
    if(!d->buf&&(cols>d->columns))
    {
        return false ;
    }
    sprintf(d->buf[cols],"%d",v);
    return true ;
}
#endif 
/*
    返回buffer 列的指针 
*/
char*CSqlBcpResult::operator[](int cols)
{
    if(!d->buf&&(cols>d->columns))
    {
        return NULL ;
    }
    return(d->buf)[cols];
}
/*
    设置错误
*/
void 
CSqlBcpResult::setLastError(const CSqlError&e)
{
    d->error=e ;
}
/*
    返回错误
*/
CSqlError CSqlBcpResult::lastError()const 
{
    return d->error ;
}
/*
    是否可以发送行。
*/
bool CSqlBcpResult::isActive()const 
{
    return d->active ;
}

/*
    发送了多少行
*/
int 
CSqlBcpResult::row()const 
{
    return d->rows ;
}
/*
    上次bcp了多少行
*/
int 
CSqlBcpResult::lastRow()const 
{
    return d->lastRows ;
}
/*
    驱动层指针
*/
const CSqlDriver* CSqlBcpResult::driver()const 
{
    return d->sqldriver ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -