|
![]() |
#1 |
Участник
|
![]() Цитата:
За использование функциональных индексов в ядре отвечают, насколько я смог разглядеть, три функции, чьи настоящие имена удалось-таки недавно узнать: MONOCASE_FIELD(), MONOCASE_LITERAL() и MONOCASE_PLACEHOLDER(). Вот, к примеру, как выглядит псевдокод функции MONOCASE_FIELD() в ax32serv.exe версии 3.0 KR3 X++: char* MONOCASE_FIELD(char *pszBuf, CSqlFieldInfo *pSqlFieldInfo, bool forceMonoCase) { if (gDatabaseCLI == DatabaseCLI::OCI) { if ( !forceMonoCase || !pSqlFieldInfo || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 14) & 1) || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1) ) { strcpy(pszBuf, "%s"); } else { sprintf(pszBuf, "SUBSTR(%s,1,%i)", "NLS_LOWER(%s)", pSqlFieldInfo->cbStringFieldBufSize - 1); } } else { if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { strcpy(pszBuf, "%s"); } else { strcpy(pszBuf, "{fn LCASE(%s)}"); } } return pszBuf; } X++: char* MONOCASE_FIELD(wchar_t *pwszBuf, unsigned int cnBufSize, struSqlFieldInfo *pSqlFieldInfo, bool forceMonoCase) { int len; if (sql_dbcli != DatabaseCLI::OCI) { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"{fn LCASE(%s)}"); } return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } if (!forceMonoCase || !pSqlFieldInfo) { return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } len = pSqlFieldInfo->BaseType == Types::String ? (*&pSqlFieldInfo->cbStringFieldBufSize >> 1) - 1 : 0; return StringCchPrintfW(pwszBuf, cnBufSize, L"SUBSTR(%s,1,%i)", L"NLS_LOWER(%s)", len); } X++: theDatabase()->DatabaseId == DatabaseId::Oracle X++: char* MONOCASE_LITERAL(char *pszBuf, bool forceMonoCase) { if (gDatabaseCLI == DatabaseCLI::OCI) { if (forceMonoCase && !((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { return strcpy(pszBuf, "NLS_LOWER(%s)"); } } else { if (forceMonoCase && !((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { return strcpy(pszBuf, "{fn LCASE(%s)}"); } } return strcpy(pszBuf, "%s"); } X++: wchar_t* MONOCASE_LITERAL(wchar_t *pwszBuf, unsigned int cnBufSize, bool forceMonoCase) { if (sql_dbcli != DatabaseCLI::OCI) { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"{fn LCASE(%s)}"); } } else { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"NLS_LOWER(%s)"); } } return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } X++: void MONOCASE_PLACEHOLDER(char *pszBuf, void *a2, bool forceMonoCase, char *pszInOutBuf) { // ... if (*pszInOutBuf) { v5 = *a2 + 1; } else { v5 = *(a2 + 4) + 1; } if (gDatabaseCLI == DatabaseCLI::OCI) { strcpy(pszInOutBuf), *pszInOutBuf ? "in" : "out"); if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) sprintf(pszBuf, ":%s%i", &pszInOutBuf, v5); else sprintf(pszBuf, "NLS_LOWER(:%s%i)", &pszInOutBuf, v5); } else { if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) sprintf(pszBuf, "?"); else sprintf(pszBuf, "{fn LCASE(?)}"); } } X++: void MONOCASE_PLACEHOLDER(wchar_t *a1, unsigned int *a2, void *pSqlField, void *pSqlMonocaseParamCnt, bool forceMonoCase, bool bIsIn) { int v6; wchar_t v12; if (bIsIn) { ++*pSqlMonocaseParamCnt; v6 = *pSqlMonocaseParamCnt; } else { ++*(pSqlMonocaseParamCnt + 1); v6 = *(pSqlMonocaseParamCnt + 1); } if (sql_dbcli == DatabaseCLI::OCI) { StringCchCopyW(&v12, 4, bIsIn ? L"in" : L"out"); StringCchPrintfExW(a1, *a2, &a1, a2, 0, forceMonoCase ? L"NLS_LOWER(:%s%i)" : L":%s%i", &v12, v6); } else { StringCchPrintfExW(a1, *a2, &a1, a2, 0, forceMonoCase ? L"{fn LCASE(?)}" : L"?"); } } |
|
|
За это сообщение автора поблагодарили: shred (0), sukhanchik (15), Logger (18), lev (10), S.Kuskov (10). |
Теги |
ax2009, ax3.0, databasehints, oracle, администрирование, индекс, настройка, полезное, субд |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|