zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #13047
[Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
Paul J. Lucas has proposed merging lp:~zorba-coders/zorba/feature-uuid into lp:zorba.
Requested reviews:
Rodolfo Ochoa (rodolfo-ochoa)
Matthias Brantner (matthias-brantner)
Paul J. Lucas (paul-lucas)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/feature-uuid/+merge/118268
Replaced UUID with thin layer over native platform implementation.
--
https://code.launchpad.net/~zorba-coders/zorba/feature-uuid/+merge/118268
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'CMakeCompiler.txt'
--- CMakeCompiler.txt 2012-07-24 08:48:48 +0000
+++ CMakeCompiler.txt 2012-08-05 16:45:25 +0000
@@ -234,3 +234,13 @@
ENDIF (NOT CMAKE_C_FLAGS MATCHES "-fvisibility")
ENDIF ( ZORBA_GNUCOMPILER_MAJOR_VERSION GREATER 3 )
ENDIF(CMAKE_COMPILER_IS_GNUCC)
+
+IF (APPLE)
+ # Needed for CFUUID*() functions in util/uuid.c.
+ SET(CMAKE_SHARED_LINKER_FLAGS "-framework CoreFoundation ${CMAKE_SHARED_LINKER_FLAGS}")
+ELSEIF (WIN32)
+ SET(requiredlibs ${requiredlibs} "Rpcrt4")
+ELSEIF (ZORBA_HAVE_UUID_H)
+ # Needed for uuid_generate() function in util/uuid.c.
+ SET(CMAKE_SHARED_LINKER_FLAGS "-luuid ${CMAKE_SHARED_LINKER_FLAGS}")
+ENDIF (ZORBA_HAVE_UUID_H)
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2012-07-24 08:48:48 +0000
+++ CMakeLists.txt 2012-08-05 16:45:25 +0000
@@ -101,6 +101,7 @@
CHECK_INCLUDE_FILES ("execinfo.h" ZORBA_HAVE_EXECINFO_H)
ENDIF (NOT APPLE OR ${CMAKE_SYSTEM_VERSION} VERSION_GREATER "10.4")
CHECK_INCLUDE_FILE_CXX ("FlexLexer.h" ZORBA_HAVE_FLEXLEXER_H)
+CHECK_INCLUDE_FILES ("uuid/uuid.h" ZORBA_HAVE_UUID_H)
CHECK_FUNCTION_EXISTS (strtof ZORBA_HAVE_STRTOF_FUNCTION)
CHECK_FUNCTION_EXISTS (strtoll ZORBA_HAVE_STRTOLL_FUNCTION)
=== modified file 'include/zorba/config.h.cmake'
--- include/zorba/config.h.cmake 2012-07-24 08:48:48 +0000
+++ include/zorba/config.h.cmake 2012-08-05 16:45:25 +0000
@@ -52,6 +52,7 @@
#cmakedefine ZORBA_HAVE_SYS_TYPES_H
#cmakedefine ZORBA_HAVE_USTRING_H
#cmakedefine ZORBA_HAVE_UTYPES_H
+#cmakedefine ZORBA_HAVE_UUID_H
// Platform functions
#cmakedefine ZORBA_HAVE_CLOCKGETTIME_FUNCTION
=== modified file 'src/runtime/random/random_impl.cpp'
--- src/runtime/random/random_impl.cpp 2012-07-24 08:48:48 +0000
+++ src/runtime/random/random_impl.cpp 2012-08-05 16:45:25 +0000
@@ -15,6 +15,14 @@
*/
#include "stdafx.h"
+#include <sstream>
+
+#ifdef WIN32
+# include <Winsock2.h>
+#else
+# include <arpa/inet.h>
+#endif /* WIN32 */
+
#include "system/globalenv.h"
#include "runtime/random/random.h"
@@ -27,7 +35,7 @@
#include <zorba/util/time.h>
#include <limits>
-#include "util/uuid/uuid.h"
+#include "util/uuid.h"
namespace zorba {
@@ -104,6 +112,7 @@
store::Item_t num;
unsigned int int_seed;
long walltime_millis;
+ uint32_t time_low;
zstring ltmp;
RandomIteratorState* state;
@@ -125,11 +134,12 @@
time::get_current_walltime( lCurrWallTime );
walltime_millis = time::get_walltime_in_millis( lCurrWallTime );
- uuid_t u;
- memset(&u, 0, sizeof(uuid_t));
- uuid_create(&u);
-
- walltime_millis += u.time_low;
+ uuid u;
+ uuid::create(&u);
+ time_low = ntohl(
+ (u.data[0] << 24) | (u.data[1] << 16) | (u.data[2] << 8) | u.data[3]
+ );
+ walltime_millis += time_low;
int_seed = walltime_millis % std::numeric_limits<unsigned int>::max();
@@ -151,16 +161,16 @@
UuidIterator::nextImpl(store::Item_t& result, PlanState& planState) const
{
store::Item_t item;
- uuid_t u;
+ uuid u;
zstring uuidStr;
+ std::ostringstream oss;
PlanIteratorState* state;
DEFAULT_STACK_INIT(PlanIteratorState, state, planState);
- memset(&u, 0, sizeof(uuid_t));
-
- uuid_create(&u);
- uuidStr = uuidToString(u);
+ uuid::create(&u);
+ oss << u;
+ uuidStr = oss.str();
GENV_ITEMFACTORY->createString(result, uuidStr);
STACK_PUSH(true, state);
=== modified file 'src/store/naive/simple_store.cpp'
--- src/store/naive/simple_store.cpp 2012-07-24 08:48:48 +0000
+++ src/store/naive/simple_store.cpp 2012-08-05 16:45:25 +0000
@@ -15,6 +15,8 @@
*/
#include "stdafx.h"
+#include <sstream>
+
#include "simple_store.h"
#include "store_defs.h"
@@ -30,7 +32,7 @@
#include "diagnostics/diagnostic.h"
#include <zorba/diagnostic_list.h>
-#include "util/uuid/uuid.h"
+#include "util/uuid.h"
#include "zorbautils/string_util.h"
#ifdef ZORBA_WITH_JSON
@@ -288,9 +290,11 @@
return theItemFactory->createAnyURI(result, id);
}
- uuid_t uuid;
- uuid_create(&uuid);
- zstring uuidStr = uuidToURI(uuid);
+ uuid u;
+ uuid::create(&u);
+ std::ostringstream oss;
+ oss << "urn:uuid:" << u;
+ zstring uuidStr = oss.str();
assignReference(xmlNode, uuidStr);
=== modified file 'src/store/naive/store.cpp'
--- src/store/naive/store.cpp 2012-07-24 08:48:48 +0000
+++ src/store/naive/store.cpp 2012-08-05 16:45:25 +0000
@@ -58,7 +58,6 @@
#include "tree_id_generator.h"
#include "util/cxx_util.h"
-#include "util/uuid/uuid.h"
#include "zorbautils/string_util.h"
#ifndef ZORBA_NO_FULL_TEXT
=== modified file 'src/unit_tests/CMakeLists.txt'
--- src/unit_tests/CMakeLists.txt 2012-07-24 08:48:48 +0000
+++ src/unit_tests/CMakeLists.txt 2012-08-05 16:45:25 +0000
@@ -20,6 +20,7 @@
test_json_parser.cpp
test_string.cpp
test_uri.cpp
+ test_uuid.cpp
unit_tests.cpp
)
=== added file 'src/unit_tests/test_uuid.cpp'
--- src/unit_tests/test_uuid.cpp 1970-01-01 00:00:00 +0000
+++ src/unit_tests/test_uuid.cpp 2012-08-05 16:45:25 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2006-2010 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "stdafx.h"
+#include <iostream>
+
+#include "util/uuid.h"
+
+using namespace std;
+using namespace zorba;
+
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+
+namespace zorba {
+namespace UnitTests {
+
+int test_uuid( int argc, char *argv[] ) {
+ uuid u;
+ uuid::create( &u );
+ cout << u << endl;
+ return 0;
+}
+
+} // namespace UnitTests
+} // namespace zorba
+
+/* vim:set et sw=2 ts=2: */
=== modified file 'src/unit_tests/unit_test_list.h'
--- src/unit_tests/unit_test_list.h 2012-07-24 08:48:48 +0000
+++ src/unit_tests/unit_test_list.h 2012-08-05 16:45:25 +0000
@@ -42,6 +42,7 @@
#ifndef ZORBA_HAVE_UNIQUE_PTR
int test_unique_ptr( int, char*[] );
#endif /* ZORBA_HAVE_UNIQUE_PTR */
+ int test_uuid( int, char*[] );
#ifndef ZORBA_HAVE_UNORDERED_MAP
int test_unordered_map( int, char*[] );
#endif /* ZORBA_HAVE_UNORDERED_MAP */
=== modified file 'src/unit_tests/unit_tests.cpp'
--- src/unit_tests/unit_tests.cpp 2012-07-24 08:48:48 +0000
+++ src/unit_tests/unit_tests.cpp 2012-08-05 16:45:25 +0000
@@ -53,6 +53,7 @@
#ifndef ZORBA_HAVE_UNIQUE_PTR
libunittests["unique_ptr"] = test_unique_ptr;
#endif /* ZORBA_HAVE_UNIQUE_PTR */
+ libunittests["uuid"] = test_uuid;
#ifndef ZORBA_HAVE_UNORDERED_MAP
libunittests["unordered_map"] = test_unordered_map;
#endif /* ZORBA_HAVE_UNORDERED_MAP */
=== modified file 'src/util/CMakeLists.txt'
--- src/util/CMakeLists.txt 2012-07-25 23:20:47 +0000
+++ src/util/CMakeLists.txt 2012-08-05 16:45:25 +0000
@@ -29,11 +29,10 @@
unicode_categories.cpp
uri_util.cpp
utf8_util.cpp
+ uuid.cpp
xml_util.cpp
fx/fxcharheap.cpp
string/empty_rep_base.cpp
- uuid/sysdep.cpp
- uuid/uuid.cpp
http_util.h
http_util.cpp)
=== removed directory 'src/util/uuid'
=== added file 'src/util/uuid.cpp'
--- src/util/uuid.cpp 1970-01-01 00:00:00 +0000
+++ src/util/uuid.cpp 2012-08-05 16:45:25 +0000
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <zorba/config.h>
+
+#ifdef _WIN32
+# include <Winsock2.h> /* for ntohl(3) */
+#else
+# include <arpa/inet.h> /* for ntohl(3) */
+#endif /* WIN32 */
+
+#include <cstdio> /* for sprintf(3) */
+
+#if defined( __APPLE__ )
+# include <cstring> /* for memcpy(3) */
+# include <CoreFoundation/CoreFoundation.h>
+#elif defined( ZORBA_HAVE_UUID_H )
+# include <uuid/uuid.h>
+#elif defined( _WIN32 )
+# include <Rpc.h>
+#else
+# error "Unsupported operating system for generating UUIDs"
+#endif
+
+#include "uuid.h"
+
+using namespace std;
+
+namespace zorba {
+
+///////////////////////////////////////////////////////////////////////////////
+
+void uuid::create( uuid *result ) {
+#if defined( __APPLE__ )
+ CFUUIDRef uuid_ref = CFUUIDCreate( NULL );
+ CFUUIDBytes uuid_bytes = CFUUIDGetUUIDBytes( uuid_ref );
+ CFRelease( uuid_ref );
+ ::memcpy( result->data, &uuid_bytes, sizeof result->data );
+#elif defined( ZORBA_HAVE_UUID_H )
+ uuid_generate( result->data );
+#elif defined( _WIN32 )
+ UuidCreateSequential( (UUID*)result->data );
+#endif /* _WIN32 */
+}
+
+uuid::variant uuid::get_variant() const {
+ value_type const octet8 = data[8];
+ if ( (octet8 & 0x80u) == 0x00u )
+ return ncs;
+ if ( (octet8 & 0xC0u) == 0x80u )
+ return rfc4122;
+ if ( (octet8 & 0xE0u) == 0xC0u )
+ return microsoft;
+ return future;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+ostream& operator<<( ostream &os, uuid const &u ) {
+ uint32_t const time_low = ntohl(
+ (u.data[0] << 24) | (u.data[1] << 16) | (u.data[2] << 8) | u.data[3]
+ );
+ uint16_t const time_mid = ntohs( (u.data[4] << 8) | u.data[5] );
+ uint16_t const time_hi_and_version = ntohs( (u.data[6] << 8) | u.data[7] );
+ uint8_t const clock_seq_hi_and_reserved = u.data[8];
+ uint8_t const clock_seq_low = u.data[9];
+ uuid::value_type const *const node = u.data + 10;
+ char buf[37];
+ sprintf(
+ buf, "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
+ time_low, time_mid, time_hi_and_version, clock_seq_hi_and_reserved,
+ clock_seq_low, node[0], node[1], node[2], node[3], node[4], node[5]
+ );
+ return os << buf;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+} // namespace zorba
+
+/*
+ * Local variables:
+ * mode: c++
+ * End:
+ */
+/* vim:set et sw=2 ts=2: */
=== added file 'src/util/uuid.h'
--- src/util/uuid.h 1970-01-01 00:00:00 +0000
+++ src/util/uuid.h 2012-08-05 16:45:25 +0000
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#ifndef ZORBA_UUID_H
+#define ZORBA_UUID_H
+
+#include <algorithm>
+#include <iostream>
+#include <sys/types.h>
+
+#include "zorbatypes/zstring.h"
+
+namespace zorba {
+
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * A %uuid contains the raw bytes for a UUID. Note that this is intentially a
+ * \c struct with no constructors, no destructor, and no user-defined
+ * assignment operators so that it remains a POD.
+ */
+struct uuid {
+ typedef uint8_t value_type;
+ typedef value_type& reference;
+ typedef value_type const& const_reference;
+ typedef value_type* pointer;
+ typedef value_type const* const_pointer;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ typedef pointer iterator;
+ typedef const_pointer const_iterator;
+
+ enum variant {
+ ncs, ///< NCS backward compatibility
+ rfc4122, ///< RFC 4122
+ microsoft, ///< Microsoft compatibility
+ future ///< Reserved for future use
+ };
+
+ enum version {
+ unknown,
+ time_based = 0x10,
+ dce_security = 0x20,
+ name_based_md5 = 0x30,
+ random_number_based = 0x40,
+ name_based_sha1 = 0x50
+ };
+
+ /**
+ * The raw UUID data.
+ */
+ value_type data[16];
+
+ /**
+ * Creates a UUID. The variant and version of the UUID created is
+ * platform-dependent.
+ *
+ * @param result A pointer to the result.
+ */
+ static void create( uuid *result );
+
+ /**
+ * Creates an iterator to the beginning of the data.
+ *
+ * @return Returns said iterator.
+ */
+ iterator begin() {
+ return data;
+ }
+
+ /**
+ * Creates a const_iterator to the beginning of the data.
+ *
+ * @return Returns said iterator.
+ */
+ const_iterator begin() const {
+ return data;
+ }
+
+ /**
+ * Creates an iterator to one past the end of the data.
+ *
+ * @return Returns said iterator.
+ */
+ iterator end() {
+ return data + size();
+ }
+
+ /**
+ * Creates a const_iterator to one past the end of the data.
+ *
+ * @return Returns said iterator.
+ */
+ const_iterator end() const {
+ return data + size();
+ }
+
+ /**
+ * Gets the size of the UUID data.
+ *
+ * @return Always returns 16.
+ */
+ size_type size() const {
+ return sizeof( data );
+ }
+
+ /**
+ * Swaps this UUID's data with that of another.
+ *
+ * @param that The other UUID to swap data with.
+ */
+ void swap( uuid &that ) {
+ std::swap_ranges( begin(), end(), that.begin() );
+ }
+
+ /**
+ * Gets the variant of this UUID.
+ *
+ * @return Returns said variant.
+ */
+ variant get_variant() const;
+
+ /**
+ * Gets the version of this UUID.
+ *
+ * @return Returns said version.
+ */
+ version get_version() const {
+ return static_cast<version>( data[6] & 0xF0u );
+ }
+};
+
+////////// Functions //////////////////////////////////////////////////////////
+
+/**
+ * Swaps two UUIDs' data.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ */
+inline void swap( uuid &u1, uuid &u2 ) {
+ u1.swap( u2 );
+}
+
+/**
+ * Compares two UUIDs for equality.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the two UUIDs are equal.
+ */
+inline bool operator==( uuid const &u1, uuid const &u2 ) {
+ return std::equal( u1.begin(), u1.end(), u2.begin() );
+}
+
+/**
+ * Compares two UUIDs for inequality.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the two UUIDs are not equal.
+ */
+inline bool operator!=( uuid const &u1, uuid const &u2 ) {
+ return !(u1 == u2);
+}
+
+/**
+ * Compares two UUIDs for less-than.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the first UUID is less than the second.
+ */
+inline bool operator<( uuid const &u1, uuid const &u2 ) {
+ return std::lexicographical_compare(
+ u1.begin(), u1.end(), u2.begin(), u2.end()
+ );
+}
+
+/**
+ * Compares two UUIDs for less-than-or-equal-to.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the first UUID is less than or equal to the
+ * second.
+ */
+inline bool operator<=( uuid const &u1, uuid const &u2 ) {
+ return !(u2 < u1);
+}
+
+/**
+ * Compares two UUIDs for greater-than.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the first UUID is greater than the second.
+ */
+inline bool operator>( uuid const &u1, uuid const &u2 ) {
+ return u2 < u1;
+}
+
+/**
+ * Compares two UUIDs for greater-than-or-equal-to.
+ *
+ * @param u1 The first UUID.
+ * @param u2 The second UUID.
+ * @return Returns \c true only if the first UUID is greater than or equal to
+ * the second.
+ */
+inline bool operator>=( uuid const &u1, uuid const &u2 ) {
+ return !(u1 < u2);
+}
+
+/**
+ * Emits the given UUID to the given ostream in canonical UUID format.
+ *
+ * @param os The ostream to emit to.
+ * @param u The UUID to emit.
+ * @return Returns \a os.
+ */
+std::ostream& operator<<( std::ostream &os, uuid const &u );
+
+///////////////////////////////////////////////////////////////////////////////
+
+} // namespace zorba
+
+#endif /* ZORBA_UUID_H */
+/*
+ * Local variables:
+ * mode: c++
+ * End:
+ */
+/* vim:set et sw=2 ts=2: */
=== removed file 'src/util/uuid/sysdep.cpp'
--- src/util/uuid/sysdep.cpp 2012-07-24 08:48:48 +0000
+++ src/util/uuid/sysdep.cpp 1970-01-01 00:00:00 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "stdafx.h"
-
-#include "sysdep.h"
-
-namespace zorba {
-/* system dependent call to get the current system time. Returned as
- 100ns ticks since UUID epoch, but resolution may be less than
- 100ns. */
-#ifdef WIN32
-
-void get_system_time(xs_unsignedLong *uuid_time)
-{
- ULARGE_INTEGER time;
-
- /* NT keeps time in FILETIME format which is 100ns ticks since
- Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582.
- The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec)
- + 18 years and 5 leap days, meaning P6653D*/
- GetSystemTimeAsFileTime((FILETIME *)&time);
- time.QuadPart += (xs_unsignedLong) (1000*1000*10) // seconds
- * (xs_unsignedLong) (60 * 60 * 24) // days
- * (xs_unsignedLong) (17+30+31+365*18+5); // 6653 of days
- *uuid_time = time.QuadPart;
-}
-
-#else
-
-void get_system_time(xs_unsignedLong *uuid_time)
-{
- struct timeval tp;
-
- gettimeofday(&tp, (struct timezone *)0);
-
- /* Offset between UUID formatted times and Unix formatted times.
- UUID UTC base time is October 15, 1582.
- Unix base time is January 1, 1970, meaning P141427D*/
- *uuid_time = ((xs_unsignedLong)tp.tv_sec * 10000000)
- + ((xs_unsignedLong)tp.tv_usec * 10)
- + I64(0x01B21DD213814000);
-}
-
-#endif
-}/*namespace zorba*/
-/* vim:set et sw=2 ts=2: */
=== removed file 'src/util/uuid/sysdep.h'
--- src/util/uuid/sysdep.h 2012-07-24 08:48:48 +0000
+++ src/util/uuid/sysdep.h 1970-01-01 00:00:00 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ZORBA_UTIL_UUID_SYSDEP_H
-#define ZORBA_UTIL_UUID_SYSDEP_H
-
-#include "zorbatypes/schema_types.h"
-
-#ifdef WIN32
- #include <windows.h>
-#else
- #include <sys/types.h>
- #include <sys/time.h>
-#endif
-
-/* Set the following to a calls to get and release a global lock */
-#define LOCK
-#define UNLOCK
-
-// /* Set this to what your compiler uses for 64-bit data type */
-#ifdef WIN32
- #define unsigned64_t unsigned __int64
- #define I64(C) C
-#else
- #define unsigned64_t unsigned long long
- #define I64(C) C##LL
-#endif
-
-namespace zorba {
-
-/* set the following to the number of 100ns ticks of the actual
-resolution of your system's clock */
-#define UUIDS_PER_TICK 1024
-
-typedef struct {
- char nodeID[6];
-} uuid_node_t;
-
-void get_system_time(xs_unsignedLong *uuid_time);
-
-}/*namespace zorba*/
-
-#endif /* ZORBA_UTIL_UUID_SYSDEP_H */
-/* vim:set et sw=2 ts=2: */
=== removed file 'src/util/uuid/uuid.cpp'
--- src/util/uuid/uuid.cpp 2012-07-24 08:48:48 +0000
+++ src/util/uuid/uuid.cpp 1970-01-01 00:00:00 +0000
@@ -1,297 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "stdafx.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "util/uuid/sysdep.h"
-#include "util/uuid/uuid.h"
-#include "util/fs_util.h"
-
-namespace zorba {
-
-/* various forward declarations */
-static int read_state(xs_short *clockseq, xs_unsignedLong *timestamp,
- uuid_node_t *node);
-static void write_state(xs_short clockseq, xs_unsignedLong timestamp,
- uuid_node_t node);
-static void format_uuid_v1(uuid_t *uuid, xs_short clockseq,
- xs_unsignedLong timestamp, uuid_node_t node);
-static void get_current_time(xs_unsignedLong *timestamp);
-static xs_short true_random(void);
-
-int uuid_create(uuid_t *uuid)
-{
- xs_unsignedLong timestamp, last_time;
- xs_short clockseq;
- uuid_node_t node;
- memset(&node, 0, sizeof(uuid_node_t));
- uuid_node_t last_node;
- memset(&last_node, 0, sizeof(uuid_node_t));
- int f;
-
- //acquire system-wide lock so we're alone
- LOCK;
- //get time, node ID, saved state from non-volatile storage
- get_current_time(×tamp);
-// get_ieee_node_identifier(&node);
- f = read_state(&clockseq, &last_time, &last_node);
-
- //if no NV state, or if clock went backwards, or node ID
- //changed (e.g., new network card) change clockseq
- if (!f || memcmp(&node, &last_node, sizeof node))
- clockseq = true_random();
- else if (timestamp < last_time)
- clockseq++;
-
- //save the state for next time
- write_state(clockseq, timestamp, node);
-
- UNLOCK;
-
- //stuff fields into the UUID
- format_uuid_v1(uuid, clockseq, timestamp, node);
- return 1;
-}
-
-/* format_uuid_v1 -- make a UUID from the timestamp, clockseq,
- and node ID */
-void format_uuid_v1(uuid_t* uuid, xs_short clock_seq,
- xs_unsignedLong timestamp, uuid_node_t node)
-{
- //Construct a version 1 uuid with the information we've gathered plus a few constants.
- uuid->time_low = (xs_unsignedInt)(timestamp & 0xFFFFFFFF);
- uuid->time_mid = (xs_unsignedShort)((timestamp >> 32) & 0xFFFF);
- uuid->time_hi_and_version =(xs_unsignedShort)((timestamp >> 48) & 0x0FFF);
- uuid->time_hi_and_version |= (1 << 12);
- uuid->clock_seq_low = clock_seq & 0xFF;
- uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8;
- uuid->clock_seq_hi_and_reserved |= 0x80;
- memcpy(&uuid->node, &node, sizeof uuid->node);
-}
-
-/* data type for UUID generator persistent state */
-typedef struct {
- xs_unsignedLong ts; // saved timestamp
- uuid_node_t node; // saved node ID
- xs_short cs; // saved clock sequence
-} uuid_state;
-
-static uuid_state st;
-
-zstring get_tmp_state_name()
-{
- zstring lTmpFileName;
-#ifdef ZORBA_WITH_FILE_ACCESS
- fs::get_temp_file<zstring>(&lTmpFileName);
- lTmpFileName = lTmpFileName.substr(0, lTmpFileName.find_last_of(fs::dir_separator) + 1);
-#endif
- return lTmpFileName += "state";
-}
-
-//read_state -- read UUID generator state from non-volatile store
-int read_state(xs_short *clockseq, xs_unsignedLong *timestamp,
- uuid_node_t *node)
-{
- static int inited = 0;
- FILE *fp = 0;
-
- //only need to read state once per boot
- if (!inited) {
-#ifdef WIN32
- errno_t err = fopen_s( &fp, get_tmp_state_name().c_str(), "rb");
- if ( err != 0)
- return 0;
-#else
- fp = fopen(get_tmp_state_name().c_str(), "rb");
- if (fp == NULL)
- return 0;
-#endif
-
- size_t lReadLength = fread(&st, sizeof st, 1, fp);
- fclose(fp);
- if (lReadLength == 0)
- return 0;
- inited = 1;
- }
- *clockseq = st.cs;
- *timestamp = st.ts;
- *node = st.node;
- return 1;
-}
-
-// write_state -- save UUID generator state back to non-volatile storage
-void write_state(xs_short clockseq, xs_unsignedLong timestamp,
- uuid_node_t node)
-{
- volatile static bool inited = false;
- static xs_unsignedLong next_save;
- FILE* fp = 0;
-
- if (!inited) {
- next_save = timestamp;
- inited = 1;
- }
-
- //always save state to volatile shared state
- st.cs = clockseq;
- st.ts = timestamp;
- st.node = node;
- if (timestamp >= next_save) {
-#ifdef WIN32
- errno_t err = fopen_s( &fp, get_tmp_state_name().c_str(), "wb");
- if ( err != 0)
- return ;
-#else
- fp = fopen(get_tmp_state_name().c_str(), "wb");
- if (fp == NULL)
- return ;
-#endif
- fwrite(&st, sizeof st, 1, fp);
- fclose(fp);
- //schedule next save for 10 seconds from now
- next_save = timestamp + (10 * 10 * 1000 * 1000);
- }
-}
-
-// get-current_time -- get time as 60-bit 100ns ticks since UUID epoch.
-// Compensate for the fact that real clock resolution is less than 100ns.
-void get_current_time(xs_unsignedLong *timestamp)
-{
- static int inited = 0;
- static xs_unsignedLong time_last;
- static xs_short uuids_this_tick;
- xs_unsignedLong time_now;
-
- if (!inited) {
- get_system_time(&time_now);
- uuids_this_tick = UUIDS_PER_TICK;
- inited = 1;
- }
-
- for ( ; ; ) {
- get_system_time(&time_now);
-
- //if clock reading changed since last UUID generated
- if (time_last != time_now) {
- //reset count of uuids gen'd with this clock reading
- uuids_this_tick = 0;
- time_last = time_now;
- break;
- }
- if (uuids_this_tick < UUIDS_PER_TICK) {
- uuids_this_tick++;
- break;
- }
- //going too fast for our clock; spin
- }
- // add the count of uuids to low order bits of the clock reading
- *timestamp = time_now + uuids_this_tick;
-}
-
-// true_random -- this does not generate a crypto-quality random number.
-static xs_short true_random(void)
-{
- static int inited = 0;
- xs_unsignedLong time_now;
-
- if (!inited) {
- get_system_time(&time_now);
- time_now = time_now / UUIDS_PER_TICK;
- srand((unsigned int)
- (((time_now >> 32) ^ time_now) & 0xffffffff));
- inited = 1;
- }
-
- return rand();
-}
-
-uuid_t NameSpace_DNS = { // 6ba7b810-9dad-11d1-80b4-00c04fd430c8
- 0x6ba7b810,
- 0x9dad,
- 0x11d1,
- 0x80,
- 0xb4,
- {
- 0x00, (unsigned char)0xc0,
- 0x4f, (unsigned char)0xd4,
- 0x30, (unsigned char)0xc8
- }
-};
-
-/* uuidToString -- transform a UUID to a string*/
-zstring uuidToString(const uuid_t& u)
-{
- char lBuffer[174];
- sprintf(lBuffer, "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-9300a64ac3cd", u.time_low, u.time_mid,
- u.time_hi_and_version, u.clock_seq_hi_and_reserved,
- u.clock_seq_low);
-
- zstring lResult = lBuffer;
- return lResult;
-}
-
-/* uuidToString -- transform a UUID to a uri*/
-zstring uuidToURI(const uuid_t& u)
-{
- char lBuffer[200];
- sprintf(lBuffer, "urn:uuid:%8.8x-%4.4x-%4.4x-%2.2x%2.2x-9300a64ac3cd", u.time_low, u.time_mid,
- u.time_hi_and_version, u.clock_seq_hi_and_reserved,
- u.clock_seq_low);
-
- zstring lResult = lBuffer;
- return lResult;
-}
-
-/*
-//This appendix lists the name space IDs for some potentially
-//interesting namespaces, as initialized C structures and in the
-//string representation defined above.
-
-// Name string is a URL
-uuid_t NameSpace_URL = { // 6ba7b811-9dad-11d1-80b4-00c04fd430c8
- 0x6ba7b811,
- 0x9dad,
- 0x11d1,
- 0x80,
- 0xb4,
- {0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}
-};
-
-// Name string is an ISO OID
-uuid_t NameSpace_OID = { // 6ba7b812-9dad-11d1-80b4-00c04fd430c8
- 0x6ba7b812,
- 0x9dad,
- 0x11d1,
- 0x80,
- 0xb4,
- {0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}
-};
-
-// Name string is an X.500 DN (in DER or a text output format)
-uuid_t NameSpace_X500 = { // 6ba7b814-9dad-11d1-80b4-00c04fd430c8
- 0x6ba7b814,
- 0x9dad,
- 0x11d1,
- 0x80,
- 0xb4,
- {0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}
-};
-*/
-}
-/* vim:set et sw=2 ts=2: */
=== removed file 'src/util/uuid/uuid.h'
--- src/util/uuid/uuid.h 2012-07-24 08:48:48 +0000
+++ src/util/uuid/uuid.h 1970-01-01 00:00:00 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ZORBA_UTIL_UUID_H
-#define ZORBA_UTIL_UUID_H
-
-#undef uuid_t
-
-namespace zorba {
-
-typedef struct {
- xs_unsignedInt time_low;
- xs_unsignedShort time_mid;
- xs_unsignedShort time_hi_and_version;
- xs_unsignedByte clock_seq_hi_and_reserved;
- xs_unsignedByte clock_seq_low;
- xs_byte node[6];
-} uuid_t;
-
-/* uuid_create -- generate a UUID */
-int uuid_create(uuid_t * uuid);
-
-/* uuidToString -- transform a UUID to a string */
-zstring uuidToString(const uuid_t& uuid);
-
-/* uuidToURI -- transform a UUID to a URI-formatted string */
-zstring uuidToURI(const uuid_t& uuid);
-
-} // namespace zorba
-#endif /* ZORBA_UTIL_UUID_H */
-/* vim:set et sw=2 ts=2: */
Follow ups
-
[Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: noreply, 2012-08-31
-
[Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Zorba Build Bot, 2012-08-31
-
[Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Zorba Build Bot, 2012-08-31
-
[Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Chris Hillery, 2012-08-31
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Chris Hillery, 2012-08-31
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-28
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Chris Hillery, 2012-08-22
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Chris Hillery, 2012-08-14
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Rodolfo Ochoa, 2012-08-07
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-07
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-07
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Rodolfo Ochoa, 2012-08-06
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Matthias Brantner, 2012-08-06
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-06
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Matthias Brantner, 2012-08-06
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-05
-
Re: [Merge] lp:~zorba-coders/zorba/feature-uuid into lp:zorba
From: Paul J. Lucas, 2012-08-05