?? 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 + -