Commit b7650cdd authored by Pavel Vainerman's avatar Pavel Vainerman Committed by Pavel Vainerman

supported hash[32|64], added 3rd party library (contrib)

parent f7a26056
......@@ -3,7 +3,7 @@
############################################################################
FIRSTSUBDIRS=IDL
SUBDIRS=. src lib include Utilities tests extensions wrappers docs
SUBDIRS=. contrib src lib include Utilities tests extensions wrappers docs
# testsuite
pkgconfigdir = $(libdir)/pkgconfig
......
......@@ -274,7 +274,6 @@ fi
AM_CONDITIONAL(HAVE_EXTENTIONS, test ${ext} = true)
#check python support
AC_MSG_CHECKING([python support])
buildpython=true
......@@ -531,6 +530,9 @@ AC_CONFIG_FILES([Makefile
IDL/UniSetTypes/Makefile
IDL/UniSetTypes/UniSetBaseConstants.idl
IDL/Processes/Makefile
contrib/Makefile
contrib/cityhash102/Makefile
contrib/libfarmhash/Makefile
src/Core/Makefile
src/Communications/Makefile
src/Communications/Modbus/Makefile
......
############################################################################
# This file is part of the UniSet library #
############################################################################
SUBDIRS=cityhash102 libfarmhash
include $(top_builddir)/include.mk
// Copyright (c) 2011 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
noinst_LTLIBRARIES = libCityHash102.la
libCityHash102_la_CPPFLAGS = -Isrc -Iinclude
libCityHash102_la_SOURCES = src/city.cc
include $(top_builddir)/include.mk
// Copyright (c) 2011 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// CityHash, by Geoff Pike and Jyrki Alakuijala
//
// This file provides a few functions for hashing strings. On x86-64
// hardware in 2011, CityHash64() is faster than other high-quality
// hash functions, such as Murmur. This is largely due to higher
// instruction-level parallelism. CityHash64() and CityHash128() also perform
// well on hash-quality tests.
//
// CityHash128() is optimized for relatively long strings and returns
// a 128-bit hash. For strings more than about 2000 bytes it can be
// faster than CityHash64().
//
// Functions in the CityHash family are not suitable for cryptography.
//
// WARNING: This code has not been tested on big-endian platforms!
// It is known to work well on little-endian platforms that have a small penalty
// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs.
//
// By the way, for some hash functions, given strings a and b, the hash
// of a+b is easily derived from the hashes of a and b. This property
// doesn't hold for any hash functions in this file.
#ifndef CITY_HASH_H_
#define CITY_HASH_H_
#include <stdlib.h> // for size_t.
#include <stdint.h>
#include <utility>
/** This is a version of CityHash that predates v1.0.3 algorithm change.
* Why we need exactly this version?
* Although hash values of CityHash are not recommended for storing persistently anywhere,
* it has already been used this way in ClickHouse:
* - for calculation of checksums of compressed chunks and for data parts;
* - this version of CityHash is exposed in cityHash64 function in ClickHouse SQL language;
* - and already used by many users for data ordering, sampling and sharding.
*/
namespace CityHash_v1_0_2
{
typedef uint8_t uint8;
typedef uint32_t uint32;
typedef uint64_t uint64;
typedef std::pair<uint64, uint64> uint128;
inline uint64 Uint128Low64(const uint128& x) { return x.first; }
inline uint64 Uint128High64(const uint128& x) { return x.second; }
// Hash function for a byte array.
uint64 CityHash64(const char *buf, size_t len);
// Hash function for a byte array. For convenience, a 64-bit seed is also
// hashed into the result.
uint64 CityHash64WithSeed(const char *buf, size_t len, uint64 seed);
// Hash function for a byte array. For convenience, two seeds are also
// hashed into the result.
uint64 CityHash64WithSeeds(const char *buf, size_t len,
uint64 seed0, uint64 seed1);
// Hash function for a byte array.
uint128 CityHash128(const char *s, size_t len);
// Hash function for a byte array. For convenience, a 128-bit seed is also
// hashed into the result.
uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed);
// Hash 128 input bits down to 64 bits of output.
// This is intended to be a reasonably good hash function.
inline uint64 Hash128to64(const uint128& x) {
// Murmur-inspired hashing.
const uint64 kMul = 0x9ddfea08eb382d69ULL;
uint64 a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul;
a ^= (a >> 47);
uint64 b = (Uint128High64(x) ^ a) * kMul;
b ^= (b >> 47);
b *= kMul;
return b;
}
}
#endif // CITY_HASH_H_
// Copyright (c) 2011 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// CityHash, by Geoff Pike and Jyrki Alakuijala
//
// This file declares the subset of the CityHash functions that require
// _mm_crc32_u64(). See the CityHash README for details.
//
// Functions in the CityHash family are not suitable for cryptography.
#ifndef CITY_HASH_CRC_H_
#define CITY_HASH_CRC_H_
#include <city.h>
namespace CityHash_v1_0_2
{
// Hash function for a byte array.
uint128 CityHashCrc128(const char *s, size_t len);
// Hash function for a byte array. For convenience, a 128-bit seed is also
// hashed into the result.
uint128 CityHashCrc128WithSeed(const char *s, size_t len, uint128 seed);
// Hash function for a byte array. Sets result[0] ... result[3].
void CityHashCrc256(const char *s, size_t len, uint64 *result);
}
#endif // CITY_HASH_CRC_H_
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
/* Define to 1 if the compiler supports __builtin_expect. */
#if _MSC_VER
#define HAVE_BUILTIN_EXPECT 0
#else
#define HAVE_BUILTIN_EXPECT 1
#endif
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "cityhash-discuss@googlegroups.com"
/* Define to the full name of this package. */
#define PACKAGE_NAME "CityHash"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "CityHash 1.0.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "cityhash"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "1.0.2"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
/* # undef WORDS_BIGENDIAN */
# endif
#endif
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
#define below would cause a syntax error. */
/* #undef _UINT32_T */
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
#define below would cause a syntax error. */
/* #undef _UINT64_T */
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
#define below would cause a syntax error. */
/* #undef _UINT8_T */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
/* Define to `int' if <sys/types.h> does not define. */
/* #undef ssize_t */
/* Define to the type of an unsigned integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
/* #undef uint32_t */
/* Define to the type of an unsigned integer type of width exactly 64 bits if
such a type exists and the standard includes do not define it. */
/* #undef uint64_t */
/* Define to the type of an unsigned integer type of width exactly 8 bits if
such a type exists and the standard includes do not define it. */
/* #undef uint8_t */
#ifdef _MSC_VER
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#else
#include <sys/types.h>
#endif
// Copyright (c) 2014 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
noinst_LTLIBRARIES = libFarmHash.la
libFarmHash_la_SOURCES = farmhash.cc
include $(top_builddir)/include.mk
Original URL: https://code.google.com/p/farmhash/
Created from version:
commit afdb2e459d030afd1f3b6116545397509326385e
Author: gpike@google.com <gpike@google.com@34f43262-9e73-f86a-efff-89e1528fadaf>
Date: Sun Mar 1 20:04:23 2015 +0000
Various additions, updates, and fixes for FarmHash 1.1.
This source diff could not be displayed because it is too large. You can view the blob instead.
CREATE TABLE main_history (
id PRIMARY KEY NOT NULL,
id BIGSERIAL PRIMARY KEY NOT NULL,
date date NOT NULL,
time time NOT NULL,
time_usec int NOT NULL CHECK (time_usec >= 0),
sensor_id int NOT NULL,
value double precision NOT NULL,
node int NOT NULL,
confirm int DEFAULT NULL,
PRIMARY KEY (id)
confirm int DEFAULT NULL
);
......@@ -32,6 +32,7 @@ namespace uniset
{
/*! реализация интерфейса ObjectIndex на основе xml-файла, с автоматическим назначением id объектам
* DEPRECATED! Use ObjectIndex_hashXML!
*
* \todo Проверить функции этого класса на повторную входимость
*/
......
/*
* Copyright (c) 2020 Pavel Vainerman.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, version 2.1.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// --------------------------------------------------------------------------
#ifndef ObjectIndex_hashXML_H_
#define ObjectIndex_hashXML_H_
// --------------------------------------------------------------------------
#include <unordered_map>
#include <string>
#include "ObjectIndex.h"
#include "UniXML.h"
// --------------------------------------------------------------------------
namespace uniset
{
/*! реализация интерфейса ObjectIndex на основе xml-файла,
* с генерированием id на основе name при помощи hash функции
*/
class ObjectIndex_hashXML:
public uniset::ObjectIndex
{
public:
ObjectIndex_hashXML( const std::string& xmlfile );
ObjectIndex_hashXML( const std::shared_ptr<UniXML>& xml );
virtual ~ObjectIndex_hashXML();
virtual const uniset::ObjectInfo* getObjectInfo( const uniset::ObjectId ) const noexcept override;
virtual const uniset::ObjectInfo* getObjectInfo( const std::string& name ) const noexcept override;
virtual uniset::ObjectId getIdByName( const std::string& name ) const noexcept override;
virtual std::string getMapName( const uniset::ObjectId id ) const noexcept override;
virtual std::string getTextName( const uniset::ObjectId id ) const noexcept override;
virtual std::ostream& printMap( std::ostream& os ) const noexcept override;
friend std::ostream& operator<<(std::ostream& os, ObjectIndex_hashXML& oi );
protected:
void build( const std::shared_ptr<UniXML>& xml );
void read_section( const std::shared_ptr<UniXML>& xml, const std::string& sec );
void read_nodes( const std::shared_ptr<UniXML>& xml, const std::string& sec );
private:
typedef std::unordered_map<uniset::ObjectId, uniset::ObjectInfo> MapObjects;
MapObjects omap;
typedef std::unordered_map<std::string, uniset::ObjectId> MapObjectKey;
MapObjectKey mok; // для обратного писка
};
// -------------------------------------------------------------------------
} // end of uniset namespace
// -----------------------------------------------------------------------------------------
#endif
......@@ -82,6 +82,11 @@ namespace uniset
KeyType key( const uniset::ObjectId id, const uniset::ObjectId node );
KeyType key( const IOController_i::SensorInfo& si );
uint64_t hash64( const std::string& str ) noexcept;
uint64_t hash64( const char* buf, size_t sz ) noexcept;
uint32_t hash32( const std::string& str ) noexcept;
uint32_t hash32( const char* buf, size_t sz ) noexcept;
typedef std::list<std::string> ListObjectName; /*!< Список объектов типа ObjectName */
typedef CORBA::Object_ptr ObjectPtr; /*!< Ссылка на объект, регистрируемый в ObjectRepository */
......
......@@ -34,8 +34,8 @@
#include "Exceptions.h"
#include "MessageType.h"
#include "ObjectIndex_Array.h"
#include "ObjectIndex_XML.h"
#include "ObjectIndex_idXML.h"
#include "ObjectIndex_hashXML.h"
#include "UniSetActivator.h"
// -------------------------------------------------------------------------
using namespace std;
......@@ -1538,6 +1538,4 @@ namespace uniset
return uniset::uconf;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
} // end of UniSetTypes namespace
noinst_LTLIBRARIES = libUCore.la
libUCore_la_LIBADD = $(top_builddir)/contrib/cityhash102/libCityHash102.la $(top_builddir)/contrib/libfarmhash/libFarmHash.la
libUCore_la_CPPFLAGS = -I$(top_builddir)/contrib/cityhash102/include -I$(top_builddir)/contrib/libfarmhash
libUCore_la_SOURCES = UniSetTypes_iSK.cc UniSetObject_iSK.cc UniSetTypes.cc \
UniSetManager_iSK.cc UniSetObject.cc UniSetManager.cc UniSetActivator.cc \
Configuration.cc MessageType.cc UInterface.cc
......
......@@ -25,6 +25,8 @@
#include <Poco/File.h>
#include "UniSetTypes.h"
#include "Configuration.h"
#include "city.h"
#include "farmhash.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace uniset;
......@@ -741,3 +743,22 @@ uniset::KeyType uniset::key( const IOController_i::SensorInfo& si )
return key(si.id, si.node);
}
// ---------------------------------------------------------------------------------------------------------------
uint64_t uniset::hash64( const std::string& str ) noexcept
{
return CityHash_v1_0_2::CityHash64(str.data(), str.size());
}
uint64_t uniset::hash64( const char* buf, size_t sz ) noexcept
{
return CityHash_v1_0_2::CityHash64(buf, sz);
}
// ---------------------------------------------------------------------------------------------------------------
uint32_t uniset::hash32( const std::string& str ) noexcept
{
return NAMESPACE_FOR_HASH_FUNCTIONS::Hash32(str.data(), str.size());
}
uint32_t uniset::hash32( const char* buf, size_t sz ) noexcept
{
return NAMESPACE_FOR_HASH_FUNCTIONS::Hash32(buf, sz);
}
noinst_LTLIBRARIES = libObjectsRepository.la
libObjectsRepository_la_SOURCES = ObjectIndex.cc ObjectIndex_Array.cc ObjectIndex_XML.cc ObjectIndex_idXML.cc \
ORepHelpers.cc ObjectRepository.cc IORFile.cc
ORepHelpers.cc ObjectRepository.cc IORFile.cc ObjectIndex_hashXML.cc
# ServiceActivator.cc
include $(top_builddir)/include.mk
......@@ -24,9 +24,10 @@
#include "Configuration.h"
// -----------------------------------------------------------------------------------------
using namespace uniset;
using namespace std;
// -----------------------------------------------------------------------------------------
namespace uniset {
// -----------------------------------------------------------------------------------------
ObjectIndex_Array::~ObjectIndex_Array()
{
......@@ -119,3 +120,5 @@ const ObjectInfo* ObjectIndex_Array::getObjectInfo( const std::string& name ) co
return NULL;
}
// ------------------------------------------------------------------------------------------
} // end of namespace uniset
// ------------------------------------------------------------------------------------------
......@@ -21,9 +21,10 @@
#include "Configuration.h"
// -----------------------------------------------------------------------------------------
using namespace uniset;
using namespace std;
// -----------------------------------------------------------------------------------------
namespace uniset {
// -----------------------------------------------------------------------------------------
ObjectIndex_XML::ObjectIndex_XML(const string& xmlfile, size_t minSize )
{
omap.reserve(minSize);
......@@ -299,3 +300,5 @@ const ObjectInfo* ObjectIndex_XML::getObjectInfo( const std::string& name ) cons
return nullptr;
}
// ------------------------------------------------------------------------------------------
} // end of namespace uniset
// ------------------------------------------------------------------------------------------
/*
* Copyright (c) 2020 Pavel Vainerman.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, version 2.1.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// -----------------------------------------------------------------------------------------
#include <sstream>
#include <iomanip>
#include "ORepHelpers.h"
#include "Configuration.h"
#include "ObjectIndex_hashXML.h"
#include "UniSetTypes.h"
// -----------------------------------------------------------------------------------------
using namespace std;
// -----------------------------------------------------------------------------------------
namespace uniset
{
// -----------------------------------------------------------------------------------------
ObjectIndex_hashXML::ObjectIndex_hashXML( const string& xmlfile )
{
auto xml = make_shared<UniXML>();
// try
// {
xml->open(xmlfile);
build(xml);
// }
// catch(...){}
}
// -----------------------------------------------------------------------------------------
ObjectIndex_hashXML::ObjectIndex_hashXML( const shared_ptr<UniXML>& xml )
{
build(xml);
}
// -----------------------------------------------------------------------------------------
ObjectIndex_hashXML::~ObjectIndex_hashXML()
{
}
// -----------------------------------------------------------------------------------------
ObjectId ObjectIndex_hashXML::getIdByName( const string& name ) const noexcept
{
try
{
auto it = mok.find(name);
if( it != mok.end() )
return it->second;
}
catch(...) {}
return DefaultObjectId;
}
// -----------------------------------------------------------------------------------------
string ObjectIndex_hashXML::getMapName( const ObjectId id ) const noexcept
{
try
{
auto it = omap.find(id);
if( it != omap.end() )
return it->second.repName;
}
catch(...) {}
return "";
}
// -----------------------------------------------------------------------------------------
string ObjectIndex_hashXML::getTextName( const ObjectId id ) const noexcept
{
try
{
auto it = omap.find(id);
if( it != omap.end() )
return it->second.textName;
}
catch(...) {}
return "";
}
// -----------------------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& os, ObjectIndex_hashXML& oi )
{
return oi.printMap(os);
}
// -----------------------------------------------------------------------------------------
std::ostream& ObjectIndex_hashXML::printMap( std::ostream& os ) const noexcept
{
os << "size: " << omap.size() << endl;
for( auto it = omap.begin(); it != omap.end(); ++it )
{
if( it->second.repName.empty() )
continue;
os << setw(5) << it->second.id << " "
// << setw(45) << ORepHelpers::getShortName(it->repName,'/')
<< setw(45) << it->second.repName
<< " " << it->second.textName << endl;
}
return os;
}
// -----------------------------------------------------------------------------------------
void ObjectIndex_hashXML::build( const shared_ptr<UniXML>& xml )
{
read_section(xml, "sensors");
read_section(xml, "objects");
read_section(xml, "controllers");
read_section(xml, "services");
read_nodes(xml, "nodes");
}
// ------------------------------------------------------------------------------------------
void ObjectIndex_hashXML::read_section( const std::shared_ptr<UniXML>& xml, const std::string& sec )
{
string secRoot = xml->getProp( xml->findNode(xml->getFirstNode(), "RootSection"), "name");
if( secRoot.empty() )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build):: не нашли параметр RootSection в конф. файле ";
ucrit << msg.str() << endl;
throw SystemError(msg.str());
}
xmlNode* root( xml->findNode(xml->getFirstNode(), sec) );
if( !root )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build): не нашли корневого раздела " << sec;
throw NameNotFound(msg.str());
}
// Считываем список элементов
UniXML::iterator it(root);
if( !it.goChildren() )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build): не удалось перейти к списку элементов " << sec;
throw NameNotFound(msg.str());
}
string secname = xml->getProp(root, "section");
if( secname.empty() )
secname = xml->getProp(root, "name");
if( secname.empty() )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build): у секции " << sec << " не указано свойство 'name' ";
throw NameNotFound(msg.str());
}
// прибавим корень
secname = secRoot + "/" + secname + "/";
for( ; it.getCurrent(); it.goNext() )
{
if( !it.getProp("id").empty() )
{
ostringstream err;
err << "(ObjectIndex_hashXML): ERROR in " << xml->getFileName() << " format: Don`t use id='xxx' or use flag 'idfromfile' in <ObjectsMap idfromfile='1'>";
throw uniset::SystemError(err.str());
}
ObjectInfo inf;
const std::string nm = it.getProp("name");
if( nm.empty() )
{
ostringstream err;
err << "Unknown name fot item (section '" << secname << "'). User name='xxx'";
throw uniset::SystemError(err.str());
}
inf.id = uniset::hash32(nm);
// name
ostringstream n;
n << secname << nm;
const string name(n.str());
inf.repName = name;
string textname(xml->getProp(it, "textname"));
if( textname.empty() )
textname = nm;
inf.textName = textname;
inf.xmlnode = it;
auto mret = mok.emplace(name, inf.id);
if( !mret.second )
{
ostringstream err;
err << "Object name collision. The '" << nm << "' already exists.";
throw uniset::SystemError(err.str());
}
auto ret = omap.emplace(inf.id, std::move(inf));
if( !ret.second )
{
ostringstream err;
err << "ObjectID collision. The '" << nm << "' already exists.";
throw uniset::SystemError(err.str());
}
}
}
// ------------------------------------------------------------------------------------------
void ObjectIndex_hashXML::read_nodes( const std::shared_ptr<UniXML>& xml, const std::string& sec )
{
xmlNode* root( xml->findNode(xml->getFirstNode(), sec) );
if( !root )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build): не нашли корневого раздела " << sec;
throw NameNotFound(msg.str());
}
// Считываем список элементов
UniXML::iterator it(root);
if( !it.goChildren() )
{
ostringstream msg;
msg << "(ObjectIndex_hashXML::build): не удалось перейти к списку элементов "
<< " секция " << sec;
throw NameNotFound(msg.str());
}
for( ; it.getCurrent(); it.goNext() )
{
ObjectInfo inf;
if( !it.getProp("id").empty() )
{
ostringstream err;
err << "(ObjectIndex_hashXML): ERROR in " << xml->getFileName() << " format: Don`t use id='xxx' or use flag 'idfromfile' in <ObjectsMap idfromfile='1'>";
throw uniset::SystemError(err.str());
}
const string name(it.getProp("name"));
inf.id = uniset::hash32(name);
inf.repName = name;
// textname
string textname(xml->getProp(it, "textname"));
if( textname.empty() )
textname = name;
inf.textName = textname;
inf.xmlnode = it;
auto ret = omap.emplace(inf.id, inf);
if( !ret.second )
{
ostringstream err;
err << "node ObjectID collision. The '" << name << "' already exists.";
throw uniset::SystemError(err.str());
}
auto mret = mok.emplace(name, inf.id);
if( !mret.second )
{
ostringstream err;
err << "Node name collision. The '" << name << "' already exists.";
throw uniset::SystemError(err.str());
}
}
}
// ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_hashXML::getObjectInfo( const ObjectId id ) const noexcept
{
try
{
auto it = omap.find(id);
if( it != omap.end() )
return &(it->second);
}
catch(...) {}
return nullptr;
}
// ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_hashXML::getObjectInfo( const std::string& name ) const noexcept
{
try
{
auto it = mok.find(name);
if( it != mok.end() )
return getObjectInfo(it->second);
}
catch(...) {}
return nullptr;
}
// ------------------------------------------------------------------------------------------
} // end of namespace uniset
// ------------------------------------------------------------------------------------------
......@@ -20,9 +20,10 @@
#include "Configuration.h"
#include "ObjectIndex_idXML.h"
// -----------------------------------------------------------------------------------------
using namespace uniset;
using namespace std;
// -----------------------------------------------------------------------------------------
namespace uniset {
// -----------------------------------------------------------------------------------------
ObjectIndex_idXML::ObjectIndex_idXML( const string& xmlfile )
{
auto xml = make_shared<UniXML>();
......@@ -275,3 +276,5 @@ const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const std::string& name ) co
return nullptr;
}
// ------------------------------------------------------------------------------------------
} // end of namespace uniset
// ------------------------------------------------------------------------------------------
......@@ -29,12 +29,13 @@ test_logserver.cc \
test_tcpcheck.cc \
test_utcpsocket.cc \
test_iocontroller_types.cc \
test_debugstream.cc
test_debugstream.cc \
test_oindex_hash.cc
#test_uhttp.cc
tests_with_conf_LDADD = $(top_builddir)/lib/libUniSet2.la
tests_with_conf_CPPFLAGS = -I$(top_builddir)/include
tests_with_conf_LDADD = $(top_builddir)/lib/libUniSet2.la $(top_builddir)/contrib/cityhash102/libCityHash102.la $(top_builddir)/contrib/libfarmhash/libFarmHash.la
tests_with_conf_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/contrib/cityhash102/include -I$(top_builddir)/contrib/libfarmhash
tests_with_conf_SOURCES = tests_with_conf.cc \
test_conftest.cc \
test_ui.cc \
......
#include <catch.hpp>
// -----------------------------------------------------------------------------
#include <iostream>
#include <sstream>
// -----------------------------------------------------------------------------
#include "Exceptions.h"
#include "ObjectIndex_hashXML.h"
#include "UniSetTypes.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace uniset;
// -----------------------------------------------------------------------------
TEST_CASE("ObjectIndexHash", "[oindex_hash][basic]" )
{
ObjectIndex_hashXML oi("tests_oindex_hash_config.xml");
REQUIRE( oi.getIdByName("UNISET_PLC/Sensors/Input1_S") == uniset::hash32("Input1_S") );
REQUIRE( oi.getIdByName("UNISET_PLC/Sensors/Input2_S") == uniset::hash32("Input2_S") );
}
// -----------------------------------------------------------------------------
TEST_CASE("ObjectIndexHash: collision", "[oindex_hash][base][collision]" )
{
REQUIRE_THROWS_AS( ObjectIndex_hashXML("tests_oindex_hash_collision_config.xml"), uniset::SystemError& );
}
......@@ -406,3 +406,18 @@ TEST_CASE("UniSetTypes: ios_fmt_restorer", "[utypes][ios_fmt_restorer]" )
REQUIRE( s.str() == " 5" );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: hash64", "[utypes][hash64]" )
{
REQUIRE( uniset::hash64("test") == uint64_t(17703940110308125106) );
REQUIRE( uniset::hash64("test2") == uint64_t(11165864767333097451) );
REQUIRE( uniset::hash64("2tset") == uint64_t(15246161741804761271) );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: hash32", "[utypes][hash32]" )
{
REQUIRE( sizeof(uniset::ObjectId) == sizeof(uint32_t) );
REQUIRE( uniset::hash32("test") == uint32_t(168770635) );
REQUIRE( uniset::hash32("test2") == uint32_t(4018550908) );
REQUIRE( uniset::hash32("2tset") == uint32_t(1660083104) );
}
// -----------------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment