- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-08-20 14:58 编辑
noword2k 发表于 2014-08-20 14:35
csv格式直接读取就可以了你的程序不完不整,那些自定义的t_node,ctx_stu是什么玩意儿?里面的实现呢? ...
大约212行,含注释。
这个是C++的泛型处理,内部涉及大量的字符串处理。
分割字符串就几句话。- #include <sdbcdao.hpp>
- #include <tree.h>
- #define beginTransaction(db_conn_) ___SQL_Transaction__((db_conn_),TRANBEGIN)
- #define commitTransaction(db_conn_) ___SQL_Transaction__((db_conn_),TRANCOMMIT)
- #define rollbackTransaction(db_conn_) ___SQL_Transaction__((db_conn_),TRANROLLBACK)
- #ifdef __cplusplus
- extern "C" {
- #endif
- void uconv_free(void);
- int utf8togbk(const char *sourcebuf, size_t sourcelen, char *destbuf, size_t destlen);
- #ifdef __cplusplus
- }
- #endif
- typedef struct {
- SdbcDAO *dp;
- char *data,*p;
- } ctx_stu;
- typedef struct {
- int n;
- T_PkgType *tp;
- } t_node;
- static int node_cmp(void *s,void *d,int len)
- {
- t_node *sp=(t_node *)s;
- t_node *dp=(t_node *)d;
- return sp->n - dp->n;
- }
- static int fill_cols(T_Tree *bt,void *context)
- {
- t_node *nodep=(t_node *)bt->Content;
- ctx_stu *ctxp=(ctx_stu *)context;
- char *cp;
- void *rec;
- if(!*ctxp->p) return 0;
- cp=ctxp->p;
- ctxp->p=stptok(ctxp->p,NULL,0,"\t");
- if(*ctxp->p=='\t') *ctxp->p++=0;
- if(!nodep->tp) return 0;
- ctxp->dp->putOne(cp,nodep->tp);
- return 1;
- }
- static int has_cc(char *str)
- {
- char *p=str;
- while(*p) {
- if(*p & 128) return 1;
- p++;
- }
- return 0;
- }
- //插入一个表
- static int insert_a_table(T_SQL_Connect *db_conn,FILE *xfd,char *tabname,int param_ver)
- {
- char cols[4096],stmt[4096],*p,*savep;
- int ret,i,n;
- t_node node;
- ctx_stu ctx;
- T_Tree *cols_list=NULL;
- SdbcDAO *dao;
- //取出表名、列名
- if(NULL==fgets(cols,sizeof(cols),xfd)) {
- ShowLog(1,"%s:%s 没有数据!",__FUNCTION__,tabname);
- return -1;
- }
- tabname=strtok_r(cols," ",&savep);
- if(!tabname) {
- ShowLog(1,"%s: tabname is emypt!",__FUNCTION__);
- return -1;
- }
-
- strupper(tabname);
- try {
- dao=new SdbcDAO(db_conn,tabname);
- } catch( ... ) {
- ShowLog(1,"%s:%s Table not found!",__FUNCTION__,tabname);
- return -2;
- }
- dao->Data_init();
- //删除重复记录
- //因为类型不明,一律转换成char
- itoStr(param_ver,stmt);
- ret=dao->putOne(stmt,"parameter_ver");
- if(ret<0) {
- ShowLog(1,"%s:column parameter_ver not found!",__FUNCTION__);
- return -3;
- }
- mk_where("parameter_ver",stmt);
- ret=dao->Delete(stmt);
- ShowLog(5,"%s:stmt=%s,ret=%d",__FUNCTION__,stmt,ret);
- ctx.dp=dao;
- node.n=0;
- //生成加载列名表
- while(NULL != (p=strtok_r(NULL,",",&savep))) {
- if((255&*p) <= ' ') break;
- node.tp=dao->getTemplate(p);
- if(!node.tp) { //这个列的数据将被跳过
- ShowLog(1,"%s:%s column [%s] not found!",__FUNCTION__,tabname,p);
- }
- node.n++;
- cols_list=BB_Tree_Add(cols_list,&node,sizeof(node),node_cmp,NULL);
- }
- //加载数据
- char gbkbuf[4096];
- for(i=0;fgets(stmt,sizeof(stmt),xfd);i++) {
- if(has_cc(stmt)) {
- ret=utf8togbk(stmt, sizeof(stmt), gbkbuf, sizeof(gbkbuf));
- ctx.data=ctx.p=gbkbuf;
- } else {
- ctx.data=ctx.p=stmt;
- }
- ret=BB_Tree_Count(cols_list,&ctx,fill_cols);
- ret=dao->insert(stmt);
- if(ret<0) {
- ShowLog(1,"%s:insert %s fault,i=%d",__FUNCTION__,tabname,i);
- i--;
- }
- }
- BB_Tree_Free(&cols_list,NULL);
- delete dao;
- return i;
- }
复制代码 111行就是二叉树用作动态数组。
|
|