📄 csqlbcpresult.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 + -