diff --git a/firebird-2.5.0-svn-CORE-3447.patch b/firebird-2.5.0-svn-CORE-3447.patch new file mode 100644 index 0000000..a633b61 --- /dev/null +++ b/firebird-2.5.0-svn-CORE-3447.patch @@ -0,0 +1,205 @@ +--- src/jrd/unicode_util.cpp 2011/04/21 09:50:06 52786 ++++ src/jrd/unicode_util.cpp 2011/04/21 19:57:57 52787 +@@ -61,8 +61,11 @@ + ICU& operator =(const ICU&); // not implemented + + public: +- ICU() +- : inModule(NULL), ucModule(NULL) ++ ICU(int aMajorVersion, int aMinorVersion) ++ : majorVersion(aMajorVersion), ++ minorVersion(aMinorVersion), ++ inModule(NULL), ++ ucModule(NULL) + { + } + +@@ -72,6 +75,21 @@ + delete inModule; + } + ++ template void getEntryPoint(const char* name, ModuleLoader::Module* module, T& ptr) ++ { ++ string symbol; ++ ++ symbol.printf("%s_%d_%d", name, majorVersion, minorVersion); ++ module->findSymbol(symbol, ptr); ++ if (ptr) ++ return; ++ ++ symbol.printf("%s_%d%d", name, majorVersion, minorVersion); ++ module->findSymbol(symbol, ptr); ++ } ++ ++ int majorVersion; ++ int minorVersion; + ModuleLoader::Module* inModule; + ModuleLoader::Module* ucModule; + UVersionInfo collVersion; +@@ -740,17 +758,17 @@ + const Firebird::string& configInfo) + { + #if defined(WIN_NT) +- const char* const inTemplate = "icuin%s%s.dll"; +- const char* const ucTemplate = "icuuc%s%s.dll"; ++ const char* const inTemplate = "icuin%d%d.dll"; ++ const char* const ucTemplate = "icuuc%d%d.dll"; + #elif defined(DARWIN) + const char* const inTemplate = "/Library/Frameworks/Firebird.framework/Versions/A/Libraries/libicui18n.dylib"; + const char* const ucTemplate = "/Library/Frameworks/Firebird.framework/versions/A/Libraries/libicuuc.dylib"; + #elif defined(HPUX) +- const char* const inTemplate = "libicui18n.sl.%s%s"; +- const char* const ucTemplate = "libicuuc.sl.%s%s"; ++ const char* const inTemplate = "libicui18n.sl.%d%d"; ++ const char* const ucTemplate = "libicuuc.sl.%d%d"; + #else +- const char* const inTemplate = "libicui18n.so.%s%s"; +- const char* const ucTemplate = "libicuuc.so.%s%s"; ++ const char* const inTemplate = "libicui18n.so.%d%d"; ++ const char* const ucTemplate = "libicuuc.so.%d%d"; + #endif + + ObjectsArray versions; +@@ -764,41 +782,32 @@ + + for (ObjectsArray::const_iterator i(versions.begin()); i != versions.end(); ++i) + { +- string majorVersion; +- string minorVersion; ++ int majorVersion, minorVersion; + + if (*i == "default") + { +- majorVersion = STRINGIZE(U_ICU_VERSION_MAJOR_NUM); +- minorVersion = STRINGIZE(U_ICU_VERSION_MINOR_NUM); ++ majorVersion = U_ICU_VERSION_MAJOR_NUM; ++ minorVersion = U_ICU_VERSION_MINOR_NUM; + } +- else +- { +- const size_t pos = i->find('.'); +- if (pos == i->npos) +- continue; ++ else if (sscanf(i->c_str(), "%d.%d", &majorVersion, &minorVersion) != 2) ++ continue; + +- majorVersion = i->substr(0, pos); +- minorVersion = i->substr(pos + 1); +- } ++ string configVersion; ++ configVersion.printf("%d.%d", majorVersion, minorVersion); + +- if (version != majorVersion + "." + minorVersion) +- { ++ if (version != configVersion) + continue; +- } + + ReadLockGuard readGuard(icuModules->lock); + + ICU* icu; + if (icuModules->modules().get(version, icu)) +- { + return icu; +- } + + PathName filename; +- filename.printf(ucTemplate, majorVersion.c_str(), minorVersion.c_str()); ++ filename.printf(ucTemplate, majorVersion, minorVersion); + +- icu = FB_NEW(*getDefaultMemoryPool()) ICU(); ++ icu = FB_NEW(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion); + + icu->ucModule = ModuleLoader::loadModule(filename); + if (!icu->ucModule) +@@ -813,7 +822,7 @@ + continue; + } + +- filename.printf(inTemplate, majorVersion.c_str(), minorVersion.c_str()); ++ filename.printf(inTemplate, majorVersion, minorVersion); + + icu->inModule = ModuleLoader::loadModule(filename); + if (!icu->inModule) +@@ -828,61 +837,25 @@ + continue; + } + +- string symbol; +- +- symbol.printf("u_init_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->uInit); +- +- symbol.printf("u_versionToString_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->uVersionToString); +- +- symbol.printf("uloc_countAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->ulocCountAvailable); +- +- symbol.printf("uloc_getAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->ulocGetAvailable); +- +- symbol.printf("uset_close_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->usetClose); +- +- symbol.printf("uset_getItem_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->usetGetItem); +- +- symbol.printf("uset_getItemCount_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->usetGetItemCount); +- +- symbol.printf("uset_open_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->ucModule->findSymbol(symbol, icu->usetOpen); +- +- symbol.printf("ucol_close_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolClose); +- +- symbol.printf("ucol_getContractions_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolGetContractions); +- +- symbol.printf("ucol_getSortKey_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolGetSortKey); +- +- symbol.printf("ucol_open_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolOpen); +- +- symbol.printf("ucol_setAttribute_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolSetAttribute); +- +- symbol.printf("ucol_strcoll_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolStrColl); +- +- symbol.printf("ucol_getVersion_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->ucolGetVersion); +- +- symbol.printf("utrans_open_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->utransOpen); +- +- symbol.printf("utrans_close_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->utransClose); +- +- symbol.printf("utrans_transUChars_%s_%s", majorVersion.c_str(), minorVersion.c_str()); +- icu->inModule->findSymbol(symbol, icu->utransTransUChars); ++ icu->getEntryPoint("u_init", icu->ucModule, icu->uInit); ++ icu->getEntryPoint("u_versionToString", icu->ucModule, icu->uVersionToString); ++ icu->getEntryPoint("uloc_countAvailable", icu->ucModule, icu->ulocCountAvailable); ++ icu->getEntryPoint("uloc_getAvailable", icu->ucModule, icu->ulocGetAvailable); ++ icu->getEntryPoint("uset_close", icu->ucModule, icu->usetClose); ++ icu->getEntryPoint("uset_getItem", icu->ucModule, icu->usetGetItem); ++ icu->getEntryPoint("uset_getItemCount", icu->ucModule, icu->usetGetItemCount); ++ icu->getEntryPoint("uset_open", icu->ucModule, icu->usetOpen); ++ ++ icu->getEntryPoint("ucol_close", icu->inModule, icu->ucolClose); ++ icu->getEntryPoint("ucol_getContractions", icu->inModule, icu->ucolGetContractions); ++ icu->getEntryPoint("ucol_getSortKey", icu->inModule, icu->ucolGetSortKey); ++ icu->getEntryPoint("ucol_open", icu->inModule, icu->ucolOpen); ++ icu->getEntryPoint("ucol_setAttribute", icu->inModule, icu->ucolSetAttribute); ++ icu->getEntryPoint("ucol_strcoll", icu->inModule, icu->ucolStrColl); ++ icu->getEntryPoint("ucol_getVersion", icu->inModule, icu->ucolGetVersion); ++ icu->getEntryPoint("utrans_open", icu->inModule, icu->utransOpen); ++ icu->getEntryPoint("utrans_close", icu->inModule, icu->utransClose); ++ icu->getEntryPoint("utrans_transUChars", icu->inModule, icu->utransTransUChars); + + if (/*!icu->uInit ||*/ !icu->uVersionToString || !icu->ulocCountAvailable || + !icu->ulocGetAvailable || !icu->usetClose || !icu->usetGetItem || +