HRESULT __stdcall CXMiLFilesControl::OnFileUpdate(long parentFolderId, long fileId, long action) { // CWebSite* pWebSite = ((CWebSite*)m_document.p); DWORD rootItem; m_treeCtl->GetRootItem(&rootItem); #if 0 if (action == 1) // New File { CSiteDir* pParentDir = (CSiteDir*)FindFileById(rootItem, parentFolderId); if (pParentDir && pParentDir->m_bPopulated) { WCHAR sql[256]; swprintf(sql, L"SELECT id,filename,type,file_size,file_date FROM files WHERE id = %d", fileId); _variant_t va; ADODB::_ConnectionPtr conn = GetDBConnection(); ADODB::_RecordsetPtr recordset = conn->Execute(sql, &va, ADODB::adCmdText); CSiteItem* pNewItem = FromElement(pParentDir, recordset); if (pNewItem) { m_treeCtl->InsertItem((DWORD)pNewItem, pParentDir->m_treeItem, NULL, NULL, pNewItem->m_iIcon, pNewItem->m_cChildren, &pNewItem->m_treeItem); } } } else if (action == 2) // Delete File { CSiteItem* pItem = FindFileById(rootItem, fileId); if (pItem) { m_treeCtl->DeleteItem(pItem->m_treeItem); delete pItem; // TODO, this doesn't delete children } } else if (action == 3) // Update file { CSiteItem* pItem = FindFileById(rootItem, fileId); if (pItem) { WCHAR sql[256]; swprintf(sql, L"SELECT id,filename,type,file_size,file_date FROM files WHERE id = %d", fileId); _variant_t va; ADODB::_ConnectionPtr conn = GetDBConnection(); ADODB::_RecordsetPtr recordset = conn->Execute(sql, &va, ADODB::adCmdText); CSiteItem* pNewItem = FromRecordSet((CSiteDir*)pItem->m_parent, recordset); if (pNewItem) { pNewItem->m_treeItem = pItem->m_treeItem; m_treeCtl->SetItemInfo(pItem->m_treeItem, (DWORD)pNewItem, pNewItem->m_iIcon, pNewItem->m_cChildren); delete pItem; } } } #endif return S_OK; }
/** * Executes the passed in command on the database. * * @param CommandString Command to execute * * @return TRUE if execution was successful, FALSE otherwise */ virtual UBOOL Execute( const TCHAR* CommandString ) { try { // Execute command, passing in optimization to tell DB to not return records. DataBaseConnection->Execute( CommandString, NULL, ADODB::adExecuteNoRecords ); } catch(_com_error &Error) { // Log error and return. This will not log if called before appInit due to use of debugf. TCHAR* ErrorDescription = (TCHAR*) Error.Description(); warnf(NAME_DevDataBase,TEXT("Failure executing command [%s] [%s]"),CommandString,ErrorDescription); return FALSE; } return TRUE; }
/** * Closes connection to database. */ virtual void Close() { try { // Close database connection if exists and free smart pointer. if( DataBaseConnection ) { DataBaseConnection->Close(); DataBaseConnection = NULL; } } catch(_com_error &Error) { // Log error and return. This will not log if called before appInit due to use of debugf. TCHAR* ErrorDescription = (TCHAR*) Error.Description(); debugf(NAME_DevDataBase,TEXT("Failure closing connection [%s]"),ErrorDescription); } }
void PerformSearch(JNIEnv *env, jobject obj, jobject callback, std::wstring searchText, std::list<std::wstring>& patterns,int maximumResults, jobject monitor) { ADODB::_ConnectionPtr connection = NULL; ADODB::_RecordsetPtr recordset = NULL; try { HRESULT hr = ::CoInitialize(NULL); if (!SUCCEEDED(hr)) return; hr = connection.CreateInstance(__uuidof(ADODB::Connection)); if (!SUCCEEDED(hr)) return; hr = recordset.CreateInstance(__uuidof(ADODB::Recordset)); if (!SUCCEEDED(hr)) return; connection->CursorLocation = ADODB::adUseClient; hr = connection->Open(L"Provider=Search.CollatorDSO;Extended Properties='Application=Windows';", L"", L"", ADODB::adConnectUnspecified); if (!SUCCEEDED(hr)) return; searchText = ReplaceCharWithString(searchText, '\'', L"''"); std::wstring filenameMatcher = searchText; filenameMatcher = ReplaceCharWithString(filenameMatcher, '%', L"\\%"); filenameMatcher = ReplaceCharWithString(filenameMatcher, '*', L"%"); // see FREETEXT http://msdn.microsoft.com/en-us/library/bb231268(v=vs.85).aspx // see CONTAINS http://msdn.microsoft.com/en-us/library/bb231270(v=vs.85).aspx std::wstring query = L"SELECT TOP "; query += IntToString(maximumResults); query += L" System.ItemPathDisplay from SystemIndex WHERE "; // limit to documents, pictures and video query += L"(System.Kind = 'document' or System.Kind = 'picture' or System.Kind = 'video' or System.Kind is null) AND "; // content search query += L"(FREETEXT('\""; query += searchText; query += L"\"') OR "; // filename search query += L"(System.ItemName LIKE '%"; query += filenameMatcher; query += L"%'))"; if (patterns.size() > 0) { bool hasFilenameSearch = true; std::wstring anyFile(L"*"); for(std::list<std::wstring>::iterator iterator = patterns.begin(); iterator != patterns.end(); iterator++) { std::wstring pattern = *iterator; if (pattern == anyFile) { hasFilenameSearch = false; break; } } if (hasFilenameSearch) { query += L" AND ("; for(std::list<std::wstring>::iterator iterator = patterns.begin(); iterator != patterns.end(); iterator++) { std::wstring pattern = *iterator; if (pattern.size() == 0) { continue; } pattern = ReplaceCharWithString(pattern, '*', L"%"); if (iterator != patterns.begin()) { query += L" OR "; } query += L"(System.ItemName LIKE '"; if (pattern[0] != '%') { query += L"%"; } query += pattern; query += L"')"; } query += L")"; } } //std::cout << "Query:\n"; //std::cout << query; //std::cout << "\n"; //std::cout << std::flush; hr = recordset->Open(query.c_str(), connection.GetInterfacePtr(), ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText); if (!SUCCEEDED(hr)) { std::cout << "Open Failed\n" << std::flush; return; } int count = maximumResults; while(!recordset->ADOEOF) { _variant_t var = recordset->Fields->GetItem(L"System.ItemPathDisplay")->GetValue(); std::wstring filename = (const wchar_t*)_bstr_t(var.bstrVal); InvokeCallback(env, obj, callback, filename); if (IsProgressMonitorCancelled(env,monitor)) { break; } if (--count < 0) { break; } hr = recordset->MoveNext(); if (!SUCCEEDED(hr)) { std::cout << "Move Next Failed\n" << std::flush; break; } } } catch (_com_error &e) { _tprintf(_T("\tCOM Error code = %08lx\n"), e.Error()); } if (recordset != NULL && recordset->State == ADODB::adStateOpen) recordset->Close(); if (connection != NULL && connection->State == ADODB::adStateOpen) connection->Close(); ::CoUninitialize(); }
/** * Opens a connection to the database. * * @param ConnectionString Connection string passed to database layer * @param RemoteConnectionIP The IP address which the RemoteConnection should connect to * @param RemoteConnectionStringOverride The connection string which the RemoteConnection is going to utilize * * @return TRUE if connection was successfully established, FALSE otherwise */ virtual UBOOL Open( const TCHAR* ConnectionString, const TCHAR* RemoteConnectionIP, const TCHAR* RemoteConnectionStringOverride ) { try { // Create instance of DB connection object. HRESULT hr = DataBaseConnection.CreateInstance(__uuidof(ADODB::Connection)); if (FAILED(hr)) { throw _com_error(hr); } // Open the connection. Operation is synchronous. DataBaseConnection->Open( ConnectionString, TEXT(""), TEXT(""), ADODB::adConnectUnspecified ); } catch(_com_error &Error) { // Log error and return. This will not log if called before appInit due to use of debugf. TCHAR* ErrorDescription = (TCHAR*) Error.Description(); debugf(NAME_DevDataBase,TEXT("Failure trying to open connection [%s] [%s]"),ConnectionString,ErrorDescription); return FALSE; } return TRUE; }