File An-attempt-to-fix-CORE-5764-need-feedback-on-snapsho.patch of Package firebird30

From: AlexPeshkoff <alexander.peshkoff@gmail.com>
Date: Wed, 21 Mar 2018 20:05:29 +0300
Subject: An attempt to fix CORE-5764, need feedback on snapshot build
Patch-mainline: T4_0_0_Alpha2
Git-commit: 63f4e450eb6eedc8430b800bae5e0c92cfb7b068
References: CORE-5764

---
 src/common/unicode_util.cpp | 72 +++++++++++++++++++++------------------------
 1 file changed, 33 insertions(+), 39 deletions(-)

diff --git a/src/common/unicode_util.cpp b/src/common/unicode_util.cpp
index 1850ea2e9600..409c9682ddf8 100644
--- a/src/common/unicode_util.cpp
+++ b/src/common/unicode_util.cpp
@@ -50,9 +50,6 @@
 #	include <unicode/utf_old.h>
 #endif
 
-// The next major ICU version after 4.8 is 49.
-#define ICU_NEW_VERSION_MEANING	49
-
 
 using namespace Firebird;
 
@@ -122,7 +119,7 @@ public:
 
 namespace Jrd {
 
-static void formatFilename(PathName& filename, const char* templateName,
+static ModuleLoader::Module* formatAndLoad(const char* templateName,
 	int majorVersion, int minorVersion);
 
 
@@ -230,10 +227,7 @@ private:
 	ImplementConversionICU(int aMajorVersion, int aMinorVersion)
 		: BaseICU(aMajorVersion, aMinorVersion)
 	{
-		PathName filename;
-		formatFilename(filename, ucTemplate, aMajorVersion, aMinorVersion);
-
-		module = ModuleLoader::fixAndLoadModule(filename);
+		module = formatAndLoad(ucTemplate, aMajorVersion, aMinorVersion);
 		if (!module)
 			return;
 
@@ -343,16 +337,27 @@ static const char* const COLL_30_VERSION = "41.128.4.4";	// ICU 3.0 collator ver
 static GlobalPtr<UnicodeUtil::ICUModules> icuModules;
 
 
-static void formatFilename(PathName& filename, const char* templateName,
+static ModuleLoader::Module* formatAndLoad(const char* templateName,
 	int majorVersion, int minorVersion)
 {
-	string s;
-	if (majorVersion >= ICU_NEW_VERSION_MEANING)
-		s.printf("%d", majorVersion);
-	else
-		s.printf("%d%d", majorVersion, minorVersion);
+	// ICU has several schemas for placing version into file name
+	const char* patterns[] =
+	{
+		"%d", "%d_%d", "%d%d", NULL
+	};
+
+	PathName s, filename;
+	for (const char** p = patterns; *p; ++p)
+	{
+		s.printf(*p, majorVersion, minorVersion);
+		filename.printf(templateName, s.c_str());
+
+		ModuleLoader::Module* module = ModuleLoader::fixAndLoadModule(filename);
+		if (module)
+			return module;
+	}
 
-	filename.printf(templateName, s.c_str());
+	return NULL;
 }
 
 
@@ -975,17 +980,14 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const string& icuVersion, const string& c
 			continue;
 
 		string configVersion;
-
-		if (majorVersion >= ICU_NEW_VERSION_MEANING)
+		configVersion.printf("%d.%d", majorVersion, minorVersion);
+		if (version != configVersion)
 		{
 			minorVersion = 0;
 			configVersion.printf("%d", majorVersion);
+			if (version != configVersion)
+				continue;
 		}
-		else
-			configVersion.printf("%d.%d", majorVersion, minorVersion);
-
-		if (version != configVersion)
-			continue;
 
 		ReadLockGuard readGuard(icuModules->lock, "UnicodeUtil::loadICU");
 
@@ -993,27 +995,20 @@ UnicodeUtil::ICU* UnicodeUtil::loadICU(const string& icuVersion, const string& c
 		if (icuModules->modules.get(version, icu))
 			return icu;
 
-		PathName filename;
-		formatFilename(filename, ucTemplate, majorVersion, minorVersion);
-
 		icu = FB_NEW_POOL(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion);
 
-		icu->ucModule = ModuleLoader::fixAndLoadModule(filename);
-
+		icu->ucModule = formatAndLoad(ucTemplate, majorVersion, minorVersion);
 		if (!icu->ucModule)
 		{
-			gds__log("failed to load module %s", filename.c_str());
+			gds__log("failed to load UC icu module version %s", configVersion);
 			delete icu;
 			continue;
 		}
 
-		formatFilename(filename, inTemplate, majorVersion, minorVersion);
-
-		icu->inModule = ModuleLoader::fixAndLoadModule(filename);
-
+		icu->inModule = formatAndLoad(inTemplate, majorVersion, minorVersion);
 		if (!icu->inModule)
 		{
-			gds__log("failed to load module %s", filename.c_str());
+			gds__log("failed to load IN icu module version %s", configVersion);
 			delete icu;
 			continue;
 		}
@@ -1138,26 +1133,25 @@ UnicodeUtil::ConversionICU& UnicodeUtil::getConversionICU()
 	LocalStatus ls;
 	CheckStatusWrapper lastError(&ls);
 	string version;
-	const int majorArray[] = {5, 4, 3, 6, 0};
 
-	for (const int* major = majorArray; *major; ++major)
+	for (int major = 4; major <= 79; ++major)
 	{
 		for (int minor = 20; minor--; ) // from 19 down to 0
 		{
-			if ((*major == favMaj) && (minor == favMin))
+			if ((major == favMaj) && (minor == favMin))
 			{
 				continue;
 			}
 
 			try
 			{
-				if ((convIcu = ImplementConversionICU::create(*major, minor)))
+				if ((convIcu = ImplementConversionICU::create(major, minor)))
 					return *convIcu;
 			}
 			catch (const Exception& ex)
 			{
 				ex.stuffException(&lastError);
-				version.printf("Error loading ICU library version %d.%d", *major, minor);
+				version.printf("Error loading ICU library version %d.%d", major, minor);
 			}
 		}
 	}
@@ -1180,7 +1174,7 @@ string UnicodeUtil::getDefaultIcuVersion()
 	string rc;
 	UnicodeUtil::ConversionICU& icu(UnicodeUtil::getConversionICU());
 
-	if (icu.vMajor >= ICU_NEW_VERSION_MEANING)
+	if (icu.vMajor >= 10 && icu.vMinor == 0)
 		rc.printf("%d", icu.vMajor);
 	else
 		rc.printf("%d.%d", icu.vMajor, icu.vMinor);
-- 
2.16.3

openSUSE Build Service is sponsored by