From 79a01438a7eec4ce8e7086621b6d9c8041c44e08 Mon Sep 17 00:00:00 2001 From: PeiYong Zhang <peiyongz@apache.org> Date: Mon, 13 Sep 2004 21:24:20 +0000 Subject: [PATCH] 1. returned data to contain datatype in addition to value 2. registry to map type name (in string) to type name enum git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@176039 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/framework/psvi/XSValue.cpp | 197 ++++++++++++++++++------- src/xercesc/framework/psvi/XSValue.hpp | 89 ++++++----- 2 files changed, 198 insertions(+), 88 deletions(-) diff --git a/src/xercesc/framework/psvi/XSValue.cpp b/src/xercesc/framework/psvi/XSValue.cpp index 33e3d3190..7f7a125b9 100644 --- a/src/xercesc/framework/psvi/XSValue.cpp +++ b/src/xercesc/framework/psvi/XSValue.cpp @@ -16,6 +16,10 @@ /* * $Log$ + * Revision 1.11 2004/09/13 21:24:20 peiyongz + * 1. returned data to contain datatype in addition to value + * 2. registry to map type name (in string) to type name enum + * * Revision 1.10 2004/09/09 20:08:31 peiyongz * Using new error code * @@ -156,6 +160,9 @@ static XMLRegisterCleanup XSValueMutexCleanup; static RegularExpression* sXSValueRegEx = 0; static XMLRegisterCleanup XSValueRegExCleanup; +RefHashTableOf<XSValue>* XSValue::fDataTypeRegistry = 0; +static XMLRegisterCleanup XSValueRegistryCleanup; + static XMLMutex& gXSValueMutex() { if (!sXSValueMutext) @@ -201,6 +208,80 @@ static RegularExpression* getRegEx() return sXSValueRegEx; } +XSValue::DataType XSValue::getDataType(const XMLCh* const dtString) +{ + + if (!fDataTypeRegistry) + { + // Lock the mutex + XMLMutexLock lockInit(&gXSValueMutex()); + + if (!fDataTypeRegistry) + { + try { + //using the XMLPlatformUtils::fgMemoryManager + fDataTypeRegistry = new RefHashTableOf<XSValue>(43, true, new HashXMLCh() ); + + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_STRING, new XSValue(dt_string)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BOOLEAN, new XSValue(dt_boolean)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DECIMAL, new XSValue(dt_decimal)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_FLOAT, new XSValue(dt_float)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DOUBLE, new XSValue(dt_double)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DURATION, new XSValue(dt_duration)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DATETIME, new XSValue(dt_dateTime)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_TIME, new XSValue(dt_time)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DATE, new XSValue(dt_date)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_YEARMONTH, new XSValue(dt_gYearMonth)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_YEAR, new XSValue(dt_gYear)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_MONTHDAY, new XSValue(dt_gMonthDay)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DAY, new XSValue(dt_gDay)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_MONTH, new XSValue(dt_gMonth)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_HEXBINARY, new XSValue(dt_hexBinary)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BASE64BINARY, new XSValue(dt_base64Binary)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_ANYURI, new XSValue(dt_anyURI)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_QNAME, new XSValue(dt_QName)); + fDataTypeRegistry->put((void*) XMLUni::fgNotationString, new XSValue(dt_NOTATION)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NORMALIZEDSTRING, new XSValue(dt_normalizedString)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_TOKEN, new XSValue(dt_token)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_LANGUAGE, new XSValue(dt_language)); + fDataTypeRegistry->put((void*) XMLUni::fgNmTokenString, new XSValue(dt_NMTOKEN)); + fDataTypeRegistry->put((void*) XMLUni::fgNmTokensString, new XSValue(dt_NMTOKENS)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NAME, new XSValue(dt_Name)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NCNAME, new XSValue(dt_NCName)); + fDataTypeRegistry->put((void*) XMLUni::fgIDString, new XSValue(dt_ID)); + fDataTypeRegistry->put((void*) XMLUni::fgIDRefString, new XSValue(dt_IDREF)); + fDataTypeRegistry->put((void*) XMLUni::fgIDRefsString, new XSValue(dt_IDREFS)); + fDataTypeRegistry->put((void*) XMLUni::fgEntityString, new XSValue(dt_ENTITY)); + fDataTypeRegistry->put((void*) XMLUni::fgEntitiesString, new XSValue(dt_ENTITIES)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_INTEGER, new XSValue(dt_integer)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NONPOSITIVEINTEGER, new XSValue(dt_nonPositiveInteger)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NEGATIVEINTEGER, new XSValue(dt_negativeInteger)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_LONG, new XSValue(dt_long)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_INT, new XSValue(dt_int)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_SHORT, new XSValue(dt_short)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BYTE, new XSValue(dt_byte)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NONNEGATIVEINTEGER, new XSValue(dt_nonNegativeInteger)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_ULONG, new XSValue(dt_unsignedLong)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_UINT, new XSValue(dt_unsignedInt)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_USHORT, new XSValue(dt_unsignedShort)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_UBYTE, new XSValue(dt_unsignedByte)); + fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_POSITIVEINTEGER, new XSValue(dt_positiveInteger)); + + } + catch (...) + { + return dt_MAXCOUNT; + } + + XSValueRegistryCleanup.registerCleanup(XSValue::reinitRegistry); + } + } + + XSValue* data = fDataTypeRegistry->get(dtString); + return data? data->fData.f_datatype : dt_MAXCOUNT; + +} + inline static bool checkTimeZoneError(XSValue::DataType const &datatype , SchemaDateTimeException const &e ) @@ -226,16 +307,18 @@ static const int base_decimal = 10; // --------------------------------------------------------------------------- // XSValue: Constructors and Destructor // --------------------------------------------------------------------------- -XSValue::XSValue(MemoryManager* const manager) +XSValue::XSValue(DataType const dt + , MemoryManager* const manager) :fMemAllocated(false) ,fMemoryManager(manager) { + fData.f_datatype = dt; } XSValue::~XSValue() { if (fMemAllocated) - fMemoryManager->deallocate(fData.f_strVal); + fMemoryManager->deallocate(fData.fValue.f_strVal); } // --------------------------------------------------------------------------- @@ -1255,14 +1338,14 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); + XSValue* retVal = new (manager) XSValue(dt_decimal, manager); - retVal->fData.f_decimal.f_sign = data.getSign(); - retVal->fData.f_decimal.f_scale = data.getScale(); - retVal->fData.f_decimal.f_fraction = actValFract.f_ulong; - retVal->fData.f_decimal.f_integral = actValInt.f_ulong; + retVal->fData.fValue.f_decimal.f_sign = data.getSign(); + retVal->fData.fValue.f_decimal.f_scale = data.getScale(); + retVal->fData.fValue.f_decimal.f_fraction = actValFract.f_ulong; + retVal->fData.fValue.f_decimal.f_integral = actValInt.f_ulong; - retVal->fData.f_decimal.f_dvalue = data2.getValue(); + retVal->fData.fValue.f_decimal.f_dvalue = data2.getValue(); return retVal; } @@ -1278,8 +1361,8 @@ XSValue::getActValNumerics(const XMLCh* const content } else { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_float = (float) data.getValue(); + XSValue* retVal = new (manager) XSValue(dt_float, manager); + retVal->fData.fValue.f_float = (float) data.getValue(); return retVal; } } @@ -1295,8 +1378,8 @@ XSValue::getActValNumerics(const XMLCh* const content } else { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_double = data.getValue(); + XSValue* retVal = new (manager) XSValue(dt_double, manager); + retVal->fData.fValue.f_double = data.getValue(); return retVal; } } @@ -1330,8 +1413,8 @@ XSValue::getActValNumerics(const XMLCh* const content case XSValue::dt_integer: // error: no { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_integer, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1341,8 +1424,8 @@ XSValue::getActValNumerics(const XMLCh* const content if (actVal.f_long > -1) return 0; - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_negativeInteger, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1352,8 +1435,8 @@ XSValue::getActValNumerics(const XMLCh* const content if (actVal.f_long > 0) return 0; - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_nonPositiveInteger, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1363,8 +1446,8 @@ XSValue::getActValNumerics(const XMLCh* const content if (actVal.f_long < 0) return 0; - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_nonNegativeInteger, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1374,8 +1457,8 @@ XSValue::getActValNumerics(const XMLCh* const content if (actVal.f_long < 1) return 0; - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_positiveInteger, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1408,8 +1491,8 @@ XSValue::getActValNumerics(const XMLCh* const content case XSValue::dt_long: // error : no { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_long = actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_long, manager); + retVal->fData.fValue.f_long = actVal.f_long; return retVal; } break; @@ -1424,8 +1507,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_int = (int) actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_int, manager); + retVal->fData.fValue.f_int = (int) actVal.f_long; return retVal; } break; @@ -1438,8 +1521,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_short = (short) actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_short, manager); + retVal->fData.fValue.f_short = (short) actVal.f_long; return retVal; } break; @@ -1452,8 +1535,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_char = (char) actVal.f_long; + XSValue* retVal = new (manager) XSValue(dt_byte, manager); + retVal->fData.fValue.f_char = (char) actVal.f_long; return retVal; } break; @@ -1484,8 +1567,8 @@ XSValue::getActValNumerics(const XMLCh* const content case XSValue::dt_unsignedLong: // error: no { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_ulong = actVal.f_ulong; + XSValue* retVal = new (manager) XSValue(dt_unsignedLong, manager); + retVal->fData.fValue.f_ulong = actVal.f_ulong; return retVal; } break; @@ -1500,8 +1583,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_uint = (unsigned int) actVal.f_ulong; + XSValue* retVal = new (manager) XSValue(dt_unsignedInt, manager); + retVal->fData.fValue.f_uint = (unsigned int) actVal.f_ulong; return retVal; } break; @@ -1514,8 +1597,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_ushort = (unsigned short) actVal.f_ulong; + XSValue* retVal = new (manager) XSValue(dt_unsignedShort, manager); + retVal->fData.fValue.f_ushort = (unsigned short) actVal.f_ulong; return retVal; } break; @@ -1528,8 +1611,8 @@ XSValue::getActValNumerics(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_uchar = (unsigned char) actVal.f_ulong; + XSValue* retVal = new (manager) XSValue(dt_unsignedByte, manager); + retVal->fData.fValue.f_uchar = (unsigned char) actVal.f_ulong; return retVal; } break; @@ -1595,15 +1678,15 @@ XSValue::getActValDateTimes(const XMLCh* const content break; } - XSValue* retVal = new (manager) XSValue(manager); + XSValue* retVal = new (manager) XSValue(datatype, manager); - retVal->fData.f_datetime.f_year = coreDate.fValue[XMLDateTime::CentYear]; - retVal->fData.f_datetime.f_month = coreDate.fValue[XMLDateTime::Month]; - retVal->fData.f_datetime.f_day = coreDate.fValue[XMLDateTime::Day]; - retVal->fData.f_datetime.f_hour = coreDate.fValue[XMLDateTime::Hour]; - retVal->fData.f_datetime.f_min = coreDate.fValue[XMLDateTime::Minute]; - retVal->fData.f_datetime.f_second = coreDate.fValue[XMLDateTime::Second]; - retVal->fData.f_datetime.f_milisec = coreDate.fMiliSecond; + retVal->fData.fValue.f_datetime.f_year = coreDate.fValue[XMLDateTime::CentYear]; + retVal->fData.fValue.f_datetime.f_month = coreDate.fValue[XMLDateTime::Month]; + retVal->fData.fValue.f_datetime.f_day = coreDate.fValue[XMLDateTime::Day]; + retVal->fData.fValue.f_datetime.f_hour = coreDate.fValue[XMLDateTime::Hour]; + retVal->fData.fValue.f_datetime.f_min = coreDate.fValue[XMLDateTime::Minute]; + retVal->fData.fValue.f_datetime.f_second = coreDate.fValue[XMLDateTime::Second]; + retVal->fData.fValue.f_datetime.f_milisec = coreDate.fMiliSecond; return retVal; } @@ -1640,15 +1723,15 @@ XSValue::getActValStrings(const XMLCh* const content if (XMLString::equals(content, XMLUni::fgBooleanValueSpace[0]) || XMLString::equals(content, XMLUni::fgBooleanValueSpace[2]) ) { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_bool = true; + XSValue* retVal = new (manager) XSValue(dt_boolean, manager); + retVal->fData.fValue.f_bool = true; return retVal; } else if (XMLString::equals(content, XMLUni::fgBooleanValueSpace[1]) || XMLString::equals(content, XMLUni::fgBooleanValueSpace[3]) ) { - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_bool = false; + XSValue* retVal = new (manager) XSValue(dt_boolean, manager); + retVal->fData.fValue.f_bool = false; return retVal; } else @@ -1668,8 +1751,8 @@ XSValue::getActValStrings(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_strVal = decodedData; + XSValue* retVal = new (manager) XSValue(dt_hexBinary, manager); + retVal->fData.fValue.f_strVal = decodedData; retVal->fMemAllocated = true; return retVal; } @@ -1685,8 +1768,8 @@ XSValue::getActValStrings(const XMLCh* const content return 0; } - XSValue* retVal = new (manager) XSValue(manager); - retVal->fData.f_strVal = decodedData; + XSValue* retVal = new (manager) XSValue(dt_base64Binary, manager); + retVal->fData.fValue.f_strVal = decodedData; retVal->fMemAllocated = true; return retVal; } @@ -1795,6 +1878,12 @@ void XSValue::reinitRegEx() sXSValueRegEx = 0; } +void XSValue::reinitRegistry() +{ + delete fDataTypeRegistry; + fDataTypeRegistry = 0; +} + XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/framework/psvi/XSValue.hpp b/src/xercesc/framework/psvi/XSValue.hpp index c1dbb3d68..10dd1490a 100644 --- a/src/xercesc/framework/psvi/XSValue.hpp +++ b/src/xercesc/framework/psvi/XSValue.hpp @@ -16,6 +16,10 @@ /* * $Log$ + * Revision 1.11 2004/09/13 21:24:20 peiyongz + * 1. returned data to contain datatype in addition to value + * 2. registry to map type name (in string) to type name enum + * * Revision 1.10 2004/09/09 20:08:31 peiyongz * Using new error code * @@ -51,6 +55,7 @@ #define XSVALUE_HPP #include <xercesc/util/PlatformUtils.hpp> +#include <xercesc/util/RefHashTableOf.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -176,43 +181,52 @@ public: , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); + static + DataType getDataType (const XMLCh* const dtString); + //@} //---------------------------------- /** public data */ - union { - bool f_bool; - char f_char; - unsigned char f_uchar; - short f_short; - unsigned short f_ushort; - int f_int; - unsigned int f_uint; - long f_long; - unsigned long f_ulong; - float f_float; - double f_double; - XMLCh* f_strVal; - - struct decimal { - int f_sign; - unsigned int f_scale; - unsigned long f_integral; - unsigned long f_fraction; - double f_dvalue; - } f_decimal; - - struct datetime { - int f_year; - int f_month; - int f_day; - int f_hour; - int f_min; - int f_second; - double f_milisec; - - } f_datetime; + struct { + + DataType f_datatype; + + union { + bool f_bool; + char f_char; + unsigned char f_uchar; + short f_short; + unsigned short f_ushort; + int f_int; + unsigned int f_uint; + long f_long; + unsigned long f_ulong; + float f_float; + double f_double; + XMLCh* f_strVal; + + struct decimal { + int f_sign; + unsigned int f_scale; + unsigned long f_integral; + unsigned long f_fraction; + double f_dvalue; + } f_decimal; + + struct datetime { + int f_year; + int f_month; + int f_day; + int f_hour; + int f_min; + int f_second; + double f_milisec; + + } f_datetime; + + } fValue; } fData; @@ -222,6 +236,9 @@ public: static void reinitRegEx(); + static + void reinitRegistry(); + private: typedef union @@ -236,7 +253,10 @@ private: * The default constructor * */ - XSValue(MemoryManager* const manager); + XSValue( + DataType const dt + , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); //@}; @@ -363,6 +383,8 @@ private: , MemoryManager* const manager ); + static RefHashTableOf<XSValue>* fDataTypeRegistry; + // ----------------------------------------------------------------------- // data members // ----------------------------------------------------------------------- @@ -371,7 +393,6 @@ private: }; - XERCES_CPP_NAMESPACE_END #endif -- GitLab