コード例 #1
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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);
}
コード例 #2
0
ファイル: base_socket.cpp プロジェクト: scgg/toney-baselib
/*
*	-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);
}
コード例 #3
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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);
}
コード例 #4
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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);
	}
}
コード例 #5
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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;
}
コード例 #6
0
ファイル: scpool_n.c プロジェクト: hx71105417/sdbc_linux
//连接
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;
}
コード例 #7
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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;
}
コード例 #8
0
ファイル: getsvc.c プロジェクト: lipengyuntian/sdbc
/*******************************************************
 * 取得服务器端服务名列表
 * 服务器端的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;
}
コード例 #9
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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);
	}
}
コード例 #10
0
ファイル: sqlc.c プロジェクト: lipengyuntian/sdbc
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);
}
コード例 #11
0
ファイル: TPC_srv.c プロジェクト: lipengyuntian/sdbc
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;
}