/** * Executes the passed in command on the database. The caller is responsible for deleting * the created RecordSet. * * @param CommandString Command to execute * @param RecordSet Reference to recordset pointer that is going to hold result * * @return TRUE if execution was successful, FALSE otherwise */ virtual UBOOL Execute( const TCHAR* CommandString, FDataBaseRecordSet*& RecordSet ) { // Initialize return value. RecordSet = NULL; try { // Create instance of record set. ADODB::_RecordsetPtr ADORecordSet = NULL; ADORecordSet.CreateInstance(__uuidof(ADODB::Recordset) ); // Execute the passed in command on the record set. The recordset returned will be in open state so you can call Get* on it directly. ADORecordSet->Open( CommandString, _variant_t((IDispatch *) DataBaseConnection), ADODB::adOpenStatic, ADODB::adLockReadOnly, ADODB::adCmdText ); // Create record set from returned data. RecordSet = new FADODataBaseRecordSet( ADORecordSet ); } 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); // Delete record set if it has already been created. delete RecordSet; RecordSet = NULL; } return RecordSet != NULL; }
bool CDataStorage::OpenRecordset(ADODB::_RecordsetPtr& spRsNew, string sSQL, long lMaxRecords, long eCursorType, long eLockType, bool bDisconnect) { bool bRtn = false; try { ADODB::_RecordsetPtr loRsNew; HRESULT hr = loRsNew.CreateInstance(__uuidof(ADODB::Recordset)); if (SUCCEEDED(hr)) { //set rs parameters loRsNew->put_CacheSize( lMaxRecords > 0 ? lMaxRecords : 1 ); loRsNew->put_MaxRecords( lMaxRecords > 0 ? lMaxRecords : 0 ); loRsNew->put_CursorType( (ADODB::CursorTypeEnum)eCursorType ); loRsNew->put_LockType( (ADODB::LockTypeEnum)eLockType ); //open the rs if( m_AdoConnection != NULL ) { // BSTR sSQL string to variant CComVariant vSQL( CComBSTR(sSQL.c_str()) ); CComVariant voAdoConn( m_AdoConnection.GetInterfacePtr() ); loRsNew->Open(vSQL, voAdoConn, ( (ADODB::CursorTypeEnum)eCursorType ), ( (ADODB::LockTypeEnum)eLockType ), ADODB::adCmdText); } //If disconnection was requested disconnect the rs if( bDisconnect ) loRsNew->put_ActiveConnection( vtMissing ); hr = loRsNew->QueryInterface(loRsNew.GetIID(),(void**)&spRsNew ); if( hr == S_OK ) bRtn = true; } } catch(_com_error &e) { //Handle errors char ErrorStr[1000]; _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); sprintf_s(ErrorStr, 1000, "OpenRecordset Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n", e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription ); OutputDebugString(ErrorStr); } return bRtn; }
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(); }