BOOL CWordFilter::InitWordFliter() { SGDP::ISDDBSession* pDBSession = gsapi::GetDBMgr()->GetPayDBSession(); if(NULL == pDBSession) { return FALSE; } SGDP::ISDDBRecordSet* pRes = NULL; UINT32 dwErrID = 0; string strErr; INT32 nRet = pDBSession->ExecuteSqlRs("select * from wordfilter;", &pRes, &dwErrID, &strErr); if(SDDB_HAS_RECORDSET != nRet) { SYS_CRITICAL(_SDT("[%s: %d]: has no data!"), MSG_MARK); return FALSE; } int nLen = 0; TWordFilterData stWordFilterData; //查询的表结果 while(pRes->GetRecord())// 当有行结果时 { stWordFilterData.Init(); nLen = pRes->GetFieldLengthByName("Words"); nLen = nLen >= MAX_WORD_FILTER ? MAX_WORD_FILTER - 1 : nLen; string strWords = pRes->GetFieldValueByName("Words"); string strTmp = SDStrlwr(strWords); _SDTStrncpy(stWordFilterData.m_szWordFilters, strTmp.c_str(), nLen); //_SDTStrncpy(stWordFilterData.m_szWordFilters, pRecordSet->GetFieldValueByName("Words"), nLen); string strkey = stWordFilterData.m_szWordFilters; if(m_mapWordFilterData.find(strkey) == m_mapWordFilterData.end()) { m_mapWordFilterData[strkey] = stWordFilterData; } } if(NULL != pRes) { pRes->Release(); pRes = NULL; } CWordFilterDataMapItr itr; for(itr = m_mapWordFilterData.begin(); itr != m_mapWordFilterData.end(); itr++) { KMP_GetNext(itr->second.m_szWordFilters, itr->second.m_kmpvalue); // 得到一个与内容有关的数值m_kmpvalue[i] } return TRUE; }
void CWordFilter::Init() { HANDLE hFile; DWORD dwRead; int nLen; BOOL bResult; CStringList list; //m_count = 0; // 如果文件目录不对,程序移动一下,到config目录下 added by kernel1983 2006.07.31 if (PathFileExists(thePrefs.GetMuleDirectory(EMULE_EXECUTEABLEDIR) + FLITER_FILE)) MoveFile(thePrefs.GetMuleDirectory(EMULE_EXECUTEABLEDIR) + FLITER_FILE, thePrefs.GetMuleDirectory(EMULE_CONFIGDIR) + FLITER_FILE); if (!PathFileExists(thePrefs.GetMuleDirectory(EMULE_CONFIGDIR) + FLITER_FILE)) { // 不存在,所有的都过滤 added by kernel1983 2006.08.08 m_filterall = true; return; } // Open file for read hFile = CreateFile(thePrefs.GetMuleDirectory(EMULE_CONFIGDIR) + FLITER_FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //AddLogLine(false,_T(":%s\n"),thePrefs.GetMuleDirectory(EMULE_CONFIGDIR) + FLITER_FILE); if(hFile == NULL || hFile == INVALID_HANDLE_VALUE) { // 读取错误,所有的都过滤 added by kernel1983 2006.08.08 m_filterall = true; return; } DWORD dwSize = GetFileSize(hFile, NULL); TCHAR * pszData = new TCHAR[(dwSize / sizeof(TCHAR)) + 1]; // 申请空间 bResult = ReadFile(hFile, pszData, dwSize, &dwRead, NULL); // 读入文件1 CloseHandle(hFile); pszData[(dwSize / sizeof(TCHAR))] = 0; if(bResult) { TCHAR * pszTemp = wcstok(pszData + 1, _T("\r\n")); while(pszTemp != NULL) { nLen = wcslen(pszTemp); while(pszTemp[nLen - 1] == '\t' || pszTemp[nLen - 1] == ' ') { nLen --; pszTemp[nLen] = 0; } while(*pszTemp == '\t' || *pszTemp == ' ') { pszTemp ++; nLen --; } //AddLogLine(false,_T("pszTemp:%s"),pszTemp); //AddLogLine(false,_T("nLen:%d"),nLen); if(nLen > 0)list.AddTail(pszTemp); //if(nLen == 8)AddLogLine(false,_T(":%d %d %d %d "),((char*)pszTemp)[0],((char*)pszTemp)[1],((char*)pszTemp)[2],((char*)pszTemp)[3]); pszTemp = wcstok(NULL, _T("\r\n")); } } delete[] pszData; m_count = list.GetCount(); //AddLogLine(false,_T("m_count:%d"),m_count); if(bResult && m_count > 0) { m_filterwords = new TCHAR*[m_count+1]; m_kmpvalue = new int*[m_count+1]; ZeroMemory(m_filterwords, sizeof(TCHAR *) * m_count); ZeroMemory(m_kmpvalue, sizeof(int *) * m_count); } for(int i = 0; bResult && (i < m_count); i ++) { CString s = list.GetAt(list.FindIndex(i)); s.MakeLower(); nLen = s.GetLength(); //AddLogLine(false,_T("nLen:%d"),nLen); m_filterwords[i] = new TCHAR[nLen + 1]; m_filterwords[i][nLen] = 0; // 最后一个字节设为0 m_kmpvalue[i] = new int[nLen]; //AddLogLine(false,_T("nLen:%d"),nLen); _tcscpy(m_filterwords[i],s); //AddLogLine(false,_T("m_filterwords[i]:%s"),m_filterwords[i]); KMP_GetNext(m_filterwords[i], m_kmpvalue[i]); // 得到一个与内容有关的数值m_kmpvalue[i] } if(m_count == 0 || !bResult) { Free(); //m_filterall = true; } }