#include <stdio.h>
#include <dbsql.h>
#define FLD_MAX_BUFF_LEN 2048
#define MAX_BUFF_NUM 1
#pragma pack(1)
char *ltrim( char * str) /*去掉str右边的空格*/
{
int len ;
len = strlen (str);
while (len > 0 && str[len -1 ] == ' ')
{
len --;
}
str[len] = '/0';
return str;
}
typedef char * FILED;
int main(int argc, char *argv[])
{
HSTMT hstmt,hstmt1;
RETCODE rc;
FILED fields[2000];
char tmp[3],tmpstr[64*1024 + 1],*tmp_pos;
char tmpsql[9182];
int pcrow,i,j,k;
int num,max_buf_len,tot_num;
double tm1,tm2,tm;
FILE *fptr;
SWORD pfSqlType,pibScale,pfNullable,counts; /*#define SWORD short int*/
UDWORD pcbColDef;
int tmp_int;
double tmp_double;
int fieldlen[2000];
int is_continue;
int maxlen;
UCHAR szColName[100];
SWORD cbColNameMax=99;
SWORD pcbColName;
if ( argc != 5 )
{
printf("Usage : load user passwd tablename tablefile /n");
exit (-1);
}
fptr = fopen(argv[4],"rt");
if (fptr == NULL)
{
printf(" open output file %s error/n" ,argv[4]);
fflush(stdout);
printf(" /t倒入表 %s 失败./n",argv[3]);
return -1;
}
tm = get_milli_time();
SQLAllocEnv(0 );
rc = SQLConnect( 0,"",0,(UCHAR *)argv[1],0,(UCHAR *)argv[2],0);
if (rc != SQL_SUCCESS)
{
printf(" /t倒入表 %s 失败./n",argv[3]);
return -1;
}
rc = SQLAllocStmt(0,&hstmt);
if (rc != SQL_SUCCESS)
{
printf("Alloc stmt is failed./n");
printf(" /t倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
rc = SQLAllocStmt(0,&hstmt1);
if (rc != SQL_SUCCESS)
{
printf("Alloc stmt is failed./n");
printf(" /t倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
sprintf(tmpsql,"select * from %s where 1 != 1",argv[3]);
rc = SQLPrepare(hstmt,(UCHAR *)tmpsql,0);
if (rc != SQL_SUCCESS)
{
printf("sql is %s/n",tmpsql);
printf(" /t倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
rc = SQLExecute(hstmt);
if (rc != SQL_SUCCESS)
{
printf("file is %s line is %d/n",__FILE__,__LINE__);
printf(" /t倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
SQLNumResultCols( hstmt,( SWORD FAR *)&counts);
num = 0;
sprintf(tmpsql,"insert into %s values ( :V0",argv[3]);
for (i = 1; i < counts ; i++)
{
sprintf(tmpsql,"%s,:V%d",tmpsql,i);
}
strcat(tmpsql,")");
for (i = 1; i <= counts ; i++)
{
SQLDescribeCol(hstmt,i,szColName,cbColNameMax,&pcbColName
,&pfSqlType,&pcbColDef, &pibScale,&pfNullable);
fieldlen[i - 1 ] = pibScale + 1;
fields[i - 1] = (char *)malloc(MAX_BUFF_NUM * fieldlen[i-1] + 1);
if (fields[i-1] == NULL)
{
printf(" /t内存不够,倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
}
rc = SQLPrepare(hstmt1,(UCHAR *)tmpsql,0);
if (rc != SQL_SUCCESS)
{
printf("sql is %s/n",tmpsql);
printf(" /t倒入表 %s 失败./n",argv[3]);
fflush(stdout);
return -1;
}
tot_num = 0;
while (1)
{
tm1= get_milli_time();
num = 0;
for (i = 0; i < counts ; i++)
{
memset(fields[i],' ',MAX_BUFF_NUM * fieldlen[i]);
}
for ( k = 0 ; k < MAX_BUFF_NUM ; k++ )
{
memset(tmpstr,'/0',sizeof(tmpstr));
is_continue = 1;
if ( fgets(tmpstr,64*1024,fptr) == NULL)
{
is_continue = 0;
break;
}
num++;
tmp_pos = tmpstr;
for (i = 0; i < counts ; i++)
{
j = 0;
maxlen = 0;
while ((*tmp_pos != '|') && maxlen < fieldlen[i]-1 )
{
maxlen ++;
fflush(stderr);
fields[i][ k * fieldlen[i] + j] = *tmp_pos;
tmp_pos ++;
j++;
}
if ( j < fieldlen[i]-1 )
{
j = fieldlen[i] - 1 ;
fields[i][ k * fieldlen[i] + j] = '/0';
}
tmp_pos ++;
/*
if (fields[i][k * fieldlen[i]] == '/0')
{
sprintf(&fields[i][k * fieldlen[i]] ,"NULL");
}
for (j = 0; j < fieldlen[i] ; j++ )
{
if ( fields[i][k * fieldlen[i] + j ] == '/0')
{
fields[i][k * fieldlen[i] + j ] = ' ';
}
}
*/
}
}
if ( num > 0 )
{
for ( i = 0 ; i < counts ; i++ )
{
if (SQLBindParameter(hstmt1,i+1,0,SQL_C_CHAR,0,0,0,
fields[i],fieldlen[i]-1 ,&max_buf_len) != SQL_SUCCESS)
{
printf(" /t倒入表 %s 失败./n",argv[3]);
return -1;
}
}
if (SQLExecuteEx(hstmt1,num) != SQL_SUCCESS)
{
printf(" /t倒入表 %s 失败,num is %d /n",argv[3],num);
ROLLBACK_TRAN(SQL_NULL_HDBC);
num = 0;
break;
}
tot_num += num;
COMMIT_TRAN(SQL_NULL_HDBC);
}
tm2= get_milli_time();
if ( is_continue == 0)
{
break;
}
} /*end while*/
COMMIT_TRAN(SQL_NULL_HDBC);
fclose(fptr);
tm2= get_milli_time();
printf("/t共有 %d 行被倒入,共耗时: %12.3lf 秒/n" , tot_num , tm2 - tm);
SQLFreeStmt( hstmt, SQL_DROP);
SQLFreeStmt( hstmt1, SQL_DROP);
SQLFreeEnv(0);
return 0;
}