Modified:
trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
trunk/SDK/MYSQLPlus/Library/MResultPlus.h
trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
Log:
Gathered all the wildcard matching logic into one function.
Wildcards now support escaped chars and underscore matching (needed to link tables with
underscores in access)
Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp 2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp 2006-11-08 23:57:29 UTC (rev 663)
@@ -1847,33 +1847,17 @@
MYODBCDbgReturn( doAppendTablesSchemas( stringCatalog, stringSchemaFilter,
stringTableFilter, stringTableType ) );
}
- QStringList stringlistCatalogs = getCatalogs( "%" );
+ QStringList stringlistCatalogs = filterByWildcard( getCatalogs( "%"),
+ getStatement()->getMetadataID() == SQL_FALSE &&
+ getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 ?
+ stringSchemaFilter : "%" );
- BOOL bWildCard = ( getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 &&
getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringCatalogFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistCatalogs.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringCatalogFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistCatalogs[n] );
- else
- bMatch = stringlistCatalogs[n] == stringCatalogFilter;
-
- if ( bMatch )
- {
- nReturn = doAppendTablesSchemas( stringlistCatalogs[n], stringSchemaFilter,
stringTableFilter, stringTableType );
- if ( !SQL_SUCCEEDED( nReturn ) )
- break;
- }
+ nReturn = doAppendTablesSchemas( stringlistCatalogs[n], stringSchemaFilter,
+ stringTableFilter, stringTableType );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -1885,39 +1869,17 @@
SQLRETURN nReturn = SQL_SUCCESS;
- /*!
- \internal ODBC Rule
+ QStringList stringlistSchemas = filterByWildcard(
+ getSchemas( stringCatalog, "%"),
+ getStatement()->getMetadataID() == SQL_FALSE ?
+ stringSchemaFilter : "%" );
- However, a zero-length search pattern- zero - */
- QStringList stringlistSchemas = getSchemas( stringCatalog, "%" );
-
- BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringSchemaFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistSchemas.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringSchemaFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistSchemas[n] );
- else
- bMatch = stringlistSchemas[n] == stringSchemaFilter;
-
- if ( bMatch )
- {
- nReturn = doAppendTablesTables( stringCatalog, stringlistSchemas[n],
stringTableFilter, stringTableType );
- if ( !SQL_SUCCEEDED( nReturn ) )
- break;
- }
+ nReturn = doAppendTablesTables( stringCatalog, stringlistSchemas[n],
+ stringTableFilter, stringTableType );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -1957,35 +1919,17 @@
SQLRETURN nReturn = SQL_SUCCESS;
- /*!
- \internal
- \todo
+ QStringList stringlistTables = filterByWildcard(
+ getTables( stringCatalog, stringSchema, "%" ),
+ getStatement()->getMetadataID() == SQL_FALSE ?
+ stringTableFilter : "%" );
- Support VIEW etc
- */
- QStringList stringlistTables = getTables( stringCatalog, stringSchema, "%" );
-
- BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringTableFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistTables.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringTableFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistTables[n] );
- else
- bMatch = stringlistTables[n] == stringTableFilter;
-
- if ( bMatch )
- doAppendTables( stringCatalog, stringSchema, stringlistTables[n],
stringTableType );
+ nReturn = doAppendTables( stringCatalog, stringSchema,
+ stringlistTables[n], stringTableType );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -2009,37 +1953,20 @@
if ( stringCatalog.isNull() )
stringCatalog = "";
-// printf( "[PAH][%s][%s][%d] CATALOG: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringCatalog.toLatin1().data());
MYODBCDbgReturn( doAppendColumnsSchemas( stringCatalog, stringSchemaFilter,
stringTableFilter, stringColumnFilter ) );
}
- QStringList stringlistCatalogs = getCatalogs( "%" );
+ QStringList stringlistCatalogs = filterByWildcard( getCatalogs( "%"),
+ getStatement()->getMetadataID() == SQL_FALSE &&
+ getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 ?
+ stringSchemaFilter : "%" );
- BOOL bWildCard = ( getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 &&
getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringCatalogFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistCatalogs.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringCatalogFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistCatalogs[n] );
- else
- bMatch = stringlistCatalogs[n] == stringCatalogFilter;
-
- if ( bMatch )
- {
- nReturn = doAppendColumnsSchemas( stringlistCatalogs[n], stringSchemaFilter,
stringTableFilter, stringColumnFilter );
- if ( !SQL_SUCCEEDED( nReturn ) )
- break;
- }
+ nReturn = doAppendColumnsSchemas( stringlistCatalogs[n], stringSchemaFilter,
+ stringTableFilter, stringColumnFilter );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -2051,40 +1978,17 @@
SQLRETURN nReturn = SQL_SUCCESS;
- /*!
- \internal ODBC Rule
+ QStringList stringlistSchemas = filterByWildcard(
+ getSchemas( stringCatalog, "%"),
+ getStatement()->getMetadataID() == SQL_FALSE ?
+ stringSchemaFilter : "%" );
- However, a zero-length search pattern- zero - */
- QStringList stringlistSchemas = getSchemas( stringCatalog, "%" );
-
- BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringSchemaFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistSchemas.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringSchemaFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistSchemas[n] );
- else
- bMatch = stringlistSchemas[n] == stringSchemaFilter;
-
- if ( bMatch )
- {
-// printf( "[PAH][%s][%s][%d] SCHEMA: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringlistSchemas[n].toLatin1().data());
- nReturn = doAppendColumnsTables( stringCatalog, stringlistSchemas[n],
stringTableFilter, stringColumnFilter );
- if ( !SQL_SUCCEEDED( nReturn ) )
- break;
- }
+ nReturn = doAppendColumnsTables( stringCatalog, stringlistSchemas[n],
+ stringTableFilter, stringColumnFilter );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -2096,41 +2000,17 @@
SQLRETURN nReturn = SQL_SUCCESS;
- /*!
- \internal ODBC Rule
+ QStringList stringlistTables = filterByWildcard(
+ getTables( stringCatalog, stringSchema, "%" ),
+ getStatement()->getMetadataID() == SQL_FALSE ?
+ stringTableFilter : "%" );
- However, a zero-length search pattern- zero - */
- QStringList stringlistTables = getTables( stringCatalog, stringSchema, "%" );
-
- /* setup regex as needed */
- BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
- QString stringWildCard = stringTableFilter;
- QRegExp regexWildCard;
- regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
- if ( bWildCard )
- regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
for ( int n = 0; n < stringlistTables.count(); n++ )
{
- BOOL bMatch;
-
- if ( stringTableFilter.isNull() )
- bMatch = true;
- else if ( bWildCard )
- bMatch = regexWildCard.exactMatch( stringlistTables[n] );
- else
- bMatch = stringlistTables[n] == stringTableFilter;
-
- if ( bMatch )
- {
-// printf( "[PAH][%s][%s][%d] TABLE: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringlistTables[n].toLatin1().data() );
- nReturn = doAppendColumnsColumns( stringCatalog, stringSchema,
stringlistTables[n], stringColumnFilter );
- if ( !SQL_SUCCEEDED( nReturn ) )
- break;
- }
+ nReturn = doAppendColumnsColumns( stringCatalog, stringSchema,
+ stringlistTables[n], stringColumnFilter );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ break;
}
MYODBCDbgReturn( nReturn );
@@ -2756,4 +2636,66 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+QStringList MResultPlus::filterByWildcard( QStringList items, QString wildcard)
+{
+ QStringList result;
+ QStringList::const_iterator i;
+ QRegExp regex("", Qt::CaseInsensitive, QRegExp::Wildcard);
+ /* replacements for transforming the wildcard to a regex */
+ const char *replaceBefore[] = {"%", "_"};
+ const char *replaceAfter[] = {"*", "?"};
+ const int replacements = 2;
+
+ int j, k, pos;
+
+ if(wildcard.isNull())
+ {
+ /* null wildcard matches all */
+ regex.setPattern("*");
+ }
+ else
+ {
+ /* fix up the wildcard to a regex, leaving escaped chars alone */
+ for(j = 0; j < replacements; ++j)
+ {
+ QString replpattern;
+ replpattern.append("([^\\\\]|^)").append(replaceBefore[j]);
+ QRegExp replregex(replpattern);
+
+ QString escpattern;
+ escpattern.append("\\\\").append(replaceBefore[j]);
+ QRegExp escregex(escpattern);
+
+ pos = 0;
+ /* first fix the wildcard chars */
+ while((pos = replregex.indexIn(wildcard, pos)) != -1)
+ {
+ QString match = replregex.cap(1);
+ wildcard.replace(pos,
+ match.length() + strlen(replaceAfter[j]),
+ match + replaceAfter[j]);
+ }
+
+ pos = 0;
+ /* next fix the escaped chars */
+ while((pos = escregex.indexIn(wildcard, pos)) != -1)
+ {
+ QString match = replregex.cap(1);
+ wildcard.replace(pos, 2, replaceBefore[j]);
+ }
+ }
+
+ regex.setPattern(wildcard);
+ }
+
+ /* actually filter the list */
+ for(i = items.begin(); i != items.end(); ++i)
+ {
+ if(regex.exactMatch(*i))
+ result += *i;
+ }
+
+ return result;
+}
+
Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.h 2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.h 2006-11-08 23:57:29 UTC (rev 663)
@@ -246,6 +246,11 @@
const QVariant &variantGrantee,
const QVariant &variantPrivilege,
const QVariant &variantIsGrantable );
+
+ /*!
+ Filter a list of items by an SQL-style wildcard.
+ */
+ QStringList filterByWildcard(QStringList items, QString wildcard);
};
#endif
Modified: trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultRes.cpp 2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultRes.cpp 2006-11-08 23:57:29 UTC (rev 663)
@@ -317,7 +317,7 @@
switch ( getBuffered() )
{
case BUFFERED_UNBUFFERED:
- pRes = mysql_use_result( getMySQL() ); // bring rows to client as needed
// bring rows to client as needed
+ pRes = mysql_use_result( getMySQL() ); // bring rows to client as needed
break;
case BUFFERED_MYSQL_PLUS:
pRes = mysql_use_result( getMySQL() ); // bring rows to client as needed