int N_SQL_Exec(T_Connect *connect,char *cmd) { T_CLI_Var *clip=(T_CLI_Var *)connect->Var; T_NetHead nethead; int i; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_Exec"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); nethead.ERRNO1=0; nethead.ERRNO2=(connect->status>0)?PACK_STATUS:0; nethead.PKG_REC_NUM=0; nethead.data=cmd; nethead.PKG_LEN=strlen(nethead.data); i=SendPack(connect,&nethead); if(i)return i; i=RecvPack(connect,&nethead); //ShowLog(5,"SQL_Exec:ret=%d,errno1=%d,len=%d:%s",i,nethead.ERRNO1,nethead.PKG_LEN,nethead.data); if(i){ return i; } EventCatch(connect,nethead.PROTO_NUM); return GetError(connect,&nethead); }
/* * -1:recv error -2:recv timeout -3:recv invalid data -4:send error -5:send timeout 0:closed >0:ok,the pack len is returned. */ int CBaseSocket::SendRecv( const char *req, unsigned int req_len, pfHandleInput pf, unsigned int hlen, char *rsp, unsigned int rsp_len, int timeout, int flags) { unsigned int nwrite = 0; int ret = SendN(nwrite, req, req_len, timeout); if(nwrite != req_len) { if(ret == 0) { return 0; } if(ret == -2) { return -5; } return -4; } return RecvPack(pf, hlen, rsp_len, rsp, rsp_len, timeout); }
int N_SQL_EndTran(T_Connect *connect,int TranFlag) { T_NetHead nethead; T_CLI_Var *clip=(T_CLI_Var *)connect->Var; int i; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_EndTran"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); if(TranFlag == TRANBEGIN) connect->status++; else connect->status--; nethead.ERRNO2=(connect->status>0)?PACK_STATUS:0; nethead.ERRNO1=TranFlag; nethead.PKG_REC_NUM=0; nethead.data=0; nethead.PKG_LEN=0; i=SendPack(connect,&nethead); if(i)return i; i=RecvPack(connect,&nethead); if(i)return i; EventCatch(connect,nethead.PROTO_NUM); return GetError(connect,&nethead); }
int N_SQL_Select(T_Connect *connect,char *cmd,char **data,int num) { T_NetHead nethead; T_CLI_Var *clip=(T_CLI_Var *)connect->Var; int i; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_Select"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.ERRNO1=0; nethead.ERRNO2=(connect->status>0)?PACK_STATUS:0; nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); nethead.PKG_REC_NUM=num; nethead.data=cmd; nethead.PKG_LEN=strlen(nethead.data); i=SendPack(connect,&nethead); if(i<0)return i; i=RecvPack(connect,&nethead); if(i<0)return i; EventCatch(connect,nethead.PROTO_NUM); *((T_User_Var *)connect->Var)->ErrMsg=0; ((T_User_Var *)connect->Var)->Errno=nethead.ERRNO1; *data=nethead.data; if(!nethead.ERRNO1) { /* column num */ ((T_User_Var *)connect->Var)->NativeError=nethead.ERRNO2; return nethead.PKG_REC_NUM; } else { return GetError(connect,&nethead); } }
int N_SQL_Fetch(T_Connect *connect,int curno,char **data,int recnum) { T_CLI_Var *clip=(T_CLI_Var *)connect->Var; T_NetHead nethead; int i; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_Fetch"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); nethead.ERRNO2=PACK_STATUS; nethead.ERRNO1=curno; /* recnum:进入时每次Fetch的记录数,0=全部记录,null=1条 */ nethead.PKG_REC_NUM=recnum; nethead.data=0; nethead.PKG_LEN=0; i=SendPack(connect,&nethead); if(i<0)return i; i=RecvPack(connect,&nethead); if(i<0)return i; EventCatch(connect,nethead.PROTO_NUM); if(nethead.ERRNO1) return GetError(connect,&nethead); *data=nethead.data; *((T_User_Var *)connect->Var)->ErrMsg=0; ((T_User_Var *)connect->Var)->Errno=nethead.ERRNO1; /* colunm num */ ((T_User_Var *)connect->Var)->NativeError=nethead.ERRNO2; /* 返回实际得到的记录数 */ return nethead.PKG_REC_NUM; }
//连接 static int sc_connect(pool *p1,resource *rs) { int ret=-1; T_NetHead Head; struct utsname ubuf; char buf[200],*p,addr[20]; log_stu logs; rs->Conn.timeout=-1; ret=Net_Connect(&rs->Conn,&rs->cli,*p1->log.family?p1->family:NULL); if(ret) { rs->cli.Errno=errno; stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); return -1; } //login uname(&ubuf); p=buf; Head.O_NODE=LocalAddr(rs->Conn.Socket,addr); p+=sprintf(p,"%s|%s|%s,%s|||",p1->log.DEVID,p1->log.LABEL, ubuf.nodename,addr); rs->Conn.MTU=p1->log.MTU; Head.PROTO_NUM=0; Head.D_NODE=p1->log.NEXT_d_node; Head.ERRNO1=rs->Conn.MTU; Head.ERRNO2=Head.PKG_REC_NUM=0; Head.data=buf; Head.PKG_LEN=strlen(Head.data); ret=SendPack(&rs->Conn,&Head); ret=RecvPack(&rs->Conn,&Head); if(ret) { rs->cli.Errno=errno; stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); disconnect(&rs->Conn); ShowLog(1,"%s:network error %d,%s",__FUNCTION__,rs->cli.Errno,rs->cli.ErrMsg); rs->cli.Errno=-1; return -2; } if(Head.ERRNO1 || Head.ERRNO2) { ShowLog(1,"%s:login error ERRNO1=%d,ERRNO2=%d,%s",__FUNCTION__, Head.ERRNO1,Head.ERRNO2,Head.data); disconnect(&rs->Conn); stptok(Head.data,rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); rs->cli.Errno=-1; return -3; } net_dispack(&logs,Head.data,log_tpl); strcpy(rs->cli.DBOWN,logs.DBOWN); strcpy(rs->cli.UID,logs.DBUSER); //取服务名 ret=init_svc_no(&rs->Conn); rs->cli.Errno=ret; *rs->cli.ErrMsg=0; return ret; }
int N_SQL_Prepare(T_Connect *connect,char *cmd,T_SqlDa *sqlda) { T_CLI_Var *clip=(T_CLI_Var *)connect->Var; T_NetHead nethead; int i; char *p; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_Prepare"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); nethead.ERRNO1=0; connect->status++; nethead.ERRNO2=PACK_STATUS; nethead.PKG_REC_NUM=0; nethead.data=cmd; nethead.PKG_LEN=strlen(nethead.data); i=SendPack(connect,&nethead); if(i) { connect->status--; return i; } i=RecvPack(connect,&nethead); if(i) { connect->status--; return i; } if((int)nethead.ERRNO1<0) { int ret=GetError(connect,&nethead); return ret; } sqlda->cursor_no=nethead.ERRNO1; sqlda->cols=nethead.PKG_REC_NUM; if(nethead.PKG_LEN>0) { sqlda->sqlvar=(T_SqlVar *)malloc(sizeof(T_SqlVar)*sqlda->cols); if(sqlda->sqlvar) { p=nethead.data; for(i=0;i<sqlda->cols;i++) { p+=net_dispack(&sqlda->sqlvar[i],p,SqlVarType); } } } else sqlda->sqlvar=0; ((T_CLI_Var *)connect->Var)->Errno=0; ((T_CLI_Var *)connect->Var)->NativeError=nethead.PKG_REC_NUM; *((T_CLI_Var *)connect->Var)->ErrMsg=0; EventCatch(connect,nethead.PROTO_NUM); return 0; }
/******************************************************* * 取得服务器端服务名列表 * 服务器端的0号函数必须是登录认证函数。登录认证完成后, * 必须把0号函数值换成 get_srvname(); * 1号函数必须是echo() * conn->freevar指向free_srv_list,如果需要其他善后操作 * 应重置,但最后应补做free_srv_list(T_CLI_Var *); *******************************************************/ int init_svc_no(T_Connect *conn) { T_CLI_Var *clip; T_NetHead head; int ret,i; char *p; srv_list *lp; svc_table *svcp; if(!conn || !conn->Var) return -1; clip=(T_CLI_Var *)conn->Var; if(!clip) return -1; svcp=clip->svc_tbl; if(!svcp) return -1; svcp->srvn=0; svcp->usage=-1; svcp->srv_hash=0; svcp->srvlist=0; head.PROTO_NUM=0; head.ERRNO1=head.ERRNO2=0; head.PKG_REC_NUM=0; head.O_NODE= clip->ctx_id; head.D_NODE=0; head.data=0; head.PKG_LEN=0; ret=SendPack(conn,&head); if(ret<0) return ret; ret=RecvPack(conn,&head); if(ret<0) return(ret); if(head.ERRNO1 && head.ERRNO2) return -2; svcp->srvn=head.PKG_REC_NUM; svcp->srvlist=malloc(sizeof(srv_list) * clip->svc_tbl->srvn); if(!svcp->srvlist) { clip->svc_tbl=NULL; return -1; } lp=(srv_list *)svcp->srvlist; p=head.data; //ShowLog(2,"%s:srvn=%d,data=%s",__FUNCTION__,svcp->srvn,p); for(i=0;i<svcp->srvn&&*p;i++) { p+=net_dispack(lp,p,slist_tpl); //ShowLog(5,"src_no=%d,srv_name=%s",lp->srv_no,lp->srv_name); lp++; } svcp->usage=0; svcp->srv_hash=mk_srv_hash((srv_list *)clip->svc_tbl->srvlist,clip->svc_tbl->srvn); conn->freevar=(void (*)(void *)) free_srv_list; return 0; }
int N_SQL_RPC(T_Connect *connect,char *cmd,char **data,int *nrets,int st_lev) { T_NetHead nethead; int i; T_CLI_Var *clip; clip=(T_CLI_Var *)connect->Var; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_RPC"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } connect->status += st_lev; nethead.O_NODE=clip->ctx_id; nethead.D_NODE=get_d_node(); nethead.ERRNO1=0; nethead.ERRNO2=(connect->status>0)?PACK_STATUS:0; nethead.PKG_REC_NUM=0; nethead.data=cmd; nethead.PKG_LEN=strlen(nethead.data); i=SendPack(connect,&nethead); //free(buffer); if(i)return i; i=RecvPack(connect,&nethead); if(i)return i; EventCatch(connect,nethead.PROTO_NUM); *clip->ErrMsg=0; clip->Errno=nethead.ERRNO1; if(nrets) *nrets=0;*data=0; if(!nethead.ERRNO1) { if(nrets) *nrets=nethead.PKG_REC_NUM; //ncols *data=nethead.data; clip->NativeError=nethead.PKG_REC_NUM; //ncols return 0; } else { return GetError(connect,&nethead); } }
int N_SQL_Close_RefCursor(T_Connect *connect,int ref_cursor) { T_CLI_Var *clip=(T_CLI_Var *)connect->Var; T_NetHead nethead; int i; nethead.PROTO_NUM=get_srv_no(connect->Var,"SQL_Close"); if(nethead.PROTO_NUM==1) { ShowLog(1,"%s:服务不存在",__FUNCTION__); return FORMATERR; } nethead.O_NODE=clip->ctx_id; nethead.D_NODE=0; connect->status--; nethead.ERRNO1=ref_cursor; nethead.PKG_REC_NUM=0; nethead.data=NULL; nethead.PKG_LEN=0; if(ref_cursor<0) { //终止中间件的状态 if(connect->status <= 0) { connect->status=0; //请求夭折状态 nethead.ERRNO2=PACK_NOANSER; SendPack(connect,&nethead); } return 0; } nethead.ERRNO2=(connect->status>0)?PACK_STATUS:0; i=SendPack(connect,&nethead); if(i)return i; i=RecvPack(connect,&nethead); if(i)return i; EventCatch(connect,nethead.PROTO_NUM); return GetError(connect,&nethead); }
static void * thread_work(void *param) { T_Connect Conn=*(T_Connect *)param; T_NetHead Head; int ret,logined=0; T_SRV_Var ctx; srvfunc *fp; int svcnum=0; int (*init)(T_Connect *conn,T_NetHead *head); char addr[16]; char gda[Conn.SendLen+1];//本线程的全局数据区必须在此分配。 ((T_Connect *)param)->Socket=-1;//通知主线程 if(Conn.SendLen>0) ctx.var=gda; else ctx.var=0; Conn.SendLen=0; ctx.tid=pthread_self();//标志多线程服务 ctx.poolno=0; ctx.SQL_Connect=NULL; ctx.TCB_no=-1; //标志不是线程池 Conn.Var=&ctx; init=Conn.only_do; Conn.only_do=0; //借用only_do存放函数地址 conn_init if(!Conn.only_do) for(fp=Function;fp->funcaddr!=0;fp++) svcnum++; // ShowLog(2,"%s:tid=%lX,sock=%d",__FUNCTION__,ctx.tid,Conn.Socket); // 协商密钥 Conn.CryptFlg=mk_clikey(Conn.Socket,&Conn.t,Conn.family); if(Conn.CryptFlg<0) { //协商密钥失败 LocalAddr(Conn.Socket,addr); ShowLog(1,"%s:tid=%lX addr=%s,协商密钥失败!",__FUNCTION__, ctx.tid,addr); freeconnect(&Conn); return NULL; } if(init) init(&Conn,&Head); while(1) { ret=RecvPack(&Conn,&Head); if(ret<0) { ShowLog(1,"%s:tid=%lX,接收结束,sock=%d,status=%d,%s", __FUNCTION__,ctx.tid,Conn.Socket,errno,strerror(errno)); break; } ShowLog(4,"%s: tid=%lX,PROTO_NUM:%d PKG_LEN=%d,T_LEN=%d",__FUNCTION__,ctx.tid, Head.PROTO_NUM,Head.PKG_LEN,Head.T_LEN); if(Head.PROTO_NUM==1){ Echo(&Conn,&Head); continue; } if(Head.PROTO_NUM==0xFFFF){ ShowLog(0,"%s:Disconnect by client,tid=%lX",__FUNCTION__,ctx.tid); break; } if(!Head.PROTO_NUM) { if(!logined) { logined=Function[0].funcaddr(&Conn,&Head); if(logined==-1) break; } else { get_srvname(&Conn,&Head); } } else if(Conn.only_do) { ret=Conn.only_do(&Conn,&Head); continue; } else { if(!logined) {//未登录 ShowLog(1,"%s:未登录,tid=%lX",__FUNCTION__,ctx.tid); break; } if(Head.PROTO_NUM>svcnum) { ShowLog(1,"%s:没有这个服务号 %s",__FUNCTION__,Head.PROTO_NUM); break; } ret=Function[Head.PROTO_NUM].funcaddr(&Conn,&Head); if(ret==-1) { ShowLog(0,"%s:Disconnect by server PROTO_NUM=%d,ret=%d", __FUNCTION__,Head.PROTO_NUM,ret); break; } } } freeconnect(&Conn); mthr_showid_del(ctx.tid); return NULL; }