#include "StdAfx.h"
#include "Database.h"
Database::Database(void)
{
}
Database::~Database(void)
{
}
// 若文件不存在,则创建数据表文件:小区信息表(cell.csv),WLAN热点信息表(hotport.csv)
// 初始化时load到内存中(没有的话,创建文件),退出程序之前update到文件中,(update之前先将原有文件备份为.bak,再覆盖数据库文件)
// 内存->文件
bool Database::UpdateDBFile()
{
string strRow;
int i;
CELL_INFO cell_data;
WLAN_INFO wlan_data;
string strFileName_cell;
string strFileName_wlan;
// CELLTABLE
//strFileName_cell.append(g_strAppPath.c_str());
//strFileName_cell.append(_T("\\"));
//strFileName_cell.append(CELLTABLE_FILENAME);
strFileName_cell.append(_T("c:\\cell1.csv"));
ofstream foutCell(strFileName_cell.c_str(), ios::out);
if(!foutCell)
{
WriteLog(_T("open file error"));
return false;
}
else
{
// 清空文件
foutCell.clear();
// 第一行是标题
strRow.assign(_T("MCC,MNC,LAC,CI,Busy_Hour,SSID1,SSID2,SSID3\n"));
foutCell<<strRow.c_str();
// 写数据到文件
for(i = 0; i < m_tableCell.size(); i++)
{
data2str(strRow, &m_tableCell[i], CELLTABLE_ID);
// 检查string 类型的strRow 是否是合法数据
if( !CheckStrRow(strRow, CELLTABLE_ID))
{
continue;
}
// 写到文件中
foutCell<<strRow.c_str();
}
foutCell.close();
}
// WLANTABLE
//strFileName_wlan.append(g_strAppPath.c_str());
//strFileName_wlan.append(_T("\\"));
//strFileName_wlan.append(CELLTABLE_FILENAME);
strFileName_wlan.append(_T("c:\\wlan1.csv"));
ofstream foutWlan(strFileName_wlan.c_str(), ios::out);
if(!foutWlan)
{
WriteLog(_T("open file error"));
return false;
}
else
{
// 清空文件
foutWlan.clear();
// 第一行是标题
strRow.assign(_T("BSSID,SSID,Busy_Hour,RSSI,MMC,MNC,LAC,CI,latitude,longitude,High_Quality_Num,Middle_Quality_Num,Low_Quality_Num,Quality_Level\n"));
foutWlan<<strRow.c_str();
// 写数据到文件
for(i = 0; i < m_tableWlan.size(); i++)
{
strRow.assign(_T(""));
data2str(strRow, &m_tableWlan[i], WLANTABLE_ID);
// 检查string 类型的strRow 是否是合法数据
if( !CheckStrRow(strRow, WLANTABLE_ID))
{
continue;
}
// 写到文件中
foutWlan<<strRow.c_str();
}
foutWlan.close();
}
return true;
}
// 检查文件中当前某行的数据是否合法
//int CheckStrRow(char strRow[], int tableID)
bool Database::CheckStrRow(string& strRow, int tableID)
{
WriteLog(_T("start Function CheckStrRow()"));
int i = 0, num = 0;
const char* str = strRow.c_str();
char flag[20] = {NORMAL};
while(('\n' != str[i]) && ('\0' != str[i]))
{
/* 判断当前字段是否为空 */
while((',' != str[i]) && (' ' == str[i]))
{
i++;
}
/* 如果异常,设置当前字段的flag标记为EXCEPTION */
if(',' == str[i])
{
flag[num] = EXCEPTION;
num++;
}
else/* 如果正常,设置当前字段的flag标记为NORMAL,进入下次循环,检查下一个字段*/
{
flag[num] = NORMAL;
i++;
while((',' != str[i]) && (str[i] != '\0') && (str[i] != '\n'))
{
i++;
}
if((str[i] == '\0') || (str[i] == '\n'))
{
break;
}
num++;
}
i++;
}
switch(tableID)
{
case CELLTABLE_ID:
{
char cgi_flag = flag[0] || flag[1] || flag[2] || flag[3];
char ssid_flag = flag[5] && flag[6] && flag[7];
if(EXCEPTION == (cgi_flag || ssid_flag))
return false;
}
break;
case WLANTABLE_ID:
{
char cgi_flag = flag[4] || flag[5] || flag[6] || flag[7];
char bssid_flag = flag[0];
char ssid_flag = flag[1];
if(EXCEPTION == (cgi_flag || ssid_flag || bssid_flag))
return false;
}
break;
default:
break;
}
WriteLog(_T("end Function CheckStrRow()"));
return true;
}
// 文件->内存
bool Database::LoadDBFile()
{
string strRow;
string strFileName_cell;
string strFileName_wlan;
CELL_INFO cell_data;
WLAN_INFO wlan_data;
int i = 0;
// CELLTABLE
// _T("D:\\Work\\Proj\\WLAN热点项目\\ANDSF_Server\\Debug\\cell.csv")
strFileName_cell.append(g_strAppPath.c_str());
strFileName_cell.append(_T("\\"));
strFileName_cell.append(CELLTABLE_FILENAME);
ifstream finCell(strFileName_cell.c_str(), ios::in); //_T("d:\\cell.csv") //m_strAppPath
if(!finCell)
{
// 若文件不存在,仍然可正常工作
WriteLog(_T("open file error: maybe file not exist!"));
WriteLog(_T("Don't worry, we will create a temp celltable in memory!"));
//return false;
}
else
{
WriteLog(_T("open file ok"));
// 从文件读取一行
i = 0;
while( getline(finCell, strRow) )
{
if ( 0 == i++) // 第一行是标题
{
continue;
}
// 检查文件中当前某行的数据是否合法
if( !CheckStrRow(strRow, CELLTABLE_ID) )
{
continue;
}
str2data((void*)&cell_data, strRow.c_str(), CELLTABLE_ID);
insert_data2Table((void*)&cell_data, CELLTABLE_ID);
}
finCell.close();
}
// WLANTABLE
strFileName_wlan.append(g_strAppPath.c_str());
strFileName_wlan.append(_T("\\"));
strFileName_wlan.append(WLANTABLE_FILENAME);
ifstream finWlan(strFileName_wlan.c_str(), ios::in);
if(!finWlan)
{
// 若文件不存在,仍然可正常工作
WriteLog(_T("open file error: maybe file not exist!"));
WriteLog(_T("Don't worry, we will create a temp wlantable in memory!"));
//return false;
}
else
{
// 从文件读取一行
i = 0;
while( getline(finWlan, strRow) )
{
if ( 0 == i++) // 第一行是标题
{
continue;
}
// 检查文件中当前某行的数据是否合法
if( !CheckStrRow(strRow, WLANTABLE_ID) )
{
continue;
}
str2data((void*)&wlan_data, strRow.c_str(), WLANTABLE_ID);
insert_data2Table((void*)&wlan_data, WLANTABLE_ID);
}
finWlan.close();
}
return true;
}
void Database::insert_data2Table(const void* data, int tableID)
{
int i = 0, j = 0;
switch(tableID)
{
// 往小区信息数据库里插入小区信息,当小区编号重叠是对小区信息进行替换
case CELLTABLE_ID:
{
PCELL_INFO pCell_data = (PCELL_INFO)data;
WriteLog(_T("Enter into m_tableCell\n"));
for(i = 0; i < m_tableCell.size(); i++)
{
if( m_tableCell[i].CGI.MCC == pCell_data->CGI.MCC
&& m_tableCell[i].CGI.MNC == pCell_data->CGI.MNC
&& m_tableCell[i].CGI.LAC == pCell_data->CGI.LAC
&& m_tableCell[i].CGI.CI == pCell_data->CGI.CI )
{
m_tableCell[i] = *pCell_data;
break;
}
}
if( i >= m_tableCell.size() ) // 未找到相应记录
{
m_tableCell.push_back(*pCell_data);
}
break;
}
// 往WLAN热点信息数据库里插入WLAN热点信息,当WLAN热点编号重叠是对WLAN热点信息进行替换
case WLANTABLE_ID:
{
PWLAN_INFO pWlan_data = (PWLAN_INFO)data;
WriteLog(_T("Enter into m_tableWlan\n"));
for(i = 0; i < m_tableWlan.size(); i++)
{
if(0 == (m_tableWlan[i].BSSID.compare(pWlan_data->BSSID)))
{
m_tableWlan[i] = *pWlan_data;
break;
}
}
if( i >= m_tableWlan.size() ) // 未找到相应记录
{
m_tableWlan.push_back(*pWlan_data);
}
break;
}
default:
WriteLog(_T("FOUND NO DATABASE!!!\n"));
}
}
void Database::str2data(void* data, const char* string, int tableID)
{
char *str = NULL, *p = NULL, *q = NULL, *tmp = NULL, *count = NULL;
char strNULL = _T('\0');
char* pValueForAssigned = &strNULL;
int i = 0, num = 0;
bool flag = 0;
str = (char *)malloc(200);
memset(str, 0, 200);
strcpy(str, string);
switch(tableID)
{
/* 解析第一、第二个字段CGI、Busy_Hour 解析第三、四、五个字段SSID[3] */
case CELLTABLE_ID:
{
PCELL_INFO cell_data = (PCELL_INFO)data;
/* 解析第1~5个字段CGI(MMC、MNC、LAC、CI)、Busy_Hour */
for(i = 0; i < 5; i++)
{
count = NULL;
if(0 == i)
p = str;
else
p = tmp + 1;
tmp = strstr(p,",");//查找到,所在的位置
//异常输入处理
if(4 == i)
{
while((',' != *p) && (' ' == *p))
p++;
if(',' == *p)
{
cell_data->Busy_Hour = 1;
continue;
}
}
q = strtok(p, ",");//取出,之前的字符串
num = strtol(q, &count, 10);//将该字符串转换成整数 // 转换失败则返回 0,如非整型数字 的字符串
switch(i)
{
case 0:
cell_data->CGI.MCC = num;
break;
case 1:
cell_data->CGI.MNC = num;
break;
case 2:
cell_data->CGI.LAC = num;
break;
case 3:
cell_data->CGI.CI = num;
break;
case 4:
cell_data->Busy_Hour = num;
break;
default:
WriteLog(_T("error\n"));
}
}
/* 解析第三、四、五个字段 */
for(i = 0; i < 3; i++)
{
flag = NORMAL;
p = tmp + 1;
tmp = strstr(p,",");
//异常输入处理
while((',' != *p) && ('\n' != *p) && ('\0' != *p) && (' ' == *p))
{
p++;
}
if((',' == *p) || ('\n' == *p) || ('\0' == *p))
{
pValueForAssigned = &strNULL;
flag = EXCEPTION;
}
//正常情况下执行的代码,异常情况下跳过
if(!flag)
{
if(2 != i)
q = strtok(p,",");
else
q = strtok(p,"\n");
if (NULL == q)
{
pValueForAssigned = &strNULL;
}
else
{
pValueForAssigned = q;
}
}
cell_data->SSID[i].assign(pValueForAssigned);
//WriteLog(cell_data->SSID[i].c_str());
}
}
break;
/* WLAN_INFO解析第0~1个字段BSSID、SSID
解析第2~8个字段Busy_Hour、 CGI(四个字段)、GPS_POS:2*str[10]、High_Quality_Num、Low_Quality_Num、Middle_Quality_Num、Quality_Level */
case WLANTABLE_ID:
{
PWLAN_INFO wlan_data = (PWLAN_INFO)data;
/* 解析第0~2个字段BSSID:str[6] GPS_POS:2*str[10] SSID:str[32] */
for(i = 0; i < 2; i++)
{
flag = NORMAL;
if(0 == i)
{
p = str;
}
else
{
p = tmp + 1;
}
//异常输入处理
while((',' != *p) && (' ' == *p))
{
p++;
}
if(',' == *p)
{
pValueForAssigned = &strNULL;
num = 0;
flag = EXCEPTION;
}
//正常情况下执行的代码,异常情况下跳过
if(!flag)
{
tmp = strstr(p,",");
q = strtok(p, ",");
if(q != NULL)
{
pValueForAssigned = q;
num = strtol(q, &count, 10);//将该字符串转换成整数
}
else
{
pValueForAssigned = NULL;
num = 0;
}
}
switch(i)
{
/* 解析第1个字段BSSID */
case 0:
wlan_data->BSSID.assign(pValueForAssigned);
break;
/* 解析第2个字段SSID */
case 1:
wlan_data->SSID.assign(pValueForAssigned);
break;
default:
WriteLog(_T("error\n"));
}
}
/* 解析第3~13个字段 Busy_Hour、RSSI、CGI(MMC、MNC、LAC、CI)、Busy_Hour、High_Quality_Num、Low_Quality_Num、Middle_Quality_Num、Quality_Level */
for(i = 0; i < 11; i++)
{
flag = NORMAL;
count = NULL;
p = tmp + 1;
tmp = strstr(p,",");//查找到,所在的位置
//异常输入处理
while((',' != *p) && ('\n' != *p) && ('\0' != *p) && (' ' == *p))
{
p++;
}
if((',' == *p) || ('\0' == *p) || ('\n' == *p))
{
pValueForAssigned = &strNULL;
num = 0;
flag = EXCEPTION;
}
//正常情况下执行的代码,异常情况下跳过
if(!flag)
{
if(10 != i)
{
q = strtok(p,",");//取出,之前的字符串
}
else
{
q = strtok(p,"\n");
}
if(q != NULL)
{
pValueForAssigned = q;
num = strtol(q, &count, 10);//将该字符串转换成整数
}
else
{
pValueForAssigned = NULL;
num = 0;
}
}
switch(i)
{
/* 解析第3个字段Busy_Hour */
case 0:
if(EXCEPTION != flag)
wlan_data->Busy_Hour = num;
else
wlan_data->Busy_Hour = 0;
break;
/* 解析第4个字段Busy_Hour */
case 1:
if(EXCEPTION != flag)
wlan_data->RSSI = num;
else
wlan_data->RSSI = 0;
break;
/* 解析第5个字段CGI */
case 2:
wlan_data->CGI.MCC = num;
break;
case 3:
wlan_data->CGI.MNC = num;
break;
case 4:
wlan_data->CGI.LAC = num;
break;
case 5:
wlan_data->CGI.CI = num;
break;
/* 解析第9个字段GPS_Pos.latitude */
case 6:
wlan_data->GPS_Pos.latitude.assign(pValueForAssigned);
break;
/* 解析第10个字段GPS_Pos.longtitude */
case 7:
wlan_data->GPS_Pos.longitude.assign(pValueForAssigned);
break;
/* 解析第11个字段High_Quality_Num */
case 8:
wlan_data->High_Quality_Num = num;
break;
/* 解析第11个字段Middle_Quality_Num */
case 9:
wlan_data->Middle_Quality_Num = num;
break;
/* 解析第12个字段Low_Quality_Num */
case 10:
wlan_data->Low_Quality_Num = num;
break;
/* 解析第13个字段Quality_Level */
case 11:
if( 0 == num)
{
num = 3;
}
wlan_data->Quality_Level = num;
break;
default:
WriteLog(_T("error\n"));
}
}
}
break;
default:
WriteLog(_T("error\n"));
}
}
/* 将小区或WLAN热点信息转换成字符串类型(注意将该字符串输入到文件时要调整文件句柄指向的位置) */
void Database::data2str(string& strRow, void* pDdata, int tableID)
{
int i = 0;
char strTemp[200] = {0}; // 暂定一行最多有200个char
switch(tableID)
{
/* 解析第一、第二个字段CGI、Busy_Hour 解析第三、四、五个字段SSID[3] */
case CELLTABLE_ID:
{
PCELL_INFO cell_data = (PCELL_INFO)pDdata;
WriteLog(_T("Enter into cell_database\n"));
i = sprintf(strTemp,"%d,%d,%d,%d,%d,%s,%s,%s\n",
cell_data->CGI.MCC, cell_data->CGI.MNC, cell_data->CGI.LAC, cell_data->CGI.CI,
cell_data->Busy_Hour, cell_data->SSID[0].c_str(), cell_data->SSID[1].c_str(), cell_data->SSID[2].c_str());
}
break;
case WLANTABLE_ID:
{
PWLAN_INFO wlan_data = (PWLAN_INFO)pDdata;
WriteLog(_T("Enter into wlan_database."));
i = sprintf(strTemp,"%s,%s,%d,%d,%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n",
wlan_data->BSSID.c_str(), wlan_data->SSID.c_str(), wlan_data->Busy_Hour,
wlan_data->RSSI, wlan_data->CGI.MCC, wlan_data->CGI.MNC, wlan_data->CGI.LAC,
wlan_data->CGI.CI, wlan_data->GPS_Pos.latitude.c_str(), wlan_data->GPS_Pos.longitude.c_str(),
wlan_data->High_Quality_Num, wlan_data->Middle_Quality_Num, wlan_data->Low_Quality_Num, wlan_data->Quality_Level);
}
break;
default:
WriteLog(_T("error\n"));
}
// 出参strRow
strRow.assign(strTemp);
}