📄 dhodbc.cpp
字号:
#include "stdio.h"
#include "windows.h"
#include "winbase.h"
#include "dlodbc.h"
#include "caSocket.h"
#include "certextern.h"
#include "certglobal.h"
#include "certtools.h"
extern DBCONN dbconn[];
#define MUTEXTIMEOUT 5000
/***************************************************************
* 函数名: GetHdNum
* 功能: 从全局变量中取得数据库连接句柄
* 输入参数: 无
* 输出参数: 指向DWORD的指针,得到连接句柄
* 返回值: 成功返回0,其他情况返回负数
* 程序员: 徐锋 编程日期:2004/09/08
* 修改人员: 修改日期:
* 修改原因:
*****************************************************************/
int GetHdNum(DWORD *dwHdNum)
{
int i;
int nSuc=0;
DWORD dwWaitResult;
DWORD dwThreadId = GetCurrentThreadId();
dwWaitResult = WaitForSingleObject(
hMutex, // handle to mutex
MUTEXTIMEOUT); // five-second time-out interval
switch (dwWaitResult)
{
// The thread got mutex ownership.
case WAIT_OBJECT_0:
/*
for(i=0;i< MAXDBCONN;i++)
if(dbconn[i].threadid == dwThreadId)
{
dbconn[i].status =1;
*dwHdNum = i;
nSuc = 1;
break;;
}
else
continue;
if(nSuc == 1)
{
ReleaseMutex(hMutex);
return 0;
}
*/
for(i=0;i< MAXDBCONN;i++)
if(dbconn[i].status == 0)
{
dbconn[i].threadid = dwThreadId;
dbconn[i].status =1;
*dwHdNum = i;
nSuc = 1;
break;
}
else
continue;
ReleaseMutex(hMutex);
if(nSuc == 1)
return 0;
else
return -1;
case WAIT_TIMEOUT:
return -1;
// Got ownership of the abandoned mutex object.
default:
return -1;
}
/*
DWORD dwThreadId = GetCurrentThreadId();
for(int i=0;i< MAXDBCONN;i++)
if(dbconn[i].threadid == dwThreadId)
{
dbconn[i].status =1;
*dwHdNum = i;
return 0;
}
else
continue;
for(i=0;i< MAXDBCONN;i++)
if(dbconn[i].status == 0)
{
dbconn[i].threadid = dwThreadId;
dbconn[i].status =1;
*dwHdNum = i;
return 0;
}
else
continue;
return -1;
*/
}
/***************************************************************
* 函数名: FreeHdNum
* 功能: 从全局变量中释放数据库连接句柄
* 输入参数: 无
* 输出参数: 无
* 返回值: 成功返回0,其他情况返回负数
* 程序员: 徐锋 编程日期:2004/09/08
* 修改人员: 修改日期:
* 修改原因:
*****************************************************************/
int FreeHdNum()
{
int i;
int nSuc=0;
DWORD dwWaitResult;
DWORD dwThreadId = GetCurrentThreadId();
dwWaitResult = WaitForSingleObject(
hMutex, // handle to mutex
MUTEXTIMEOUT); // five-second time-out interval
switch (dwWaitResult)
{
// The thread got mutex ownership.
case WAIT_OBJECT_0:
for(i=0;i< MAXDBCONN;i++)
{
if(dbconn[i].threadid == dwThreadId)
{
dbconn[i].status = 0;
dbconn[i].threadid = 0;
nSuc = 1;
break;
}
else
continue;
}
ReleaseMutex(hMutex);
if(nSuc == 1)
return 0;
else
return -1;
case WAIT_TIMEOUT:
return -1;
// Got ownership of the abandoned mutex object.
case WAIT_ABANDONED:
return -1;
}
/*
for(i=0;i< MAXDBCONN;i++)
if(dbconn[i].threadid == dwThreadId)
{
dbconn[i].status = 0;
dbconn[i].threadid = 0;
return 0;
}
else
continue;
return -1;
*/
return -1;
}
/***************************************************************
* 函数名: DBGetSetSerial
* 功能: 从数据库CA_SERIAL表中读取系列号,并将系列号加一写入
* 输入参数: 指向DWORD的指针
* 输出参数: 指向DWORD的指针,得到系列号
* 返回值: 成功返回0,其他情况返回负数
* 程序员: 徐锋 编程日期:2004/09/08
* 修改人员: 修改日期:
* 修改原因:
*****************************************************************/
int DBGetSetSerial(DWORD* dwSerialNum)
{
SQLHDBC hdbc;
DWORD dwHdNum=0;
DWORD dwSerial;
int nRtn = 0;
SQLCHAR sql[40]="";
SQLHSTMT statement;
char szSerial[9];
SQLCHAR *datavalue=NULL;
SQLINTEGER datalen;
while(1)
{
nRtn = GetHdNum(&dwHdNum);
if(nRtn != 0) //没有空闲
{
nRtn = -5001;
break;
}
hdbc = (void *)dbconn[dwHdNum].handle;
//get Serial
statement = CreateStatement(hdbc,0,0);
strcpy((char *)sql,"select * from CA_SERIAL");
nRtn = ExecSQL(statement,sql,strlen((char *)sql));
// SQLFetchScroll(statement,SQL_FETCH_FIRST,0);
if(nRtn > 0)
while(NextCursor(statement) == 1) //成功移动
{
datavalue = getData(statement,1,datalen);
}
FreeStatement(statement);
if(datavalue == NULL)
{
nRtn = -5002; //从数据库中读证书系列号失败
break;
}
dwSerial=atoi((char *)datavalue);
*dwSerialNum = dwSerial;
//update Serial
dwSerial++;
memset(szSerial,0,sizeof(szSerial));
sprintf(szSerial,"%d",dwSerial);
statement = CreateStatement(hdbc,0,0);
sprintf((char *)sql,"update CA_SERIAL set SERIAL='%s'",szSerial);
nRtn = ExecSQL(statement,sql,strlen((char *)sql));
if(nRtn < 0)
{
nRtn = -5011;
break;
}
break;
} //end while
if(datavalue) free(datavalue);
FreeStatement(statement);
FreeHdNum();
return 0;
}
/***************************************************************
* 函数名: DBInsertCertReq
* 功能: 插入一条记录到数据库CA_CERTREQ表.
* 输入参数: 指向ISUCERT的指针,系列号
* 输出参数: 无
* 返回值: 成功返回0,其他情况返回负数
* 程序员: 徐锋 编程日期:2004/09/08
* 修改人员: 修改日期:
* 修改原因:
*****************************************************************/
int DBInsertCertReq(ISUCERT* p,DWORD dwSerialNum)
{
SQLHDBC hdbc;
DWORD dwHdNum=0;
int nRtn = 0;
SQLCHAR sqlcommand[5000]="";
SQLCHAR sqlform[500]="";
SQLCHAR szCertReq[200]="FORMACC,TELNUM,CITY,COMPANY,COUNTRY,DEPARTMENT,EMAIL,NAME,P10,PROVINCE,KEYSERIAL,X509NAME,APPLYSTATUS,APPLYDAY,CERTSERIAL";
SQLCHAR x509Name[300];
SQLCHAR szStatus[4]="0";
SQLCHAR szTime[20]="1234";
SQLCHAR szSerial[9]="";
SQLHSTMT statement;
while(1)
{
nRtn = GetHdNum(&dwHdNum);
if(nRtn != 0) //没有空闲
{
nRtn = -5011;
break;
}
hdbc = (void *)dbconn[dwHdNum].handle;
statement = CreateStatement(hdbc,0,0);
ReadTime(szTime,sizeof(szTime));
sprintf((char *)szSerial,"%d",dwSerialNum);
sprintf((char *)x509Name,"CN = %s,OU = %s,O = %s,L = %s,S = %s,C = %s,E = %s",\
p->name,p->company,p->department,p->city,p->prov,p->country,p->email);
strcpy((char *)sqlform,"insert into CA_CERTREQ(%s)\
values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')");
sprintf((char *)sqlcommand,(char *)sqlform,\
szCertReq,p->account,p->cellno,p->city,p->company,p->country,\
p->department,p->email,p->name,p->pkcs10,p->prov,p->ukserial,\
x509Name,szStatus,szTime,szSerial);
nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));
if(nRtn < 0)
{
nRtn = -5015;
break;
}
else
nRtn = 0;
break;
} //end while
FreeStatement(statement);
FreeHdNum();
return nRtn;
}
/***************************************************************
* 函数名: DBInsertCert
* 功能: 插入一条记录到数据库CA_CERT表.
* 输入参数: 系列号,指向证书内容的指针,证书内容长度
* 输出参数: 无
* 返回值: 成功返回0,其他情况返回负数
* 程序员: 徐锋 编程日期:2004/09/08
* 修改人员: 修改日期:
* 修改原因:
*****************************************************************/
int DBInsertCert(DWORD dwSerialNum,BYTE* pbCert,DWORD cbSize)
{
SQLHDBC hdbc;
DWORD dwHdNum=0;
int nRtn = 0;
SQLCHAR szCertReq[200]="ENVACC,KEYSERIAL,FORMACC,TELNUM,X509NAME,NAME,EMAIL,COMPANY,DEPARTMENT,CITY,PROVINCE,COUNTRY,APPLYSTATUS,APPLYDAY,P10,CERTSERIAL";
char ENVACC[24];
char KEYSERIAL[24];
char FORMACC[24];
char TELNUM[16];
char X509NAME[300];
char NAME[24];
char EMAIL[128];
char COMPANY[64];
char DEPARTMENT[64];
char CITY[4];
char PROVINCE[4];
char COUNTRY[4];
char APPLYSTATUS[4];
char APPLYDAY[20];
char P10[4000];
char CERTSERIAL[12];
SQLCHAR sqlcommand[9000]="";
SQLCHAR sqlform[500]="";
SQLCHAR sqlselect[50]="";
SQLCHAR sqlinsert[50]="";
SQLCHAR szStatus[4]="0";
SQLCHAR szTime[20]="";
SQLCHAR szSerial[9]="";
SQLHSTMT statement;
SQLCHAR szCert[MAXCERTLEN]="";
SQLSMALLINT ColumnCnt;
char *datavalue=NULL;
SQLINTEGER datalen;
while(1)
{
nRtn = GetHdNum(&dwHdNum);
if(nRtn != 0) //没有空闲
{
nRtn = -5021;
break;
}
hdbc = (void *)dbconn[dwHdNum].handle;
statement = CreateStatement(hdbc,0,0);
sprintf((char *)szSerial,"%d",dwSerialNum);
sprintf((char *)sqlselect,"select %s from CA_CERTREQ where CERTSERIAL='%s'",szCertReq,szSerial);
nRtn = ExecSQL(statement,sqlselect,strlen((char *)sqlselect));
if(nRtn > 0)
{
// sprintf((char *)sqlinsert,"insert into CA_CERT(CERTSERIAL) values('%s')", szSerial);
while(NextCursor(statement) == 1) //成功移动
{
ColumnCnt = GetColumnCount(statement);
for(SQLSMALLINT i=1;i<=ColumnCnt;i++)
{
datavalue = (char *)getData(statement, i, datalen);
switch(i)
{
case 1:
strcpy(ENVACC ,datavalue);
break;
case 2:
strcpy(KEYSERIAL ,datavalue);
break;
case 3:
strcpy(FORMACC ,datavalue);
break;
case 4:
strcpy(TELNUM ,datavalue);
break;
case 5:
strcpy(X509NAME ,datavalue);
break;
case 6:
strcpy(NAME ,datavalue);
break;
case 7:
strcpy(EMAIL ,datavalue);
break;
case 8:
strcpy(COMPANY ,datavalue);
break;
case 9:
strcpy(DEPARTMENT ,datavalue);
break;
case 10:
strcpy(CITY ,datavalue);
break;
case 11:
strcpy(PROVINCE ,datavalue);
break;
case 12:
strcpy(COUNTRY ,datavalue);
break;
case 13:
strcpy(APPLYSTATUS,datavalue);
break;
case 14:
strcpy(APPLYDAY ,datavalue);
break;
case 15:
strcpy(P10 ,datavalue);
break;
case 16:
strcpy(CERTSERIAL ,datavalue);
break;
default:
break;
}
}
}; //end while
}
FreeStatement(statement);
ReadTime(szTime,sizeof(szTime));
XFBase64encode(pbCert,cbSize,szCert,0);
strcpy((char *)sqlform,"insert into CA_CERT(%s,CERT,CERTISSUEDAY)\
values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')");
sprintf((char *)sqlcommand,(char *)sqlform,\
szCertReq ,\
ENVACC ,\
KEYSERIAL ,\
FORMACC ,\
TELNUM ,\
X509NAME ,\
NAME ,\
EMAIL ,\
COMPANY ,\
DEPARTMENT ,\
CITY ,\
PROVINCE ,\
COUNTRY ,\
APPLYSTATUS ,\
APPLYDAY ,\
P10 ,\
CERTSERIAL ,\
szCert ,\
szTime );
statement = CreateStatement(hdbc,0,0);
nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));
if(nRtn < 0)
{
nRtn = -5025;
break;
}
break;
} //end while1
FreeStatement(statement);
FreeHdNum();
return nRtn;
}
int DBGetCertUseSerial(LPSTR szSerial,LPSTR pUserCert,DWORD pBufLen)
{
SQLHDBC hdbc;
SQLHSTMT statement;
DWORD dwHdNum=0;
int nRtn = 0;
// SQLSMALLINT ColumnCnt;
char *datavalue=NULL;
SQLINTEGER datalen;
SQLCHAR sqlform[100]="select CERT from CA_CERT where CERTSERIAL = '%s'";
SQLCHAR sqlcommand[200];
sprintf((char *)sqlcommand,(char *)sqlform,szSerial);
while(1)
{
nRtn = GetHdNum(&dwHdNum);
if(nRtn != 0) //没有空闲
{
nRtn = -5031;
break;
}
hdbc = (void *)dbconn[dwHdNum].handle;
statement = CreateStatement(hdbc,0,0);
nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));
if(nRtn > 0)
while(NextCursor(statement) == 1) //成功移动
{
datavalue = (char *)getData(statement,1,datalen);
}
if(pBufLen > (DWORD)datalen)
{
strcpy(pUserCert,datavalue);
nRtn = datalen;
}
break;
}
if(datavalue) free(datavalue);
FreeStatement(statement);
FreeHdNum();
return nRtn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -