Browse Source

format search differently treat spaces as OR unless in quotes
[SAB]


git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@140 595ec19a-5cb4-439b-94a8-42fb3063c22c

sabrogden 21 years ago
parent
commit
ef993ccc7c
3 changed files with 180 additions and 15 deletions
  1. 140 0
      FormatSQL.cpp
  2. 34 0
      FormatSQL.h
  3. 6 15
      QPasteWnd.cpp

+ 140 - 0
FormatSQL.cpp

@@ -0,0 +1,140 @@
+// FormatSQL.cpp: implementation of the CFormatSQL class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "cp_main.h"
+#include "FormatSQL.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[]=__FILE__;
+#define new DEBUG_NEW
+#endif
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CFormatSQL::CFormatSQL()
+{
+
+}
+
+CFormatSQL::~CFormatSQL()
+{
+
+}
+
+void CFormatSQL::Parse(CString cs)
+{
+	//Replace all single ' with a double '
+	cs.Replace("'", "''");
+	//Replace all "|" with a space
+	cs.Replace("|", " ");
+
+	int nLength = cs.GetLength();
+
+	CString csCurrentWord;
+	bool bInQuotes = false;
+	eSpecialTypes eNotValue = eINVALID;
+	eSpecialTypes eOrValue = eAND;
+
+	for(int i = 0; i < nLength; i++)
+	{
+		switch(cs[i])
+		{
+		case '"':
+			bInQuotes = !bInQuotes;
+			break;
+		case ' ':
+			if(bInQuotes == false)
+			{
+				eSpecialTypes sp = ConvetToKey(csCurrentWord);
+				switch(sp)
+				{
+				case eNOT:
+					eNotValue = sp;
+					break;
+				case eOR:
+				case eAND:
+					eOrValue = sp;
+					break;
+				default:
+					AddToSQL(csCurrentWord, eNotValue, eOrValue);
+				}
+				csCurrentWord = "";
+			}
+			else
+			{
+				csCurrentWord += cs[i];
+			}
+			break;
+		default:
+			csCurrentWord += cs[i];
+		}
+	}
+
+	if(csCurrentWord.GetLength() > 0)
+		AddToSQL(csCurrentWord, eNotValue, eOrValue);
+}
+
+CFormatSQL::eSpecialTypes CFormatSQL::ConvetToKey(CString cs)
+{
+	cs.MakeUpper();
+
+	if(cs == "NOT" || 
+		cs == "!")
+	{
+		return eNOT;
+	}
+	else if(cs == "OR")
+	{
+		return eOR;
+	}
+	else if(cs == "AND")
+	{
+		return eAND;
+	}
+
+	return eINVALID;
+}
+
+CString CFormatSQL::GetKeyWordString(eSpecialTypes eKeyWord)
+{
+	switch(eKeyWord)
+	{
+	case eNOT:
+		return " NOT ";
+	case eAND:
+		return " AND ";
+	case eOR:
+		return " OR ";
+	case eINVALID:
+		return " ";
+	}
+
+	return " ";
+}
+
+bool CFormatSQL::AddToSQL(CString cs, eSpecialTypes &eNOTValue, eSpecialTypes &eORValue)
+{
+	CString csThisSQL;
+	cs.TrimLeft();
+	cs.TrimRight();
+	csThisSQL.Format("%s%sLIKE \'*%s*\'", m_csVariable, GetKeyWordString(eNOTValue), cs);
+
+	if(m_csWhere.GetLength() > 0)
+	{
+		m_csWhere += GetKeyWordString(eORValue) + csThisSQL;
+	}
+	else
+	{
+		m_csWhere = csThisSQL;
+	}
+
+	eNOTValue = eINVALID;
+	eORValue = eAND;
+
+	return true;
+}

+ 34 - 0
FormatSQL.h

@@ -0,0 +1,34 @@
+// FormatSQL.h: interface for the CFormatSQL class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#if !defined(AFX_FORMATSQL_H__3D7AC79C_FDD8_4948_B7CD_601FB513F208__INCLUDED_)
+#define AFX_FORMATSQL_H__3D7AC79C_FDD8_4948_B7CD_601FB513F208__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+class CFormatSQL  
+{
+public:
+	CFormatSQL();
+	virtual ~CFormatSQL();
+
+	void Parse(CString cs);
+
+	CString GetSQLString()				{ return m_csWhere; }
+	void	SetVariable(CString cs)		{ m_csVariable = cs;}
+
+protected:
+	CString m_csWhere;
+	CString m_csVariable;
+	enum eSpecialTypes{eINVALID, eNOT, eAND, eOR};
+	
+
+	bool AddToSQL(CString cs, eSpecialTypes &eNOTValue, eSpecialTypes &eORValue);
+	CFormatSQL::eSpecialTypes ConvetToKey(CString cs);
+	CString GetKeyWordString(eSpecialTypes eKeyWord);
+};
+
+#endif // !defined(AFX_FORMATSQL_H__3D7AC79C_FDD8_4948_B7CD_601FB513F208__INCLUDED_)

+ 6 - 15
QPasteWnd.cpp

@@ -10,6 +10,7 @@
 #include ".\qpastewnd.h"
 #include "MoveToGroupDlg.h"
 #include "HyperLink.h"
+#include "FormatSQL.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -672,20 +673,11 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
 	}
 	else
 	{
-		//Replace all single ' with a double '
-		csSQLSearch.Replace("'", "''");
-		
-		//Can't query using strings that have '|' in them
-		//this should be removed later
-		if(csSQLSearch.Find("|") >= 0)
-			return FALSE;
-		
-		m_strSQLSearch.Format("mText LIKE \'*%s*\'", csSQLSearch);
-		
-		if( strFilter.IsEmpty() )
-			strFilter = m_strSQLSearch;
-		else
-			strFilter += " AND " + m_strSQLSearch;
+		CFormatSQL SQLFormat;
+		SQLFormat.SetVariable("mText");
+		SQLFormat.Parse(csSQLSearch);
+
+		strFilter = m_strSQLSearch = SQLFormat.GetSQLString();
 	}
 	
 	try
@@ -739,7 +731,6 @@ BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
 	return TRUE;
 }
 
-
 void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult) 
 {
 	POINT pp;