database.c

#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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值