1
commit e5d2bb8731424146121acff1fd686c534f9f60b0
2
Author: asfernandes <asfernandes@de594faa-8d1b-4a0c-9a6a-a7de5f8bf859>
3
Commit: asfernandes <asfernandes@de594faa-8d1b-4a0c-9a6a-a7de5f8bf859>
5
Fixed CORE-3447 - Collation is not installed with icu > 4.2.
7
git-svn-id: https://firebird.svn.sourceforge.net/svnroot/firebird/firebird/branches/B2_5_Release@52787 de594faa-8d1b-4a0c-9a6a-a7de5f8bf859
9
diff --git a/src/jrd/unicode_util.cpp b/src/jrd/unicode_util.cpp
10
index 39f2688..ba675c3 100644
11
--- a/src/jrd/unicode_util.cpp
12
+++ b/src/jrd/unicode_util.cpp
13
@@ -61,8 +61,11 @@ private:
14
ICU& operator =(const ICU&); // not implemented
18
- : inModule(NULL), ucModule(NULL)
19
+ ICU(int aMajorVersion, int aMinorVersion)
20
+ : majorVersion(aMajorVersion),
21
+ minorVersion(aMinorVersion),
27
@@ -72,6 +75,21 @@ public:
31
+ template <typename T> void getEntryPoint(const char* name, ModuleLoader::Module* module, T& ptr)
35
+ symbol.printf("%s_%d_%d", name, majorVersion, minorVersion);
36
+ module->findSymbol(symbol, ptr);
40
+ symbol.printf("%s_%d%d", name, majorVersion, minorVersion);
41
+ module->findSymbol(symbol, ptr);
46
ModuleLoader::Module* inModule;
47
ModuleLoader::Module* ucModule;
48
UVersionInfo collVersion;
49
@@ -740,17 +758,17 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const Firebird::string& icuVersion,
50
const Firebird::string& configInfo)
53
- const char* const inTemplate = "icuin%s%s.dll";
54
- const char* const ucTemplate = "icuuc%s%s.dll";
55
+ const char* const inTemplate = "icuin%d%d.dll";
56
+ const char* const ucTemplate = "icuuc%d%d.dll";
58
const char* const inTemplate = "/Library/Frameworks/Firebird.framework/Versions/A/Libraries/libicui18n.dylib";
59
const char* const ucTemplate = "/Library/Frameworks/Firebird.framework/versions/A/Libraries/libicuuc.dylib";
61
- const char* const inTemplate = "libicui18n.sl.%s%s";
62
- const char* const ucTemplate = "libicuuc.sl.%s%s";
63
+ const char* const inTemplate = "libicui18n.sl.%d%d";
64
+ const char* const ucTemplate = "libicuuc.sl.%d%d";
66
- const char* const inTemplate = "libicui18n.so.%s%s";
67
- const char* const ucTemplate = "libicuuc.so.%s%s";
68
+ const char* const inTemplate = "libicui18n.so.%d%d";
69
+ const char* const ucTemplate = "libicuuc.so.%d%d";
72
ObjectsArray<string> versions;
73
@@ -764,41 +782,32 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const Firebird::string& icuVersion,
75
for (ObjectsArray<string>::const_iterator i(versions.begin()); i != versions.end(); ++i)
77
- string majorVersion;
78
- string minorVersion;
79
+ int majorVersion, minorVersion;
83
- majorVersion = STRINGIZE(U_ICU_VERSION_MAJOR_NUM);
84
- minorVersion = STRINGIZE(U_ICU_VERSION_MINOR_NUM);
85
+ majorVersion = U_ICU_VERSION_MAJOR_NUM;
86
+ minorVersion = U_ICU_VERSION_MINOR_NUM;
90
- const size_t pos = i->find('.');
93
+ else if (sscanf(i->c_str(), "%d.%d", &majorVersion, &minorVersion) != 2)
96
- majorVersion = i->substr(0, pos);
97
- minorVersion = i->substr(pos + 1);
99
+ string configVersion;
100
+ configVersion.printf("%d.%d", majorVersion, minorVersion);
102
- if (version != majorVersion + "." + minorVersion)
104
+ if (version != configVersion)
108
ReadLockGuard readGuard(icuModules->lock);
111
if (icuModules->modules().get(version, icu))
117
- filename.printf(ucTemplate, majorVersion.c_str(), minorVersion.c_str());
118
+ filename.printf(ucTemplate, majorVersion, minorVersion);
120
- icu = FB_NEW(*getDefaultMemoryPool()) ICU();
121
+ icu = FB_NEW(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion);
123
icu->ucModule = ModuleLoader::loadModule(filename);
125
@@ -813,7 +822,7 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const Firebird::string& icuVersion,
129
- filename.printf(inTemplate, majorVersion.c_str(), minorVersion.c_str());
130
+ filename.printf(inTemplate, majorVersion, minorVersion);
132
icu->inModule = ModuleLoader::loadModule(filename);
134
@@ -828,61 +837,25 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const Firebird::string& icuVersion,
140
- symbol.printf("u_init_%s_%s", majorVersion.c_str(), minorVersion.c_str());
141
- icu->ucModule->findSymbol(symbol, icu->uInit);
143
- symbol.printf("u_versionToString_%s_%s", majorVersion.c_str(), minorVersion.c_str());
144
- icu->ucModule->findSymbol(symbol, icu->uVersionToString);
146
- symbol.printf("uloc_countAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
147
- icu->ucModule->findSymbol(symbol, icu->ulocCountAvailable);
149
- symbol.printf("uloc_getAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
150
- icu->ucModule->findSymbol(symbol, icu->ulocGetAvailable);
152
- symbol.printf("uset_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
153
- icu->ucModule->findSymbol(symbol, icu->usetClose);
155
- symbol.printf("uset_getItem_%s_%s", majorVersion.c_str(), minorVersion.c_str());
156
- icu->ucModule->findSymbol(symbol, icu->usetGetItem);
158
- symbol.printf("uset_getItemCount_%s_%s", majorVersion.c_str(), minorVersion.c_str());
159
- icu->ucModule->findSymbol(symbol, icu->usetGetItemCount);
161
- symbol.printf("uset_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
162
- icu->ucModule->findSymbol(symbol, icu->usetOpen);
164
- symbol.printf("ucol_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
165
- icu->inModule->findSymbol(symbol, icu->ucolClose);
167
- symbol.printf("ucol_getContractions_%s_%s", majorVersion.c_str(), minorVersion.c_str());
168
- icu->inModule->findSymbol(symbol, icu->ucolGetContractions);
170
- symbol.printf("ucol_getSortKey_%s_%s", majorVersion.c_str(), minorVersion.c_str());
171
- icu->inModule->findSymbol(symbol, icu->ucolGetSortKey);
173
- symbol.printf("ucol_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
174
- icu->inModule->findSymbol(symbol, icu->ucolOpen);
176
- symbol.printf("ucol_setAttribute_%s_%s", majorVersion.c_str(), minorVersion.c_str());
177
- icu->inModule->findSymbol(symbol, icu->ucolSetAttribute);
179
- symbol.printf("ucol_strcoll_%s_%s", majorVersion.c_str(), minorVersion.c_str());
180
- icu->inModule->findSymbol(symbol, icu->ucolStrColl);
182
- symbol.printf("ucol_getVersion_%s_%s", majorVersion.c_str(), minorVersion.c_str());
183
- icu->inModule->findSymbol(symbol, icu->ucolGetVersion);
185
- symbol.printf("utrans_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
186
- icu->inModule->findSymbol(symbol, icu->utransOpen);
188
- symbol.printf("utrans_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
189
- icu->inModule->findSymbol(symbol, icu->utransClose);
191
- symbol.printf("utrans_transUChars_%s_%s", majorVersion.c_str(), minorVersion.c_str());
192
- icu->inModule->findSymbol(symbol, icu->utransTransUChars);
193
+ icu->getEntryPoint("u_init", icu->ucModule, icu->uInit);
194
+ icu->getEntryPoint("u_versionToString", icu->ucModule, icu->uVersionToString);
195
+ icu->getEntryPoint("uloc_countAvailable", icu->ucModule, icu->ulocCountAvailable);
196
+ icu->getEntryPoint("uloc_getAvailable", icu->ucModule, icu->ulocGetAvailable);
197
+ icu->getEntryPoint("uset_close", icu->ucModule, icu->usetClose);
198
+ icu->getEntryPoint("uset_getItem", icu->ucModule, icu->usetGetItem);
199
+ icu->getEntryPoint("uset_getItemCount", icu->ucModule, icu->usetGetItemCount);
200
+ icu->getEntryPoint("uset_open", icu->ucModule, icu->usetOpen);
202
+ icu->getEntryPoint("ucol_close", icu->inModule, icu->ucolClose);
203
+ icu->getEntryPoint("ucol_getContractions", icu->inModule, icu->ucolGetContractions);
204
+ icu->getEntryPoint("ucol_getSortKey", icu->inModule, icu->ucolGetSortKey);
205
+ icu->getEntryPoint("ucol_open", icu->inModule, icu->ucolOpen);
206
+ icu->getEntryPoint("ucol_setAttribute", icu->inModule, icu->ucolSetAttribute);
207
+ icu->getEntryPoint("ucol_strcoll", icu->inModule, icu->ucolStrColl);
208
+ icu->getEntryPoint("ucol_getVersion", icu->inModule, icu->ucolGetVersion);
209
+ icu->getEntryPoint("utrans_open", icu->inModule, icu->utransOpen);
210
+ icu->getEntryPoint("utrans_close", icu->inModule, icu->utransClose);
211
+ icu->getEntryPoint("utrans_transUChars", icu->inModule, icu->utransTransUChars);
213
if (/*!icu->uInit ||*/ !icu->uVersionToString || !icu->ulocCountAvailable ||
214
!icu->ulocGetAvailable || !icu->usetClose || !icu->usetGetItem ||