void CFileMgrDB::UpdateFiles(CRBMap<FILEKEY,CFileTaskItem*> & FileList) { CStringA strCmd, strCmd2; CHAR strHash[33]; m_db->Exec("begin transaction"); POSITION pos = FileList.GetHeadPosition(); while (pos) { FILEKEY fk = FileList.GetKeyAt(pos); CFileTaskItem *item = FileList.GetNextValue(pos); md4strA(fk.key, strHash); CStringA strPath = StrToUtf8(item->m_strFilePath), strUrl = StrToUtf8(item->m_strUrl), strName = StrToUtf8(item->m_FileName), strLink = StrToUtf8(item->m_strEd2kLink); strPath.Replace("'", "''"); strUrl.Replace("'", "''"); strName.Replace("'", "''"); strLink.Replace("'", "''"); strCmd2.Format("INSERT INTO files (hash, state, path, url, size, name, ed2klink, filetime, metbakid) " "VALUES ('%s',%u,'%s','%s',%I64u,'%s','%s',%I64u,%u)", strHash, item->m_nFileState, strPath, strUrl, item->m_FileSize, strName, strLink, item->m_tFiletime.GetTime(), item->m_metBakId); SQL_EXEC(strCmd2); } m_db->Exec("end transaction"); }
void CFileMgrDB::RemoveFile(CFileTaskItem * item, CONST BYTE * lpHash) { CStringA strCmd, strCmd2; if(lpHash != NULL && !isnulmd4(lpHash)) { CHAR strHash[33]; md4strA(lpHash, strHash); strCmd.Format("SELECT id FROM files WHERE hash='%s'", strHash); strCmd2.Format("DELETE FROM files WHERE hash='%s'", strHash); } else { CStringA strUrl = StrToUtf8(item->m_strUrl); strUrl.Replace("'", "''"); strCmd.Format("SELECT id FROM files WHERE url='%s'", strUrl); strCmd2.Format("DELETE FROM files WHERE url='%s'", strUrl); } if(!m_db->Prepare(strCmd)) return; if(!m_db->Step()) { m_db->Finalize(); return; } UINT id = m_db->GetColInt(0); strCmd.Format("DELETE FROM urls WHERE fid=%d", id); SQL_EXEC(strCmd); SQL_EXEC(strCmd2); }
void CFileMgrDB::UpdateUrl(CFileTaskItem * item, CUrlSite * lpSite, CONST BYTE * lpHash) { CStringA strCmd, strUrl; if(lpHash != NULL && !isnulmd4(lpHash)) { CHAR strHash[33]; md4strA(lpHash, strHash); strCmd.Format("SELECT id FROM files WHERE hash='%s'", strHash); } else if(item->m_strUrl != "") { strUrl = StrToUtf8(item->m_strUrl); strUrl.Replace("'", "''"); strCmd.Format("SELECT id FROM files WHERE url='%s'", StrToUtf8(item->m_strUrl)); } else return; if(!m_db->Prepare(strCmd)) return; if(!m_db->Step()) { m_db->Finalize(); return; } UINT id = m_db->GetColInt(0); strUrl = StrToUtf8(lpSite->m_strUrl); strUrl.Replace("'", "''"); strCmd.Format("SELECT id FROM urls WHERE fid=%u AND url='%s'", id, strUrl); BOOL bReplace = FALSE; UINT uid = 0; if(m_db->Prepare(strCmd)) { if(m_db->Step()) { bReplace = TRUE; uid = m_db->GetColInt(0); } m_db->Finalize(); } if(bReplace) strCmd.Format("UPDATE urls SET fid=%u, url='%s', fromwhere=%u, transnopay=%I64u, transpay=%I64u, badsite=%d, pref=%d, needci=%u WHERE id=%u", id, strUrl, lpSite->m_dwFromWhere, lpSite->m_dwDataTransferedWithoutPayload, lpSite->m_dwDataTransferedWithPayload, lpSite->m_bBadSite ? 1 : 0, lpSite->m_dwInitPreference, lpSite->m_bNeedCommitted ? 1 : 0, uid); else strCmd.Format("INSERT INTO urls (fid, url, fromwhere, transnopay, transpay, badsite, pref, needci) VALUES (%u,'%s',%u,%I64u,%I64u,%d,%d,%u)", id, strUrl, lpSite->m_dwFromWhere, lpSite->m_dwDataTransferedWithoutPayload, lpSite->m_dwDataTransferedWithPayload, lpSite->m_bBadSite ? 1 : 0, lpSite->m_dwInitPreference, lpSite->m_bNeedCommitted ? 1 : 0); SQL_EXEC(strCmd); }
void CFileMgrDB::UpdateFile(CFileTaskItem * item, CONST BYTE * lpHash, BOOL bNew, BOOL bUpdateUrl) { CStringA strCmd, strCmd2; CHAR strHash[33]; UINT id = 0; if(lpHash != NULL && !isnulmd4(lpHash)) { md4strA(lpHash, strHash); strCmd.Format("SELECT id FROM files WHERE hash='%s'", strHash); if(m_db->Prepare(strCmd)) { if(m_db->Step()) { bNew = FALSE; id = m_db->GetColInt(0); } m_db->Finalize(); } } else if(item->m_strUrl != "") { strHash[0] = 0; strCmd.Format("SELECT id FROM files WHERE url='%s'", StrToUtf8(item->m_strUrl)); if(m_db->Prepare(strCmd)) { if(m_db->Step()) { bNew = FALSE; id = m_db->GetColInt(0); } m_db->Finalize(); } } else return; CStringA strPath = StrToUtf8(item->m_strFilePath), strUrl = StrToUtf8(item->m_strUrl), strName = StrToUtf8(item->m_FileName), strLink = StrToUtf8(item->m_strEd2kLink); strPath.Replace("'", "''"); strUrl.Replace("'", "''"); strName.Replace("'", "''"); strLink.Replace("'", "''"); if(bNew) strCmd2.Format("INSERT INTO files (hash, state, path, url, size, name, ed2klink, filetime, metbakid) " "VALUES ('%s',%u,'%s','%s',%I64u,'%s','%s',%I64u,%u)", strHash, item->m_nFileState, strPath, strUrl, item->m_FileSize, strName, strLink, item->m_tFiletime.GetTime(), item->m_metBakId); else strCmd2.Format("UPDATE files SET hash='%s', state=%u, path='%s', url='%s', size=%I64u, name='%s', ed2klink='%s', " "filetime=%I64u, metbakid=%u WHERE id=%u", strHash, item->m_nFileState, strPath, strUrl, item->m_FileSize,strName, strLink, item->m_tFiletime.GetTime(), item->m_metBakId, id); SQL_EXEC(strCmd2); if(bNew) { if(!m_db->Prepare(strCmd)) return; if(!m_db->Step()) { m_db->Finalize(); return; } id = m_db->GetColInt(0); } if(!bUpdateUrl) return; strCmd.Format("DELETE FROM urls WHERE fid=%d", id); SQL_EXEC(strCmd); POSITION pos = item->m_lMetaLinkURLList.GetHeadPosition(); while (pos) { CUrlSite pSite = item->m_lMetaLinkURLList.GetNext(pos); strUrl = StrToUtf8(pSite.m_strUrl); strUrl.Replace("'", "''"); strCmd.Format("INSERT INTO urls (fid, url, fromwhere, transnopay, transpay, badsite, pref, needci) VALUES (%u,'%s',%u,%I64u,%I64u,%d,%d,%u)", id, strUrl, pSite.m_dwFromWhere, pSite.m_dwDataTransferedWithoutPayload, pSite.m_dwDataTransferedWithPayload, pSite.m_bBadSite ? 1 : 0, pSite.m_dwInitPreference, pSite.m_bNeedCommitted ? 1 : 0); SQL_EXEC(strCmd); } }
bool CUpDownClient::SendHttpBlockRequests() { USES_CONVERSION; ASSERT( GetDownloadState() == DS_DOWNLOADING ); ASSERT( m_ePeerCacheDownState == PCDS_WAIT_CLIENT_REPLY || m_ePeerCacheDownState == PCDS_DOWNLOADING ); m_bPeerCacheDownHit = false; m_dwLastBlockReceived = ::GetTickCount(); if (reqfile == NULL) throw CString(_T("Failed to send block requests - No 'reqfile' attached")); CreateBlockRequests(1); if (m_PendingBlocks_list.IsEmpty()){ if (m_pPCDownSocket != NULL){ m_pPCDownSocket->Safe_Delete(); ASSERT( m_pPCDownSocket == NULL ); SetPeerCacheDownState(PCDS_NONE); } SetDownloadState(DS_NONEEDEDPARTS); SwapToAnotherFile(_T("A4AF for NNP file. CUpDownClient::SendHttpBlockRequests()"), true, false, false, NULL, true, true); return false; } // PeerCache does not support persistant HTTP connections if (m_pPCDownSocket != NULL) { m_pPCDownSocket->Safe_Delete(); ASSERT( m_pPCDownSocket == NULL ); SetPeerCacheDownState(PCDS_NONE); return SendPeerCacheFileRequest(); } ASSERT( m_pPCDownSocket == NULL ); m_pPCDownSocket = new CPeerCacheDownSocket(this); m_pPCDownSocket->SetTimeOut(GetPeerCacheSocketDownloadTimeout()); if (!m_pPCDownSocket->Create()){ m_pPCDownSocket->Safe_Delete(); ASSERT( m_pPCDownSocket == NULL ); return false; } ASSERT( !m_pPCDownSocket->IsConnected() ); SOCKADDR_IN sockAddr = {0}; sockAddr.sin_family = AF_INET; sockAddr.sin_port = htons( theApp.m_pPeerCache->GetCachePort() ); sockAddr.sin_addr.S_un.S_addr = theApp.m_pPeerCache->GetCacheIP(); //Try to always tell the socket to WaitForOnConnect before you call Connect. m_pPCDownSocket->WaitForOnConnect(); m_pPCDownSocket->Connect((SOCKADDR*)&sockAddr, sizeof sockAddr); POSITION pos = m_PendingBlocks_list.GetHeadPosition(); Pending_Block_Struct* pending = m_PendingBlocks_list.GetNext(pos); ASSERT( pending->block->StartOffset <= pending->block->EndOffset ); m_uReqStart = pending->block->StartOffset; m_uReqEnd = pending->block->EndOffset; m_nUrlStartPos = (uint64)-1; CStringA strPCRequest; strPCRequest.AppendFormat("GET http://%s/.ed2khash=%s HTTP/1.0\r\n", ipstrA(m_uPeerCacheRemoteIP), md4strA(reqfile->GetFileHash())); strPCRequest.AppendFormat("X-ED2K-PushId: %u\r\n", m_uPeerCacheDownloadPushId); strPCRequest.AppendFormat("Range: bytes=%I64u-%I64u\r\n", m_uReqStart, m_uReqEnd); strPCRequest.AppendFormat("User-Agent: eMule/%s\r\n", T2CA(theApp.m_strCurVersionLong)); strPCRequest.AppendFormat("X-Network: eDonkey,Kademlia\r\n"); strPCRequest.AppendFormat("\r\n"); if (thePrefs.GetDebugClientTCPLevel() > 0){ DebugSend("PeerCache-GET", this, reqfile->GetFileHash()); Debug(_T(" %hs\n"), strPCRequest); } CRawPacket* pHttpPacket = new CRawPacket(strPCRequest); theStats.AddUpDataOverheadFileRequest(pHttpPacket->size); m_pPCDownSocket->SendPacket(pHttpPacket); m_pPCDownSocket->SetHttpState(HttpStateRecvExpected); SetPeerCacheDownState(PCDS_WAIT_CACHE_REPLY); return true; }