static void addTableTypeFilterCondition()

in src/odbc/rsodbc/rscatalog.cpp [2869:2973]


static void addTableTypeFilterCondition(char *filterClause, char *pVal, SQLSMALLINT cbLen, int schemaPatternType)
{
    if(pVal && *pVal != '\0')
    {
        char tempBuf[MAX_TEMP_BUF_LEN];
        int len = (int)((cbLen == SQL_NTS) ? strlen(pVal) : cbLen);
        char *pToken;

        strncpy(tempBuf, pVal, len);
        tempBuf[len] = '\0';

        pToken = strtok(tempBuf, ",");

		if (schemaPatternType == LOCAL_SCHEMA_QUERY)
		{
			rs_strncat(filterClause, " AND (false ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));

			while (pToken)
			{
				pToken = trim_whitespaces(pToken);

				if (_stricmp(pToken, "TABLE") == 0
					|| _stricmp(pToken, "'TABLE'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "VIEW") == 0
					|| _stricmp(pToken, "'VIEW'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'v' AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "SYSTEM TABLE") == 0
					|| _stricmp(pToken, "'SYSTEM TABLE'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'r' AND (n.nspname = 'pg_catalog' OR n.nspname = 'information_schema') ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "SYSTEM VIEW") == 0
					|| _stricmp(pToken, "'SYSTEM VIEW'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'v' AND (n.nspname = 'pg_catalog' OR n.nspname = 'information_schema') ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "SYSTEM TOAST TABLE") == 0
					|| _stricmp(pToken, "'SYSTEM TOAST TABLE'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname = 'pg_toast' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "TEMPORARY TABLE") == 0
					|| _stricmp(pToken, "'TEMPORARY TABLE'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname ~ '^pg_temp_' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				else
				if (_stricmp(pToken, "TEMPORARY VIEW") == 0
					|| _stricmp(pToken, "'TEMPORARY VIEW'") == 0)
				{
					rs_strncat(filterClause, " OR ( c.relkind = 'v' AND n.nspname ~ '^pg_temp_' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}

				pToken = strtok(NULL, ",");
			} // Loop

			rs_strncat(filterClause, " ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
		} // LOCAL_SCHEMA_QUERY
		else
		if (schemaPatternType == NO_SCHEMA_UNIVERSAL_QUERY
			|| schemaPatternType == EXTERNAL_SCHEMA_QUERY) 
		{
			bool first = TRUE;
			rs_strncat(filterClause, " AND TABLE_TYPE IN ( ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));

			while (pToken)
			{
				char *pEscapedName = NULL;
				short cbEscapedName = 0;
				int len1;

				if (!first)
				{
					rs_strncat(filterClause, ", ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
				}
				pToken = trim_whitespaces(pToken);
				if (*pToken == '\'')
				{
					pToken++;
					pToken[strlen(pToken) - 1] = '\0'; // overwrite last '\'' with terminator
				}

				pEscapedName = escapedFilterCondition(pToken, strlen(pToken));

				len1 = strlen(filterClause);
				snprintf(filterClause + len1, MAX_CATALOG_QUERY_FILTER_LEN - len1, "'%s'", pEscapedName);
				pEscapedName = (char *)rs_free(pEscapedName);
				first = FALSE;
				pToken = strtok(NULL, ",");
			} // Loop

			rs_strncat(filterClause, " ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
		}
    }
}