ODBC::ODBC(void)
{
bState=false;
rowCount=colCount=0;
retCode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&hEnv);
if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro AllocHandle"<<retCode<<endl;
return;
}
retCode=SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro AllocHandle"<<retCode<<endl;
SQLFreeHandle( SQL_HANDLE_DBC, hEnv );
return;
}
retCode=SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro AllocHandle"<<retCode<<endl;
SQLFreeHandle( SQL_HANDLE_DBC, hEnv );
return;
}
}
ODBC::~ODBC(void)
{
Close();
}
bool ODBC::Close()
{
if(bState)
{
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
bState=false;
}
return true;
}
bool ODBC::Connect()
{
string ip,user,password;
ip="127.0.0.1";
user="sa";
password="Nicholas@123";
if(bState==false)
{
// retCode=SQLConnect(hDbc,(SQLCHAR*) pszDSN,SQL_NTS,(SQLCHAR*) pszUName,SQL_NTS,(SQLCHAR*) pszUPassword,SQL_NTS);
string strConnect="Driver={SQL Server};Database=test;Server=";
strConnect+=ip;
strConnect+=";uid=";
strConnect+=user;
strConnect+=";pwd=";
strConnect+=password;
short sDriverOutputLength;
wchar_t szDriverOutput[256];
retCode=SQLDriverConnect(hDbc,NULL,(SQLWCHAR *)s2ws(strConnect).c_str(),SQL_NTS, (SQLWCHAR *)szDriverOutput,256,&sDriverOutputLength,SQL_DRIVER_NOPROMPT);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro Connect "<<retCode<<endl;
SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
return false;
}
retCode=SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro Connect "<<retCode<<endl;
SQLDisconnect( hDbc );
SQLFreeHandle( SQL_HANDLE_DBC, hDbc);
return false;
}
}
bState=true;
cout<<"success!"<<endl;
return true;
}
string ODBC::ws2s(const wstring& ws)
{
_bstr_t t = ws.c_str();
char* pchar = (char*)t;
string result = pchar;
return result;
}
wstring ODBC::s2ws(const string& s)
{
_bstr_t t = s.c_str();
wchar_t* pwchar = (wchar_t*)t;
wstring result = pwchar;
return result;
}
int ODBC::ExecuteQuery(const char* pszSql)
{
string strr=pszSql;
if(pszSql==NULL)
return 0;
cout<<"hStmt="<<hStmt<<endl;
retCode=SQLExecDirect(hStmt,(SQLWCHAR *)s2ws(strr).c_str(),SQL_NTS);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro ExecDirect "<<retCode<<endl;
return -1;
}
/* retCode=SQLRowCount(hStmt,&rowCount); //不受select 影响。。
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro RowCount "<<retCode<<endl;
return -1;
}*/
retCode=SQLNumResultCols(hStmt,&colCount);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro ColCount "<<retCode<<endl;
return -1;
}
rowCount=0;
while(SQL_NO_DATA!=SQLFetch(hStmt))
{
//cout<<pszBuf<<endl;
rowCount++;
}
SQLCancel(hStmt);
return rowCount;
}
int ODBC::ExecuteNonQuery(const char* pszSql)
{
rowCount=0;
if(pszSql==NULL)
return 0;
//cout<<"hStmt="<<hStmt<<endl;
retCode=SQLExecDirect(hStmt,(SQLWCHAR *)s2ws(pszSql).c_str(),SQL_NTS);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
// cout<<"Erro ExecDirect "<<retCode<<endl;
return -1;
}
retCode=SQLRowCount(hStmt,&rowCount);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
// cout<<"Erro RowCount "<<retCode<<endl;
return -1;
}
retCode=SQLNumResultCols(hStmt,&colCount);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
// cout<<"Erro ColCount "<<retCode<<endl;
return -1;
}
SQLCancel(hStmt);
return rowCount;
}
vector<string* > ODBC::ExecuteQueryVector(const char* pszSql)
{
string strr=pszSql;
vector<string* > v;
if(pszSql==NULL)
return v;
retCode=SQLExecDirect(hStmt,(SQLWCHAR *)s2ws(strr).c_str(),SQL_NTS);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro ExecDirect "<<retCode<<endl;
return v;
}
retCode=SQLNumResultCols(hStmt,&colCount);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
cout<<"Erro ColCount "<<retCode<<endl;
return v;
}
rowCount=0;
SQLINTEGER colLen = 0;
SQLSMALLINT buf_len = 0;
SQLINTEGER colType = 0;
while(true)
{
char sz_buf[256];
char* pszBuf;
SQLINTEGER buflen;
string* rowData=new string[colCount+1];
if(SQLFetch(hStmt)==SQL_NO_DATA)
{
break;
}
for(int i=1;i<=colCount;i++)
{
SQLColAttribute(hStmt, i, SQL_DESC_NAME, sz_buf, 256, &buf_len, 0);
SQLColAttribute(hStmt, i, SQL_DESC_TYPE, 0, 0, 0, &colType);
SQLColAttribute(hStmt, i, SQL_DESC_LENGTH, NULL, 0, 0, &colLen);
pszBuf=new char[colLen+1];
pszBuf[0]='/0';
SQLGetData(hStmt,i,SQL_C_CHAR,pszBuf,colLen,&buflen);
rowData[i-1]=pszBuf;
}
v.push_back(rowData);
rowCount++;
}
SQLCancel(hStmt);
return v;
}
bool ODBC::IsOpen()
{
return bState;
}
void ODBC::replace(string &str,const char *string_to_replace,const char *new_string)
{
// Find the first string to replace
int index = str.find(string_to_replace);
// while there is one
while(index != std::string::npos)
{
// Replace it
str.replace(index, strlen(string_to_replace), new_string);
// Find the next one
index = str.find(string_to_replace, index + strlen(new_string));
}
}
void ODBC::replace(string &str,const char *string_to_replace,int num)
{
stringstream strStream;
strStream<<num;
string new_string=strStream.str();
int index = str.find(string_to_replace);
while(index != std::string::npos)
{
str.replace(index, strlen(string_to_replace), new_string);
index = str.find(string_to_replace, index + new_string.length());
}
}
//创建数据库
int ODBC::createdatabase(string sql)
{
string strr=sql;
if(sql=="")
return -1;
retCode=SQLExecDirect(hStmt,(SQLWCHAR *)s2ws(strr).c_str(),SQL_NTS);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
return -1;
}
return 0;
}
//创建数据表。0为成功,-1为失败
int ODBC::createtable(string sql)
{
string strr=sql;
if(sql=="")
return -1;
retCode=SQLExecDirect(hStmt,(SQLWCHAR *)s2ws(strr).c_str(),SQL_NTS);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
{
return -1;
}
return 0;
}
ODBC odbc;
odbc.connect();
//在实际使用的时候,
string sql="insert into [test].[dbo].[Exception] values ('0%','1%',2%,3%,'4%','5%','6%',7%);";
odbc.replace(sql,"0%",iter->first.c_str());//站点名称
odbc.replace(sql,"1%",iter_url_ip->first.c_str());//IP地址
odbc.replace(sql,"2%",iter_url_ip->second.ipcount);//IP访问次数
odbc.replace(sql,"3%",1);//攻击类型
odbc.replace(sql,"4%",_Map.getTime().c_str());//时间
odbc.replace(sql,"5%",sessiontop10.c_str());//session top 10
odbc.replace(sql,"6%",urltop10.c_str());//url top 10
odbc.replace(sql,"7%",0);//DDOS判定原因
odbc.ExecuteNonQuery(sql.c_str());