This patch ok.
--
Peter
jbalint@stripped wrote:
>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�that is, a valid pointer to a string
> of length
>- zero � matches only the empty string ("").
>- */
>- 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�that is, a valid pointer to a string
> of length
>- zero � matches only the empty string ("").
>- */
>- 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�that is, a valid pointer to a string
> of length
>- zero � matches only the empty string ("").
>- */
>- 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
>
>
>
>
--
Peter Harvey, Software Developer
MySQL AB, www.mysql.com
Are you MySQL certified? www.mysql.com/certification