* Bugfix: Convert files to unix expected format
authorGuy Sagnes <guy.sagnes@continental-corporation.com>
Thu, 6 Mar 2014 15:37:40 +0000 (16:37 +0100)
committerGuy Sagnes <guy.sagnes@continental-corporation.com>
Thu, 6 Mar 2014 16:10:48 +0000 (17:10 +0100)
Issue reported by Ingo Hürner / Marko Hoyer

Change-Id: I0f08035f8506e0ab0b01b2d3a22d9298d3f2ed93
Signed-off-by: Guy Sagnes <guy.sagnes@continental-corporation.com>
inc/private/pers_low_level_db_access_if.h
src/pers_data_organization.c
src/pers_local_shared_db_access.c
src/pers_low_level_db_access.c
src/pers_resource_config_table.c

index c09838e..2005dfe 100644 (file)
-#ifndef PERSISTENCE_LOW_LEVEL_DB_ACCESS_H\r\r
-#define PERSISTENCE_LOW_LEVEL_DB_ACCESS_H\r\r
-\r\r
-/**********************************************************************************************************************\r\r
-*\r\r
-* Copyright (C) 2012 Continental Automotive Systems, Inc.\r\r
-*\r\r
-* Author: Ionut.Ieremie@continental-corporation.com\r\r
-*\r\r
-* Interface TODO\r\r
-*\r\r
-* The file defines the interfaces TODO\r\r
-*\r\r
-* This Source Code Form is subject to the terms of the Mozilla Public\r\r
-* License, v. 2.0. If a copy of the MPL was not distributed with this\r\r
-* file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\r
-*\r\r
-* Date       Author    Version  Reason\r\r
-* 2013.02.05 uidl9757  1.0.0.0  CSP_WZ#2220:  Adaptation for open source\r\r
-* 2013.01.03 uidl9757  1.0.0.0  CSP_WZ#2060:  Remove "cursor" interface\r\r
-* 2012.12.17 uidl9757  1.0.0.0  CSP_WZ#2060:  Changes to allow optimized access to DB\r\r
-* 2012.12.10 uidl9757  1.0.0.0  CSP_WZ#2060:  Initial version of the interface\r\r
-*\r\r
-**********************************************************************************************************************/\r\r
-\r\r
-#ifdef __cplusplus\r\r
-extern "C"\r\r
-{\r\r
-#endif  /* #ifdef __cplusplus */\r\r
-\r\r
-#include "persComTypes.h"\r\r
-\r\r
-#define PERSIST_LOW_LEVEL_DB_ACCESS_INTERFACE_VERSION  (0x03000000U)\r\r
-\r\r
-/* The supported purposes of low level DBs \r\r
- * Needed to allow different setups of DBs according to their purposes\r\r
- */\r\r
-typedef enum pers_lldb_purpose_e_\r\r
-{\r\r
-    PersLldbPurpose_RCT = 0,    /* Resource-Configuration-Table */\r\r
-    PersLldbPurpose_DB,         /* Local/Shared DB */\r\r
-    /* add new entries here */\r\r
-    PersLldbPurpose_LastEntry\r\r
-}pers_lldb_purpose_e ;\r\r
-\r\r
-\r\r
-/**\r\r
- * @brief write a key-value pair into database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param dbPathname                    [in] absolute path to DB\r\r
- * @param ePurpose                      [in] see pers_lldb_purpose_e\r\r
- * @param bForceCreationIfNotPresent    [in] if true, the DB is created if it does not exist\r\r
- *\r\r
- * @return >=0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_open(str_t const * dbPathname, pers_lldb_purpose_e ePurpose, bool_t bForceCreationIfNotPresent) ;\r\r
-\r\r
-\r\r
-/**\r\r
- * @brief write a key-value pair into database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param handlerDB     [in] handler obtained with pers_lldb_open\r\r
- *\r\r
- * @return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_close(sint_t handlerDB) ;\r\r
-\r\r
-/**\r\r
- * @brief write a key-value pair into database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- * @note : DB is created if it does not exist\r\r
- *\r\r
- * @param handlerDB     [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose      [in] see pers_lldb_purpose_e\r\r
- * @param key           [in] key's name\r\r
- * @param data          [in] buffer with key's data\r\r
- * @param dataSize      [in] size of key's data\r\r
- *\r\r
- * @return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_write_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, str_t const * data, sint_t dataSize) ;\r\r
-\r\r
-\r\r
-/**\r\r
- * @brief read a key's value from database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * @param key               [in] key's name\r\r
- * @param dataBuffer_out    [out]buffer where to return the read data\r\r
- * @param bufSize           [in] size of dataBuffer_out\r\r
- *\r\r
- * @return read size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_read_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, pstr_t dataBuffer_out, sint_t bufSize) ;\r\r
-\r\r
-/**\r\r
- * @brief read a key's value from database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * @param key               [in] key's name\r\r
- * @return key's size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_get_key_size(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key) ;\r\r
-\r\r
-/**\r\r
- * @brief delete key from database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * @param key               [in] key's name\r\r
- *\r\r
- * @return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_delete_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key) ;\r\r
-\r\r
-\r\r
-/**\r\r
- * @brief Find the buffer's size needed to accomodate the listing of keys' names in database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * @param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose          [in] see pers_lldb_purpose_e\r\r
- *\r\r
- * @return needed size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_get_size_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose) ;\r\r
-\r\r
-\r\r
-/**\r\r
- * @brief List the keys' names in database\r\r
- * @note : DB type is identified from dbPathname (based on extension)\r\r
- * @note : keys are separated by '\0'\r\r
- *\r\r
- * @param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * @param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * @param listingBuffer_out [out]buffer where to return the listing\r\r
- * @param bufSize           [in] size of listingBuffer_out\r\r
- *\r\r
- * @return listing size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
- sint_t pers_lldb_get_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose, pstr_t listingBuffer_out, sint_t bufSize) ;\r\r
-\r\r
-\r\r
-\r\r
-#ifdef __cplusplus\r\r
-}\r\r
-#endif /* extern "C" { */\r\r
-/** \} */ /* End of API */\r\r
-#endif /* PERSISTENCE_LOW_LEVEL_DB_ACCESS_H */\r\r
-\r\r
+#ifndef PERSISTENCE_LOW_LEVEL_DB_ACCESS_H
+#define PERSISTENCE_LOW_LEVEL_DB_ACCESS_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Interface TODO
+*
+* The file defines the interfaces TODO
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date       Author    Version  Reason
+* 2013.02.05 uidl9757  1.0.0.0  CSP_WZ#2220:  Adaptation for open source
+* 2013.01.03 uidl9757  1.0.0.0  CSP_WZ#2060:  Remove "cursor" interface
+* 2012.12.17 uidl9757  1.0.0.0  CSP_WZ#2060:  Changes to allow optimized access to DB
+* 2012.12.10 uidl9757  1.0.0.0  CSP_WZ#2060:  Initial version of the interface
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif  /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+
+#define PERSIST_LOW_LEVEL_DB_ACCESS_INTERFACE_VERSION  (0x03000000U)
+
+/* The supported purposes of low level DBs 
+ * Needed to allow different setups of DBs according to their purposes
+ */
+typedef enum pers_lldb_purpose_e_
+{
+    PersLldbPurpose_RCT = 0,    /* Resource-Configuration-Table */
+    PersLldbPurpose_DB,         /* Local/Shared DB */
+    /* add new entries here */
+    PersLldbPurpose_LastEntry
+}pers_lldb_purpose_e ;
+
+
+/**
+ * @brief write a key-value pair into database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param dbPathname                    [in] absolute path to DB
+ * @param ePurpose                      [in] see pers_lldb_purpose_e
+ * @param bForceCreationIfNotPresent    [in] if true, the DB is created if it does not exist
+ *
+ * @return >=0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_open(str_t const * dbPathname, pers_lldb_purpose_e ePurpose, bool_t bForceCreationIfNotPresent) ;
+
+
+/**
+ * @brief write a key-value pair into database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param handlerDB     [in] handler obtained with pers_lldb_open
+ *
+ * @return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_close(sint_t handlerDB) ;
+
+/**
+ * @brief write a key-value pair into database
+ * @note : DB type is identified from dbPathname (based on extension)
+ * @note : DB is created if it does not exist
+ *
+ * @param handlerDB     [in] handler obtained with pers_lldb_open
+ * @param ePurpose      [in] see pers_lldb_purpose_e
+ * @param key           [in] key's name
+ * @param data          [in] buffer with key's data
+ * @param dataSize      [in] size of key's data
+ *
+ * @return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_write_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, str_t const * data, sint_t dataSize) ;
+
+
+/**
+ * @brief read a key's value from database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param handlerDB         [in] handler obtained with pers_lldb_open
+ * @param ePurpose          [in] see pers_lldb_purpose_e
+ * @param key               [in] key's name
+ * @param dataBuffer_out    [out]buffer where to return the read data
+ * @param bufSize           [in] size of dataBuffer_out
+ *
+ * @return read size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_read_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, pstr_t dataBuffer_out, sint_t bufSize) ;
+
+/**
+ * @brief read a key's value from database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param handlerDB         [in] handler obtained with pers_lldb_open
+ * @param ePurpose          [in] see pers_lldb_purpose_e
+ * @param key               [in] key's name
+ * @return key's size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_get_key_size(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key) ;
+
+/**
+ * @brief delete key from database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param handlerDB         [in] handler obtained with pers_lldb_open
+ * @param ePurpose          [in] see pers_lldb_purpose_e
+ * @param key               [in] key's name
+ *
+ * @return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_delete_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key) ;
+
+
+/**
+ * @brief Find the buffer's size needed to accomodate the listing of keys' names in database
+ * @note : DB type is identified from dbPathname (based on extension)
+ *
+ * @param handlerDB         [in] handler obtained with pers_lldb_open
+ * @param ePurpose          [in] see pers_lldb_purpose_e
+ *
+ * @return needed size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_get_size_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose) ;
+
+
+/**
+ * @brief List the keys' names in database
+ * @note : DB type is identified from dbPathname (based on extension)
+ * @note : keys are separated by '\0'
+ *
+ * @param handlerDB         [in] handler obtained with pers_lldb_open
+ * @param ePurpose          [in] see pers_lldb_purpose_e
+ * @param listingBuffer_out [out]buffer where to return the listing
+ * @param bufSize           [in] size of listingBuffer_out
+ *
+ * @return listing size, or negative value in case of error (see pers_error_codes.h)
+ */
+ sint_t pers_lldb_get_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose, pstr_t listingBuffer_out, sint_t bufSize) ;
+
+
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+/** \} */ /* End of API */
+#endif /* PERSISTENCE_LOW_LEVEL_DB_ACCESS_H */
+
index 4c798e1..2290a56 100644 (file)
-/**********************************************************************************************************************\r\r
-*\r\r
-* Copyright (C) 2012 Continental Automotive Systems, Inc.\r\r
-*\r\r
-* Author: Ionut.Ieremie@continental-corporation.com\r\r
-*\r\r
-* Implementation of persComDataOrg.h\r\r
-*\r\r
-* This Source Code Form is subject to the terms of the Mozilla Public\r\r
-* License, v. 2.0. If a copy of the MPL was not distributed with this\r\r
-* file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\r
-*\r\r
-* Date             Author              Reason\r\r
-* 2012.12.10       uild9757            CSP_WZ#2798: Added gLocalFactoryDefault and gLocalConfigurableDefault\r\r
-* 2012.12.10       uild9757            CSP_WZ#388:  Initial creation\r\r
-*\r\r
-**********************************************************************************************************************/\r\r
-\r\r
-#include "persComDataOrg.h"\r\r
-\r\r
-\r\r
-\r\r
-/* resource configuration table name */\r\r
-const char* gResTableCfg = PERS_ORG_RCT_NAME_ ;\r\r
-\r\r
-/** local factory-default database */\r\r
-const char* gLocalFactoryDefault = PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_ ;\r\r
-\r
-/** local configurable-default database */\r\r
-const char* gLocalConfigurableDefault = PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_ ;\r\r
-\r\r
-/* shared cached default database */\r\r
-const char* gSharedCachedDefault = PERS_ORG_SHARED_CACHE_DEFAULT_DB_NAME_ ;\r\r
-\r\r
-/* shared cached database */\r\r
-const char* gSharedCached = PERS_ORG_SHARED_CACHE_DB_NAME_ ;\r\r
-\r\r
-/* shared write through default database */\r\r
-const char* gSharedWtDefault = PERS_ORG_SHARED_WT_DEFAULT_DB_NAME_ ;\r\r
-\r\r
-/* shared write through database */\r\r
-const char* gSharedWt = PERS_ORG_SHARED_WT_DB_NAME_ ;\r\r
-\r\r
-/* local cached default database */\r\r
-const char* gLocalCachedDefault = PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_ ;\r\r
-\r\r
-/* local cached database */\r\r
-const char* gLocalCached = PERS_ORG_LOCAL_CACHE_DB_NAME_ ;\r\r
-\r\r
-/* local write through default database */\r\r
-const char* gLocalWtDefault = PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_ ;\r\r
-\r\r
-/* local write through default database */\r\r
-const char* gLocalWt = PERS_ORG_LOCAL_WT_DB_NAME_ ;\r\r
-\r\r
-/* directory structure node name definition */\r\r
-const char* gNode = PERS_ORG_NODE_FOLDER_NAME_ ;\r\r
-\r\r
-/* directory structure user name definition */\r\r
-const char* gUser = PERS_ORG_USER_FOLDER_NAME_ ;\r\r
-\r\r
-/* directory structure seat name definition */\r\r
-const char* gSeat = PERS_ORG_SEAT_FOLDER_NAME_ ;\r\r
-\r\r
-/* directory structure shared name definition */\r\r
-const char* gSharedPathName = PERS_ORG_SHARED_FOLDER_NAME ;\r\r
-\r\r
-/* path prefix for all data */\r\r
-const char* gRootPath = PERS_ORG_ROOT_PATH ;\r\r
-\r\r
-/* path prefix for local cached database: /Data/mnt-c/<appId>/<database_name> */\r\r
-const char* gLocalCachePath = PERS_ORG_LOCAL_CACHE_PATH_FORMAT ;\r\r
-\r\r
-/* path prefix for local write through database /Data/mnt-wt/<appId>/<database_name> */\r\r
-const char* gLocalWtPath = PERS_ORG_LOCAL_WT_PATH_FORMAT ;\r\r
-\r\r
-/* path prefix for shared cached database: /Data/mnt-c/shared/group/  */\r\r
-const char* gSharedCachePathRoot = PERS_ORG_SHARED_GROUP_CACHE_PATH_ ;\r\r
-\r\r
-/* path format for shared cached database: /Data/mnt-c/shared/group/<group_no>/<database_name> */\r\r
-const char* gSharedCachePath = PERS_ORG_SHARED_CACHE_PATH_FORMAT ;\r\r
-\r\r
-/* path prefix for shared cached database: /Data/mnt-c/shared/group/<group_no>/<database_name>  */\r\r
-const char* gSharedCachePathString = PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT ;\r\r
-\r\r
-/* path prefix for shared write through database: /Data/mnt-wt/shared/group/   */\r\r
-const char* gSharedWtPathRoot = PERS_ORG_SHARED_GROUP_WT_PATH_ ;\r\r
-\r\r
-/* path prefix for shared write through database: /Data/mnt_wt/shared/group/<group_no>/<database_name> */\r\r
-const char* gSharedWtPath = PERS_ORG_SHARED_WT_PATH_FORMAT ;\r\r
-\r\r
-/* path prefix for shared write through database: /Data/mnt-wt/shared/group/<group_no>/<database_name>  */\r\r
-const char* gSharedWtPathString = PERS_ORG_SHARED_WT_PATH_STRING_FORMAT ;\r\r
-\r\r
-/* path prefix for shared public cached database: /Data/mnt-c/shared/public/<database_name>   */\r\r
-const char* gSharedPublicCachePath = PERS_ORG_SHARED_PUBLIC_CACHE_PATH_FORMAT ;\r\r
-\r\r
-/* path prefix for shared public write through database: /Data/mnt-wt/shared/public/<database_name>   */\r\r
-const char* gSharedPublicWtPath = PERS_ORG_SHARED_PUBLIC_WT_PATH_FORMAT ;\r\r
-\r\r
-\r\r
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of persComDataOrg.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date             Author              Reason
+* 2012.12.10       uild9757            CSP_WZ#2798: Added gLocalFactoryDefault and gLocalConfigurableDefault
+* 2012.12.10       uild9757            CSP_WZ#388:  Initial creation
+*
+**********************************************************************************************************************/
+
+#include "persComDataOrg.h"
+
+
+
+/* resource configuration table name */
+const char* gResTableCfg = PERS_ORG_RCT_NAME_ ;
+
+/** local factory-default database */
+const char* gLocalFactoryDefault = PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_ ;
+
+/** local configurable-default database */
+const char* gLocalConfigurableDefault = PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_ ;
+
+/* shared cached default database */
+const char* gSharedCachedDefault = PERS_ORG_SHARED_CACHE_DEFAULT_DB_NAME_ ;
+
+/* shared cached database */
+const char* gSharedCached = PERS_ORG_SHARED_CACHE_DB_NAME_ ;
+
+/* shared write through default database */
+const char* gSharedWtDefault = PERS_ORG_SHARED_WT_DEFAULT_DB_NAME_ ;
+
+/* shared write through database */
+const char* gSharedWt = PERS_ORG_SHARED_WT_DB_NAME_ ;
+
+/* local cached default database */
+const char* gLocalCachedDefault = PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_ ;
+
+/* local cached database */
+const char* gLocalCached = PERS_ORG_LOCAL_CACHE_DB_NAME_ ;
+
+/* local write through default database */
+const char* gLocalWtDefault = PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_ ;
+
+/* local write through default database */
+const char* gLocalWt = PERS_ORG_LOCAL_WT_DB_NAME_ ;
+
+/* directory structure node name definition */
+const char* gNode = PERS_ORG_NODE_FOLDER_NAME_ ;
+
+/* directory structure user name definition */
+const char* gUser = PERS_ORG_USER_FOLDER_NAME_ ;
+
+/* directory structure seat name definition */
+const char* gSeat = PERS_ORG_SEAT_FOLDER_NAME_ ;
+
+/* directory structure shared name definition */
+const char* gSharedPathName = PERS_ORG_SHARED_FOLDER_NAME ;
+
+/* path prefix for all data */
+const char* gRootPath = PERS_ORG_ROOT_PATH ;
+
+/* path prefix for local cached database: /Data/mnt-c/<appId>/<database_name> */
+const char* gLocalCachePath = PERS_ORG_LOCAL_CACHE_PATH_FORMAT ;
+
+/* path prefix for local write through database /Data/mnt-wt/<appId>/<database_name> */
+const char* gLocalWtPath = PERS_ORG_LOCAL_WT_PATH_FORMAT ;
+
+/* path prefix for shared cached database: /Data/mnt-c/shared/group/  */
+const char* gSharedCachePathRoot = PERS_ORG_SHARED_GROUP_CACHE_PATH_ ;
+
+/* path format for shared cached database: /Data/mnt-c/shared/group/<group_no>/<database_name> */
+const char* gSharedCachePath = PERS_ORG_SHARED_CACHE_PATH_FORMAT ;
+
+/* path prefix for shared cached database: /Data/mnt-c/shared/group/<group_no>/<database_name>  */
+const char* gSharedCachePathString = PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT ;
+
+/* path prefix for shared write through database: /Data/mnt-wt/shared/group/   */
+const char* gSharedWtPathRoot = PERS_ORG_SHARED_GROUP_WT_PATH_ ;
+
+/* path prefix for shared write through database: /Data/mnt_wt/shared/group/<group_no>/<database_name> */
+const char* gSharedWtPath = PERS_ORG_SHARED_WT_PATH_FORMAT ;
+
+/* path prefix for shared write through database: /Data/mnt-wt/shared/group/<group_no>/<database_name>  */
+const char* gSharedWtPathString = PERS_ORG_SHARED_WT_PATH_STRING_FORMAT ;
+
+/* path prefix for shared public cached database: /Data/mnt-c/shared/public/<database_name>   */
+const char* gSharedPublicCachePath = PERS_ORG_SHARED_PUBLIC_CACHE_PATH_FORMAT ;
+
+/* path prefix for shared public write through database: /Data/mnt-wt/shared/public/<database_name>   */
+const char* gSharedPublicWtPath = PERS_ORG_SHARED_PUBLIC_WT_PATH_FORMAT ;
+
+
index a7a4678..a74f82c 100644 (file)
-/**********************************************************************************************************************\r\r
-*\r\r
-* Copyright (C) 2012 Continental Automotive Systems, Inc.\r\r
-*\r\r
-* Author: Ionut.Ieremie@continental-corporation.com\r\r
-*\r\r
-* Implementation of persComDbAccess.h\r\r
-*\r\r
-* This Source Code Form is subject to the terms of the Mozilla Public\r\r
-* License, v. 2.0. If a copy of the MPL was not distributed with this\r\r
-* file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\r
-*\r\r
-* Date             Author              Reason\r\r
-* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source\r\r
-* 2013.01.03       uidl9757            CSP_WZ#2060:  Remove "cursor" interface\r\r
-* 2012.12.17       uidl9757            CSP_WZ#2060:  Changes to allow optimized access to DB\r\r
-* 2012.12.10       uidl9757            CSP_WZ#2060:  Created\r\r
-*\r\r
-**********************************************************************************************************************/\r\r
-\r\r
-#include "persComTypes.h"\r\r
-#include <stdio.h>\r\r
-#include "string.h"\r\r
-\r\r
-#include "persComDataOrg.h"\r\r
-#include "pers_low_level_db_access_if.h"\r\r
-#include "persComDbAccess.h"\r\r
-#include "persComErrors.h"\r\r
-\r\r
-/**\r\r
- * \brief Obtain a handler to DB indicated by dbPathname\r\r
- * \note : DB is created if it does not exist and (bForceCreationIfNotPresent != 0)\r\r
- *\r\r
- * \param dbPathname                    [in] absolute path to database (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)\r\r
- * \param bForceCreationIfNotPresent    [in] if !=0x0, the database is created if it does not exist\r\r
- *\r\r
- * \return >= 0 for valid handler, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbOpen(char const * dbPathname, unsigned char bForceCreationIfNotPresent)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(NIL != dbPathname)\r\r
-    {\r\r
-        if(strlen(dbPathname) >= PERS_ORG_MAX_LENGTH_PATH_FILENAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_open(dbPathname, PersLldbPurpose_DB, bForceCreationIfNotPresent) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief Close handler to DB\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with persComDbOpen\r\r
- *\r\r
- * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbClose(signed int handlerDB)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(handlerDB < 0)\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_close(handlerDB) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief write a key-value pair into local/shared database\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with persComDbOpen\r\r
- * \param key           [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
- * \param data          [in] buffer with key's data\r\r
- * \param dataSize      [in] size of key's data (max allowed \ref PERS_DB_MAX_SIZE_KEY_DATA)\r\r
- *\r\r
- * \return 0 for success, negative value otherwise (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbWriteKey(signed int handlerDB, char const * key, char const * data, signed int dataSize)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerDB < 0)\r\r
-        ||  (NIL == key)\r\r
-        ||  (NIL == data)\r\r
-        ||  (dataSize <= 0)\r\r
-        ||  (dataSize > PERS_DB_MAX_SIZE_KEY_DATA)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_write_key(handlerDB, PersLldbPurpose_DB, key, data, dataSize) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief read a key's value from local/shared database\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with persComDbOpen\r\r
- * \param key               [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
- * \param dataBuffer_out    [out]buffer where to return the read data\r\r
- * \param dataBufferSize    [in] size of dataBuffer_out\r\r
- *\r\r
- * \return read size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbReadKey(signed int handlerDB, char const * key, char* dataBuffer_out, signed int dataBufferSize)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerDB < 0)\r\r
-        ||  (NIL == key)\r\r
-        ||  (NIL == dataBuffer_out)\r\r
-        ||  (dataBufferSize <= 0)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_read_key(handlerDB, PersLldbPurpose_DB, key, dataBuffer_out, dataBufferSize) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief read a key's value from local/shared database\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with persComDbOpen\r\r
- * \param key               [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
- *\r\r
- * \return key's size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbGetKeySize(signed int handlerDB, char const * key)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerDB < 0)\r\r
-        ||  (NIL == key)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_get_key_size(handlerDB, PersLldbPurpose_DB, key) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief delete key from local/shared database\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with persComDbOpen\r\r
- * \param key           [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
- *\r\r
- * \return 0 for success, negative value otherwise (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbDeleteKey(signed int handlerDB, char const * key)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerDB < 0)\r\r
-        ||  (NIL == key)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_delete_key(handlerDB, PersLldbPurpose_DB, key) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief Find the buffer's size needed to accomodate the list of keys' names in local/shared database\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with persComDbOpen\r\r
- *\r\r
- * \return needed size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbGetSizeKeysList(signed int handlerDB)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(handlerDB < 0)\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_get_size_keys_list(handlerDB, PersLldbPurpose_DB) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief Obtain the list of the keys' names in local/shared database\r\r
- * \note : keys in the list are separated by '\0'\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with persComDbOpen\r\r
- * \param listBuffer_out    [out]buffer where to return the list of keys\r\r
- * \param listBufferSize    [in] size of listingBuffer_out\r\r
- * \return >=0 for size of the list, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComDbGetKeysList(signed int handlerDB, char* listBuffer_out, signed int listBufferSize)\r\r
- {\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerDB < 0)\r\r
-        ||  (NIL == listBuffer_out)\r\r
-        ||  (listBufferSize <= 0)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_get_keys_list(handlerDB, PersLldbPurpose_DB, listBuffer_out, listBufferSize) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of persComDbAccess.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date             Author              Reason
+* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source
+* 2013.01.03       uidl9757            CSP_WZ#2060:  Remove "cursor" interface
+* 2012.12.17       uidl9757            CSP_WZ#2060:  Changes to allow optimized access to DB
+* 2012.12.10       uidl9757            CSP_WZ#2060:  Created
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include <stdio.h>
+#include "string.h"
+
+#include "persComDataOrg.h"
+#include "pers_low_level_db_access_if.h"
+#include "persComDbAccess.h"
+#include "persComErrors.h"
+
+/**
+ * \brief Obtain a handler to DB indicated by dbPathname
+ * \note : DB is created if it does not exist and (bForceCreationIfNotPresent != 0)
+ *
+ * \param dbPathname                    [in] absolute path to database (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+ * \param bForceCreationIfNotPresent    [in] if !=0x0, the database is created if it does not exist
+ *
+ * \return >= 0 for valid handler, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbOpen(char const * dbPathname, unsigned char bForceCreationIfNotPresent)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(NIL != dbPathname)
+    {
+        if(strlen(dbPathname) >= PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+    else
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_open(dbPathname, PersLldbPurpose_DB, bForceCreationIfNotPresent) ;
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief Close handler to DB
+ *
+ * \param handlerDB     [in] handler obtained with persComDbOpen
+ *
+ * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbClose(signed int handlerDB)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(handlerDB < 0)
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_close(handlerDB) ;
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief write a key-value pair into local/shared database
+ *
+ * \param handlerDB     [in] handler obtained with persComDbOpen
+ * \param key           [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)
+ * \param data          [in] buffer with key's data
+ * \param dataSize      [in] size of key's data (max allowed \ref PERS_DB_MAX_SIZE_KEY_DATA)
+ *
+ * \return 0 for success, negative value otherwise (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbWriteKey(signed int handlerDB, char const * key, char const * data, signed int dataSize)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerDB < 0)
+        ||  (NIL == key)
+        ||  (NIL == data)
+        ||  (dataSize <= 0)
+        ||  (dataSize > PERS_DB_MAX_SIZE_KEY_DATA)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_write_key(handlerDB, PersLldbPurpose_DB, key, data, dataSize) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief read a key's value from local/shared database
+ *
+ * \param handlerDB         [in] handler obtained with persComDbOpen
+ * \param key               [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)
+ * \param dataBuffer_out    [out]buffer where to return the read data
+ * \param dataBufferSize    [in] size of dataBuffer_out
+ *
+ * \return read size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbReadKey(signed int handlerDB, char const * key, char* dataBuffer_out, signed int dataBufferSize)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerDB < 0)
+        ||  (NIL == key)
+        ||  (NIL == dataBuffer_out)
+        ||  (dataBufferSize <= 0)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_read_key(handlerDB, PersLldbPurpose_DB, key, dataBuffer_out, dataBufferSize) ;
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief read a key's value from local/shared database
+ *
+ * \param handlerDB         [in] handler obtained with persComDbOpen
+ * \param key               [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)
+ *
+ * \return key's size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbGetKeySize(signed int handlerDB, char const * key)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerDB < 0)
+        ||  (NIL == key)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_get_key_size(handlerDB, PersLldbPurpose_DB, key) ;
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief delete key from local/shared database
+ *
+ * \param handlerDB     [in] handler obtained with persComDbOpen
+ * \param key           [in] key's name (length limited to \ref PERS_DB_MAX_LENGTH_KEY_NAME)
+ *
+ * \return 0 for success, negative value otherwise (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbDeleteKey(signed int handlerDB, char const * key)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerDB < 0)
+        ||  (NIL == key)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(key) >= PERS_DB_MAX_LENGTH_KEY_NAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_delete_key(handlerDB, PersLldbPurpose_DB, key) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief Find the buffer's size needed to accomodate the list of keys' names in local/shared database
+ *
+ * \param handlerDB     [in] handler obtained with persComDbOpen
+ *
+ * \return needed size, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbGetSizeKeysList(signed int handlerDB)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(handlerDB < 0)
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_get_size_keys_list(handlerDB, PersLldbPurpose_DB) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief Obtain the list of the keys' names in local/shared database
+ * \note : keys in the list are separated by '\0'
+ *
+ * \param handlerDB         [in] handler obtained with persComDbOpen
+ * \param listBuffer_out    [out]buffer where to return the list of keys
+ * \param listBufferSize    [in] size of listingBuffer_out
+ * \return >=0 for size of the list, or negative value in case of error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComDbGetKeysList(signed int handlerDB, char* listBuffer_out, signed int listBufferSize)
+ {
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerDB < 0)
+        ||  (NIL == listBuffer_out)
+        ||  (listBufferSize <= 0)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_get_keys_list(handlerDB, PersLldbPurpose_DB, listBuffer_out, listBufferSize) ;
+    }
+
+    return iErrCode ;
+}
+
index f66fa6c..4bdfed0 100644 (file)
-/**********************************************************************************************************************\r\r
-*\r\r
-* Copyright (C) 2012 Continental Automotive Systems, Inc.\r\r
-*\r\r
-* Author: Ionut.Ieremie@continental-corporation.com\r\r
-*\r\r
-* Implementation of persComDbAccess.h\r\r
-*\r\r
-* This Source Code Form is subject to the terms of the Mozilla Public\r\r
-* License, v. 2.0. If a copy of the MPL was not distributed with this\r\r
-* file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\r
-*\r\r
-* Date             Author              Reason\r\r
-* 2013.09.14       uidl9757            CSP_WZ#4872:  Improvements\r\r
-*                                                       - synchronization between threads of the same process\r\r
-*                                                       - number of maximum simultan open handles by a process is no longer limited\r\r
-* 2013.08.30       uidl9757            CSP_WZ#5356:  persistency common library uses too much stack size \r\r
-* 2013.07.10       uidl9757            CSP_WZ#4586:  Add instrumentation for debug purposes\r\r
-* 2013.03.21       uidl9757            CSP_WZ#3774:  Default error handler causes the termination of the calling process\r\r
-* 2013.03.21       uidl9757            CSP_WZ#2798:  Workaround - reading from an emptied itzam db returns error\r\r
-* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source\r\r
-* 2013.01.03       uidl9757            CSP_WZ#2060:  Remove "cursor" interface\r\r
-* 2012.12.17       uidl9757            CSP_WZ#2060:  Changes to allow optimized access to DB\r\r
-* 2012.12.10       uidl9757            CSP_WZ#2060:  Created\r\r
-*\r\r
-**********************************************************************************************************************/\r\r
-\r\r
-#include <pthread.h>\r\r
-#include <stdio.h> /*DG C7MR2R-MISRA-C:2004 Rule 20.9-SSW_PersCommon_1003*/\r\r
-#include <stdlib.h>\r\r
-#include <string.h>\r\r
-#include <malloc.h>\r\r
-#include <sys/types.h>\r\r
-#include <unistd.h>\r\r
-\r\r
-#include "persComTypes.h"\r\r
-\r\r
-#include "itzam.h"\r\r
-\r\r
-#include "persComErrors.h"\r\r
-#include "persComDataOrg.h"\r\r
-#include "persComDbAccess.h"\r\r
-#include "persComRct.h"\r\r
-\r\r
-#include "pers_low_level_db_access_if.h"\r\r
-\r\r
-#include "dlt.h"\r\r
-/* L&T context */\r\r
-#define LT_HDR                          "[persComLLDB]"\r\r
-DLT_DECLARE_CONTEXT                      (persComLldbDLTCtx);\r\r
-\r\r
-/* ---------------------- local definition  ---------------------------- */\r\r
-/* max number of open handlers per process */\r\r
-#define PERS_LLDB_NO_OF_STATIC_HANDLES 16\r\r
-#define PERS_LLDB_MAX_STATIC_HANDLES (PERS_LLDB_NO_OF_STATIC_HANDLES-1)\r\r
-\r\r
-/* ---------------------- local types  --------------------------------- */\r\r
-typedef enum {\r\r
-  dbType_unknown = 0,\r\r
-  dbType_itzam\r\r
-  /* TODO: Add here IDs for supported DB engines */\r\r
-} dbType_e;\r\r
-\r\r
-typedef struct\r\r
-{\r\r
-    char m_key[PERS_DB_MAX_LENGTH_KEY_NAME];\r\r
-    char m_data[PERS_DB_MAX_SIZE_KEY_DATA];\r\r
-    int  m_dataSize ;\r\r
-}\r\r
-KeyValuePair_LocalDB_s;\r\r
-\r\r
-typedef struct\r\r
-{\r\r
-    char m_key[PERS_RCT_MAX_LENGTH_RESOURCE_ID];\r\r
-    char m_data[sizeof(PersistenceConfigurationKey_s)];\r\r
-}\r\r
-KeyValuePair_RCT_s;\r\r
-\r\r
-typedef struct\r\r
-{\r\r
-    bool_t              bIsAssigned ;\r\r
-    sint_t              dbHandler ;\r\r
-    pers_lldb_purpose_e ePurpose ;\r\r
-    itzam_btree         btree;\r\r
-    str_t               dbPathname[PERS_ORG_MAX_LENGTH_PATH_FILENAME] ;\r\r
-}lldb_handler_s ;\r\r
-\r\r
-typedef struct lldb_handles_list_el_s_\r\r
-{\r\r
-    lldb_handler_s                   sHandle ;\r\r
-    struct lldb_handles_list_el_s_ * pNext ;\r\r
-}lldb_handles_list_el_s ;\r\r
-\r\r
-typedef struct\r\r
-{\r\r
-    lldb_handler_s          asStaticHandles[PERS_LLDB_NO_OF_STATIC_HANDLES] ; /* static area should be enough for most of the processes*/\r\r
-    lldb_handles_list_el_s* pListHead ; /* for the processes with a large number of threads which use Persistency */\r\r
-}lldb_handlers_s ;\r\r
-\r\r
-/* ---------------------- local variables  --------------------------------- */\r\r
-static const char ListItemsSeparator = '\0';\r\r
-\r\r
-/* shared by all the threads within a process */\r\r
-static lldb_handlers_s g_sHandlers = {{{0}}} ;\r\r
-static pthread_mutex_t g_mutexLldb = PTHREAD_MUTEX_INITIALIZER; /*DG C7MR2R-MISRA-C:2004 Rule 18.4-SSW_PersCommon_1013*/\r\r
-\r\r
-/* ---------------------- local macros  --------------------------------- */\r\r
-\r\r
-\r\r
-\r\r
-/* ---------------------- local functions  --------------------------------- */\r\r
-static sint_t   DeleteDataFromItzamDB(        sint_t      dbHandler,      pconststr_t key );\r\r
-static void     ErrorHandler(                 pconststr_t function_name,  itzam_error error);\r\r
-static sint_t   GetAllKeysFromItzamLocalDB(   sint_t      dbHandler,      pstr_t      buffer,  sint_t   size );\r\r
-static sint_t   GetAllKeysFromItzamRCT(       sint_t      dbHandler,      pstr_t      buffer,  sint_t   size );\r\r
-static sint_t   GetKeySizeFromItzamLocalDB(   sint_t      dbHandler,      pconststr_t key) ;\r\r
-static sint_t   GetDataFromItzamLocalDB(      sint_t      dbHandler,      pconststr_t key,     pstr_t   buffer_out,   sint_t  bufSize );\r\r
-static sint_t   GetDataFromItzamRCT(          sint_t      dbHandler,      pconststr_t key,     PersistenceConfigurationKey_s* pConfig);\r\r
-static sint_t   SetDataInItzamLocalDB(        sint_t      dbHandler,      pconststr_t key,     pconststr_t data,         sint_t  dataSize );\r\r
-static sint_t   SetDataInItzamRCT(            sint_t      dbHandler,      pconststr_t key,     PersistenceConfigurationKey_s const * pConfig);\r\r
-/* access to resources shared by the threads within a process */\r\r
-static bool_t           lldb_handles_Lock(void);\r\r
-static bool_t           lldb_handles_Unlock(void);\r\r
-static lldb_handler_s*  lldb_handles_FindInUseHandle(sint_t dbHandler) ;\r\r
-static lldb_handler_s*  lldb_handles_FindAvailableHandle(void) ;\r\r
-static void             lldb_handles_InitHandle(lldb_handler_s* psHandle_inout, pers_lldb_purpose_e ePurpose, str_t const * dbPathname);\r\r
-static bool_t           lldb_handles_DeinitHandle(sint_t dbHandler);\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief write a key-value pair into database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param dbPathname                    [in] absolute path to DB\r\r
- * \param ePurpose                      [in] see pers_lldb_purpose_e\r\r
- * \param bForceCreationIfNotPresent    [in] if true, the DB is created if it does not exist\r\r
- *\r\r
- * \return >=0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_open(str_t const * dbPathname, pers_lldb_purpose_e ePurpose, bool_t bForceCreationIfNotPresent)\r\r
-{\r\r
-    sint_t returnValue = PERS_COM_FAILURE ;\r\r
-    bool_t bCanContinue = true ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    \r\r
-    static bool_t bFirstCall = true ;\r\r
-\r\r
-    if(bFirstCall)\r\r
-    {\r\r
-        pid_t pid = getpid() ;\r\r
-        str_t dltContextID[16] ; /* should be at most 4 characters string, but colissions occure */\r\r
-        \r\r
-        /* set an error handler - the default one will cause the termination of the calling process */\r\r
-        bFirstCall = false ;\r\r
-        itzam_set_default_error_handler(&ErrorHandler) ;\r\r
-        /* init DLT */\r\r
-        (void)snprintf(dltContextID, sizeof(dltContextID), "Pers_%04d", pid) ;\r\r
-        DLT_REGISTER_CONTEXT(persComLldbDLTCtx, dltContextID, "PersCommonLLDB");\r\r
-        DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("register context PersCommonLLDB ContextID="); DLT_STRING(dltContextID));\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathname); DLT_STRING(">>, ");\r\r
-            ((PersLldbPurpose_RCT == ePurpose) ? DLT_STRING("RCT, ") : DLT_STRING("DB, "));\r\r
-            ((true == bForceCreationIfNotPresent) ? DLT_STRING("forced, ") : DLT_STRING("unforced, "));\r\r
-            DLT_STRING(" ... ")) ;\r\r
-\r\r
-    if(lldb_handles_Lock())\r\r
-    {\r\r
-        bLocked = true ;\r\r
-        pLldbHandler = lldb_handles_FindAvailableHandle() ;\r\r
-        if(NIL == pLldbHandler)\r\r
-        {\r\r
-            bCanContinue = false ;\r\r
-            returnValue = PERS_COM_ERR_OUT_OF_MEMORY ;\r\r
-        }\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        itzam_state state = ITZAM_NOT_FOUND;\r\r
-        size_t treeEntrySize = (PersLldbPurpose_RCT == ePurpose) ? sizeof(KeyValuePair_RCT_s) : sizeof(KeyValuePair_LocalDB_s) ;\r\r
-        \r\r
-        state = itzam_btree_open( & pLldbHandler->btree, dbPathname, &itzam_comparator_string, &ErrorHandler, 0/*recover*/, 0/*read_only*/);\r\r
-        if( state != ITZAM_OKAY )\r\r
-        {\r\r
-            if(bForceCreationIfNotPresent)\r\r
-            {\r\r
-                state = itzam_btree_create( & pLldbHandler->btree, dbPathname, ITZAM_BTREE_ORDER_DEFAULT, (itzam_int)treeEntrySize, &itzam_comparator_string, &ErrorHandler );\r\r
-                if(ITZAM_OKAY != state)\r\r
-                {\r\r
-                    bCanContinue = false ;\r\r
-                    returnValue = PERS_COM_FAILURE ;\r\r
-                }\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                returnValue = PERS_COM_ERR_NOT_FOUND ;\r\r
-            }\r\r
-        }\r\r
-\r\r
-        if(bCanContinue)\r\r
-        {\r\r
-            lldb_handles_InitHandle(pLldbHandler, ePurpose, dbPathname) ;            \r\r
-            returnValue = pLldbHandler->dbHandler;\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            /* clean up */            \r\r
-            returnValue = PERS_COM_FAILURE ;\r\r
-            (void)lldb_handles_DeinitHandle(pLldbHandler->dbHandler) ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathname); DLT_STRING(">>, ");\r\r
-            ((PersLldbPurpose_RCT == ePurpose) ? DLT_STRING("RCT, ") : DLT_STRING("DB, "));\r\r
-            ((true == bForceCreationIfNotPresent) ? DLT_STRING("forced, ") : DLT_STRING("unforced, "));\r\r
-            DLT_STRING("retval=<"); DLT_INT(returnValue); DLT_STRING(">")) ;\r\r
-    \r\r
-    return returnValue ;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1005*/\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief write a key-value pair into database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with pers_lldb_open\r\r
- *\r\r
- * \return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_close(sint_t handlerDB)\r\r
-{\r\r
-    sint_t returnValue = PERS_COM_SUCCESS ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("handlerDB="); DLT_INT(handlerDB); DLT_STRING("...")) ;\r\r
-\r\r
-    if(handlerDB >= 0)\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(handlerDB) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                returnValue = PERS_COM_FAILURE ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        returnValue = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == returnValue)\r\r
-    {\r\r
-        if(ITZAM_OKAY == itzam_btree_close( & pLldbHandler->btree))\r\r
-        {\r\r
-            if( ! lldb_handles_DeinitHandle(pLldbHandler->dbHandler))\r\r
-            {\r\r
-                returnValue = PERS_COM_FAILURE ;\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            returnValue = PERS_COM_FAILURE ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("handlerDB="); DLT_INT(handlerDB);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(returnValue); DLT_STRING(">")) ;\r\r
-\r\r
-    return returnValue ;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-/**\r\r
- * \brief write a key-value pair into database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- * \note : DB is created if it does not exist\r\r
- *\r\r
- * \param handlerDB     [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose      [in] see pers_lldb_purpose_e\r\r
- * \param key           [in] key's name\r\r
- * \param data          [in] buffer with key's data\r\r
- * \param dataSize      [in] size of key's data\r\r
- *\r\r
- * \return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_write_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, str_t const * data, sint_t dataSize)\r\r
-{\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        {\r\r
-            eErrorCode = SetDataInItzamLocalDB(handlerDB, key, data, dataSize) ;\r\r
-            break ;\r\r
-        }\r\r
-        case PersLldbPurpose_RCT:\r\r
-        {\r\r
-            eErrorCode = SetDataInItzamRCT(handlerDB, key, (PersistenceConfigurationKey_s const *)data) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief read a key's value from database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * \param key               [in] key's name\r\r
- * \param dataBuffer_out    [out]buffer where to return the read data\r\r
- * \param bufSize           [in] size of dataBuffer_out\r\r
- *\r\r
- * \return read size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_read_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, pstr_t dataBuffer_out, sint_t bufSize)\r\r
-{\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        {\r\r
-            eErrorCode = GetDataFromItzamLocalDB(handlerDB, key, dataBuffer_out, bufSize) ;\r\r
-            break ;\r\r
-        }\r\r
-        case PersLldbPurpose_RCT:\r\r
-        {\r\r
-            eErrorCode = GetDataFromItzamRCT(handlerDB, key, (PersistenceConfigurationKey_s*)dataBuffer_out) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief read a key's value from database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * \param key               [in] key's name\r\r
- * \return key's size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_get_key_size(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key)\r\r
-{\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        {\r\r
-            eErrorCode = GetKeySizeFromItzamLocalDB(handlerDB, key) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief delete key from database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * \param key               [in] key's name\r\r
- *\r\r
- * \return 0 for success, negative value otherway (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_delete_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key)\r\r
-{\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        case PersLldbPurpose_RCT:\r\r
-        {\r\r
-            eErrorCode = DeleteDataFromItzamDB(handlerDB, key) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief Find the buffer's size needed to accomodate the listing of keys' names in database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose          [in] see pers_lldb_purpose_e\r\r
- *\r\r
- * \return needed size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
-sint_t pers_lldb_get_size_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose)\r\r
-{\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        {\r\r
-            eErrorCode = GetAllKeysFromItzamLocalDB(handlerDB, NIL, 0) ;\r\r
-            break ;\r\r
-        }\r\r
-        case PersLldbPurpose_RCT:\r\r
-        {\r\r
-            eErrorCode = GetAllKeysFromItzamRCT(handlerDB, NIL, 0) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief List the keys' names in database\r\r
- * \note : DB type is identified from dbPathname (based on extension)\r\r
- * \note : keys are separated by '\0'\r\r
- *\r\r
- * \param handlerDB         [in] handler obtained with pers_lldb_open\r\r
- * \param ePurpose          [in] see pers_lldb_purpose_e\r\r
- * \param listingBuffer_out [out]buffer where to return the listing\r\r
- * \param bufSize           [in] size of listingBuffer_out\r\r
- *\r\r
- * \return listing size, or negative value in case of error (see pers_error_codes.h)\r\r
- */\r\r
- sint_t pers_lldb_get_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose, pstr_t listingBuffer_out, sint_t bufSize)\r\r
- {\r\r
-    sint_t eErrorCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    switch(ePurpose)\r\r
-    {\r\r
-        case PersLldbPurpose_DB:\r\r
-        {\r\r
-            eErrorCode = GetAllKeysFromItzamLocalDB(handlerDB, listingBuffer_out, bufSize) ;\r\r
-            break ;\r\r
-        }\r\r
-        case PersLldbPurpose_RCT:\r\r
-        {\r\r
-            eErrorCode = GetAllKeysFromItzamRCT(handlerDB, listingBuffer_out, bufSize) ;\r\r
-            break ;\r\r
-        }\r\r
-        default:\r\r
-        {\r\r
-            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    return eErrorCode ;\r\r
-}\r\r
-\r\r
-static sint_t DeleteDataFromItzamDB( sint_t dbHandler, pconststr_t key ) \r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t delete_size = PERS_COM_FAILURE ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("handlerDB="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>...")) ;\r\r
-\r\r
-    if( (dbHandler >= 0) && (NIL != key))\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-    }\r\r
-\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        switch(pLldbHandler->ePurpose)\r\r
-        {\r\r
-            case PersLldbPurpose_DB:\r\r
-            {\r\r
-                KeyValuePair_LocalDB_s search;\r\r
-                if( itzam_true == itzam_btree_find( &pLldbHandler->btree, key, & search ) )\r\r
-                {\r\r
-                    if(ITZAM_OKAY == itzam_btree_remove( &pLldbHandler->btree, key ))\r\r
-                    {\r\r
-                        delete_size = search.m_dataSize ;\r\r
-                    }\r\r
-                    else\r\r
-                    {\r\r
-                        delete_size = PERS_COM_FAILURE ;\r\r
-                    }\r\r
-                }\r\r
-                else\r\r
-                {\r\r
-                    delete_size = PERS_COM_ERR_NOT_FOUND ;\r\r
-                }\r\r
-                break ;\r\r
-            }\r\r
-            case PersLldbPurpose_RCT:\r\r
-            {\r\r
-                KeyValuePair_RCT_s search;\r\r
-                if( itzam_true == itzam_btree_find( &pLldbHandler->btree, key, & search ) )\r\r
-                {\r\r
-                    if(ITZAM_OKAY == itzam_btree_remove( &pLldbHandler->btree, key ))\r\r
-                    {\r\r
-                        delete_size = sizeof(PersistenceConfigurationKey_s) ;\r\r
-                    }\r\r
-                    else\r\r
-                    {\r\r
-                        delete_size = PERS_COM_FAILURE ;\r\r
-                    }\r\r
-                }\r\r
-                else\r\r
-                {\r\r
-                    delete_size = PERS_COM_ERR_NOT_FOUND ;\r\r
-                }\r\r
-                break ;\r\r
-            }\r\r
-            default:\r\r
-            {\r\r
-                break ;\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("handlerDB="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(delete_size); DLT_STRING(">")) ;\r\r
-\r\r
-    return delete_size;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-static void ErrorHandler(pconststr_t function_name, itzam_error error ) \r\r
-{\r\r
-    (void)fprintf( stderr, "pers_lldb:ErrorHandler:Itzam error in %s: %d\n", function_name, (sint_t)error );\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-                DLT_STRING("ErrorHandler:Itzam error in "); DLT_STRING(function_name);\r\r
-                DLT_STRING("error=<"); DLT_INT((sint_t)error); DLT_STRING(">") ) ;\r\r
-}\r\r
-\r\r
-static sint_t GetAllKeysFromItzamLocalDB( sint_t dbHandler, pstr_t buffer, sint_t size )\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    itzam_btree_cursor cursor;\r\r
-    sint_t availableSize = size;\r\r
-    sint_t result = 0 ;\r\r
-    KeyValuePair_LocalDB_s crtKey;\r\r
-    bool_t bOnlySizeNeeded = (NIL == buffer) ;\r\r
-    itzam_state itzState ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("buffer="); DLT_UINT((uint_t)buffer);\r\r
-            DLT_STRING("size="); DLT_INT(size); DLT_STRING("...")) ;\r\r
-\r\r
-    if(dbHandler >= 0)\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                result = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    result = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        result = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        if( ( buffer != NIL ) && ( size > 0 ) ) \r\r
-        {\r\r
-            (void)memset( buffer, 0, (size_t)size );\r\r
-        }\r\r
-\r\r
-        itzState = itzam_btree_cursor_create( & cursor, & pLldbHandler->btree) ;\r\r
-        if(ITZAM_OKAY == itzState)\r\r
-        {\r\r
-            (void)memset( & crtKey, 0, sizeof( crtKey ) );\r\r
-            itzState = itzam_btree_cursor_read( & cursor, & crtKey ) ;\r\r
-            if(ITZAM_OKAY == itzState)\r\r
-            {\r\r
-                /* Add the length of the key separator to the count */\r\r
-                size_t keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ;\r\r
-                if(keyLen > 0)\r\r
-                {\r\r
-                    if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )\r\r
-                    {\r\r
-                        (void)strncpy( buffer, crtKey.m_key, keyLen);\r\r
-                        *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                        buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                        availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                    }\r\r
-                    result += (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                }\r\r
-\r\r
-                while ( itzam_btree_cursor_next( & cursor ) == itzam_true ) \r\r
-                {\r\r
-                    (void)memset( & crtKey, 0, sizeof( crtKey ) );\r\r
-                    if( ITZAM_OKAY == itzam_btree_cursor_read( & cursor, & crtKey ) ) \r\r
-                    {\r\r
-                        /* Add the length of the key separator to the count */\r\r
-                        keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ; /* + sizeof( ListItemsSeparator ); */\r\r
-                        if(keyLen > 0)\r\r
-                        {\r\r
-                            if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )\r\r
-                            {\r\r
-                                (void)strncpy( buffer, crtKey.m_key, keyLen);\r\r
-                                *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                                buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                                availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                            }\r\r
-                            result += (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                        }  \r\r
-                    }\r\r
-                }\r\r
-\r\r
-                (void)itzam_btree_cursor_free( & cursor );\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            if(ITZAM_FAILED == itzState)\r\r
-            {\r\r
-                /* no data found */\r\r
-                result = 0 ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                result = PERS_COM_FAILURE;\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(result); DLT_STRING(">")) ;\r\r
-\r\r
-    return result;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 11-SSW_PersCommon_1001*/ /*DG C7MR2R-ISQP Metric 1-SSW_PersCommon_1006*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1007*/\r\r
-\r\r
-static sint_t GetAllKeysFromItzamRCT( sint_t dbHandler, pstr_t buffer, sint_t size )\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    itzam_btree_cursor cursor;\r\r
-    sint_t availableSize = size;\r\r
-    sint_t result = 0 ;\r\r
-    KeyValuePair_RCT_s crtKey;\r\r
-    bool_t bOnlySizeNeeded = (NIL == buffer) ;\r\r
-    itzam_state itzState ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("buffer="); DLT_UINT((uint_t)buffer);\r\r
-            DLT_STRING("size="); DLT_INT(size); DLT_STRING("...")) ;\r\r
-\r\r
-    if(dbHandler >= 0)\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                result = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    result = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        result = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        if( ( buffer != NIL ) && ( size > 0 ) ) \r\r
-        {\r\r
-            (void)memset( buffer, 0, (size_t)size );\r\r
-        }\r\r
-\r\r
-        itzState = itzam_btree_cursor_create( & cursor, & pLldbHandler->btree) ;\r\r
-        if(ITZAM_OKAY == itzState)\r\r
-        {\r\r
-            (void)memset( & crtKey, 0, sizeof( crtKey ) );\r\r
-            itzState = itzam_btree_cursor_read( & cursor, & crtKey ) ;\r\r
-            if(ITZAM_OKAY == itzState)\r\r
-            {\r\r
-                /* Add the length of the key separator to the count */\r\r
-                size_t keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ;\r\r
-                if(keyLen > 0)\r\r
-                {\r\r
-                    if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )\r\r
-                    {\r\r
-                        (void)strncpy( buffer, crtKey.m_key, keyLen);\r\r
-                        *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                        buffer += (sint_t)(keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                        availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                    }\r\r
-                    result += (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                }\r\r
-\r\r
-                while ( itzam_btree_cursor_next( & cursor ) == itzam_true ) \r\r
-                {\r\r
-                    (void)memset( & crtKey, 0, sizeof( crtKey ) );\r\r
-                    if( ITZAM_OKAY == itzam_btree_cursor_read( & cursor, & crtKey ) ) \r\r
-                    {\r\r
-                        /* Add the length of the key separator to the count */\r\r
-                        keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ; /* + sizeof( ListItemsSeparator ); */\r\r
-                        if(keyLen > 0)\r\r
-                        {\r\r
-                            if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )\r\r
-                            {\r\r
-                                (void)strncpy( buffer, crtKey.m_key, keyLen);\r\r
-                                *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                                buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/\r\r
-                                availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                            }\r\r
-                            result += (sint_t)(keyLen + sizeof(ListItemsSeparator));\r\r
-                        }  \r\r
-                    }\r\r
-                }\r\r
-\r\r
-                (void)itzam_btree_cursor_free( & cursor );\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            if(ITZAM_FAILED == itzState)\r\r
-            {\r\r
-                /* no data found */\r\r
-                result = 0 ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                result = PERS_COM_FAILURE;\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(result); DLT_STRING(">")) ;\r\r
-\r\r
-    return result;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 11-SSW_PersCommon_0002*/ /*DG C7MR2R-ISQP Metric 1-SSW_PersCommon_1008*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1009*/\r\r
-\r\r
-\r\r
-/* return no of bytes written, or negative value in case of error */\r\r
-static sint_t SetDataInItzamLocalDB(sint_t dbHandler, pconststr_t key, pconststr_t data, sint_t dataSize)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t size_written = PERS_COM_FAILURE;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("size<<"); DLT_INT(dataSize); DLT_STRING(">> ...")) ;\r\r
-\r\r
-    if((    dbHandler >= 0)\r\r
-        &&  (NIL != key)\r\r
-        &&  (NIL != data)\r\r
-        &&  (dataSize > 0) )\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                size_written = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    size_written = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        size_written = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        KeyValuePair_LocalDB_s search_insert; /* use a single variable to reduce stack size */\r\r
-\r\r
-        if( itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search_insert ) )\r\r
-        {            \r\r
-            if(ITZAM_OKAY != itzam_btree_remove( & pLldbHandler->btree, key ))\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-            }\r\r
-        }\r\r
-\r\r
-        if(bCanContinue)\r\r
-        {\r\r
-            (void)memset(search_insert.m_data, 0, sizeof(search_insert.m_data) );\r\r
-            (void)strncpy(search_insert.m_key, key, sizeof(search_insert.m_key)) ;\r\r
-            (void)memcpy(search_insert.m_data, data, (size_t)dataSize) ;\r\r
-            search_insert.m_dataSize = dataSize ;\r\r
-            if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & search_insert ) ))\r\r
-            {\r\r
-                size_written = dataSize;\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("size<<"); DLT_INT(dataSize); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(size_written); DLT_STRING(">")) ;\r\r
-    \r\r
-    return size_written;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-static sint_t SetDataInItzamRCT( sint_t dbHandler, pconststr_t key, PersistenceConfigurationKey_s const * pConfig)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t size_written = PERS_COM_FAILURE;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>...")) ;\r\r
-\r\r
-    if(     (dbHandler >= 0)\r\r
-        &&  (NIL != key)\r\r
-        &&  (NIL != pConfig) )\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                size_written = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    size_written = PERS_COM_FAILURE ;\r\r
-                }                \r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        size_written = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue) \r\r
-    {\r\r
-        KeyValuePair_RCT_s search, insert;\r\r
-\r\r
-        (void)memset(insert.m_data, 0, sizeof(insert.m_data) );\r\r
-        (void)strncpy(insert.m_key, key, sizeof(insert.m_key)) ;\r\r
-        (void)memcpy(insert.m_data, pConfig, sizeof(PersistenceConfigurationKey_s)) ;\r\r
-\r\r
-        if( itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search ) )\r\r
-        {\r\r
-            if(ITZAM_OKAY == itzam_btree_remove( & pLldbHandler->btree, key ))\r\r
-            {\r\r
-                if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & insert ) ))\r\r
-                {\r\r
-                    size_written = (sint_t)sizeof(PersistenceConfigurationKey_s);\r\r
-                }\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & insert ) ))\r\r
-            {\r\r
-                size_written = (sint_t)sizeof(PersistenceConfigurationKey_s);\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(size_written); DLT_STRING(">")) ;\r\r
-    \r\r
-    return size_written;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-/* return size of key, or negative value in case of error */\r\r
-static sint_t GetKeySizeFromItzamLocalDB(sint_t dbHandler, pconststr_t key)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t size_read = PERS_COM_FAILURE ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">> ...")) ;\r\r
-\r\r
-    if((dbHandler >= 0) && (NIL != key))\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    size_read = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        KeyValuePair_LocalDB_s search;\r\r
-        \r\r
-        if( itzam_btree_find( & pLldbHandler->btree, key, & search ) == itzam_true )\r\r
-        {\r\r
-            size_read = search.m_dataSize ;\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            size_read = PERS_COM_ERR_NOT_FOUND ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;\r\r
-    \r\r
-    return size_read;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-/* return no of bytes read, or negative value in case of error */\r\r
-static sint_t GetDataFromItzamLocalDB(sint_t dbHandler, pconststr_t key, pstr_t buffer_out, sint_t bufSize)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t size_read = PERS_COM_FAILURE ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);;\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("bufsize=<<"); DLT_INT(bufSize); DLT_STRING(">> ... ")) ;\r\r
-\r\r
-    if(     (dbHandler >= 0)\r\r
-        &&  (NIL != key)\r\r
-        &&  (NIL != buffer_out)\r\r
-        &&  (bufSize > 0) )\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    size_read = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    \r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        KeyValuePair_LocalDB_s search;\r\r
-\r\r
-        if( itzam_btree_find( & pLldbHandler->btree, key, & search ) == itzam_true )\r\r
-        {\r\r
-            if( bufSize >= search.m_dataSize)\r\r
-            {\r\r
-                size_read = search.m_dataSize ;\r\r
-                (void)memcpy(buffer_out, search.m_data, (size_t)size_read) ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                size_read = PERS_COM_ERR_BUFFER_TOO_SMALL ;\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            size_read = PERS_COM_ERR_NOT_FOUND ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("bufsize=<<"); DLT_INT(bufSize); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;\r\r
-    \r\r
-    return size_read;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-static sint_t GetDataFromItzamRCT( sint_t dbHandler, pconststr_t key, PersistenceConfigurationKey_s* pConfig)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    sint_t size_read = PERS_COM_FAILURE ;\r\r
-    lldb_handler_s* pLldbHandler = NIL ;\r\r
-    bool_t bLocked = false ;\r\r
-    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">> ...")) ;\r\r
-\r\r
-    if(     (dbHandler >= 0)\r\r
-        &&  (NIL != key)\r\r
-        &&  (NIL != pConfig) )\r\r
-    {\r\r
-        if(lldb_handles_Lock())\r\r
-        {\r\r
-            bLocked = true ;\r\r
-            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;\r\r
-            if(NIL == pLldbHandler)\r\r
-            {\r\r
-                bCanContinue = false ;\r\r
-                size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)\r\r
-                {/* this would be very bad */\r\r
-                    bCanContinue = false ;\r\r
-                    size_read = PERS_COM_FAILURE ;\r\r
-                }\r\r
-                /* to not use DLT while mutex locked */\r\r
-                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;\r\r
-            }\r\r
-        }        \r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        bCanContinue = false ;\r\r
-        size_read = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(bCanContinue)\r\r
-    {\r\r
-        KeyValuePair_RCT_s search;\r\r
-\r\r
-        if(itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search ) )\r\r
-        {\r\r
-            (void)memcpy(pConfig, &(search.m_data), sizeof(PersistenceConfigurationKey_s) );\r\r
-            size_read = sizeof(PersistenceConfigurationKey_s);\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            size_read = PERS_COM_ERR_NOT_FOUND ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bLocked)\r\r
-    {\r\r
-        (void)lldb_handles_Unlock() ;\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("dbHandler="); DLT_INT(dbHandler);\r\r
-            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");\r\r
-            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");\r\r
-            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;\r\r
-    \r\r
-    return size_read;\r\r
-}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/\r\r
-\r\r
-static bool_t lldb_handles_Lock(void)\r\r
-{\r\r
-    bool_t bEverythingOK = true ;\r\r
-    sint_t siErr = pthread_mutex_lock(&g_mutexLldb) ;\r\r
-    if(0 != siErr)\r\r
-    {\r\r
-        bEverythingOK = false ;\r\r
-        DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("pthread_mutex_lock failed with error=<"); DLT_INT(siErr); DLT_STRING(">")) ;\r\r
-    }\r\r
-\r\r
-    return bEverythingOK ;\r\r
-}\r\r
-\r\r
-static bool_t lldb_handles_Unlock(void)\r\r
-{\r\r
-    bool_t bEverythingOK = true ;\r\r
-    sint_t siErr = pthread_mutex_unlock (&g_mutexLldb) ;\r\r
-    if(0 != siErr)\r\r
-    {\r\r
-        bEverythingOK = false ;\r\r
-        DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-            DLT_STRING("pthread_mutex_unlock failed with error=<"); DLT_INT(siErr); DLT_STRING(">")) ;\r\r
-    }\r\r
-\r\r
-    return bEverythingOK ;\r\r
-}\r\r
-\r\r
-/* it is assumed dbHandler is checked by the caller */\r\r
-static lldb_handler_s* lldb_handles_FindInUseHandle(sint_t dbHandler)\r\r
-{\r\r
-    lldb_handler_s* pHandler = NIL ;\r\r
-    \r\r
-    if(dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES)\r\r
-    {\r\r
-        if(g_sHandlers.asStaticHandles[dbHandler].bIsAssigned)\r\r
-        {\r\r
-            pHandler = &g_sHandlers.asStaticHandles[dbHandler] ;\r\r
-        }\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        lldb_handles_list_el_s* pListElemCurrent = g_sHandlers.pListHead ;\r\r
-        while(NIL != pListElemCurrent)\r\r
-        {\r\r
-            if(dbHandler == pListElemCurrent->sHandle.dbHandler)\r\r
-            {\r\r
-                pHandler = &pListElemCurrent->sHandle;             \r\r
-                break ;\r\r
-            }\r\r
-            pListElemCurrent = pListElemCurrent->pNext ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-        DLT_STRING((NIL!=pHandler) ? "Found handler <" : "ERROR can't find handler <"); DLT_INT(dbHandler); DLT_STRING(">");\r\r
-        DLT_STRING((NIL!=pHandler) ? (dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "in static area" : "in dynamic list") : "")) ;\r\r
-\r\r
-    return pHandler ;\r\r
-}\r\r
-\r\r
-static lldb_handler_s* lldb_handles_FindAvailableHandle(void)\r\r
-{\r\r
-    bool_t bCanContinue = true ;\r\r
-    lldb_handler_s* pHandler = NIL ;\r\r
-    lldb_handles_list_el_s* psListElemNew = NIL ;\r\r
-\r\r
-    /* first try to find an available handle in the static area */\r\r
-    sint_t siIndex = 0 ;\r\r
-    for(siIndex = 0 ; siIndex <= PERS_LLDB_MAX_STATIC_HANDLES ; siIndex++)\r\r
-    {\r\r
-        if( ! g_sHandlers.asStaticHandles[siIndex].bIsAssigned)\r\r
-        {\r\r
-            /* index setting should be done only once at the initialization of the static array\r\r
-             * Anyway, doing it here is more consistent  */\r\r
-            g_sHandlers.asStaticHandles[siIndex].dbHandler = siIndex ;\r\r
-            pHandler = &g_sHandlers.asStaticHandles[siIndex] ;\r\r
-            break ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(NIL == pHandler)\r\r
-    {\r\r
-        /* no position available in the static array => we have to use the list\r\r
-         * allocate memory for the new element and process the situation when the list is headless */\r\r
-\r\r
-        psListElemNew = (lldb_handles_list_el_s*)malloc(sizeof(lldb_handles_list_el_s)) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1010*/\r\r
-        if(NIL == psListElemNew)\r\r
-        {\r\r
-            bCanContinue = false ;\r\r
-            DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-                DLT_STRING("malloc failed")) ;\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            if(NIL == g_sHandlers.pListHead)\r\r
-            {\r\r
-                /* the list not yet used/created, so use the new created element as the head */\r\r
-                g_sHandlers.pListHead = psListElemNew ;\r\r
-                g_sHandlers.pListHead->pNext = NIL ;\r\r
-                g_sHandlers.pListHead->sHandle.dbHandler = PERS_LLDB_MAX_STATIC_HANDLES + 1 ;\r\r
-                /* the rest of the members will be set by lldb_handles_InitHandle */\r\r
-                pHandler = &psListElemNew->sHandle;\r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if((NIL == pHandler) && bCanContinue)\r\r
-    {\r\r
-        /* no position available in the static array => we have to use the list\r\r
-         * the memory for psListElemNew has been allocated and the list has a head\r\r
-         * The new element has to get the smallest index \r\r
-         * Now lets consider the situation when the head of the list has an index higher than (PERS_LLDB_MAX_STATIC_HANDLES + 1)\r\r
-         * => the list will have a new head !!! */\r\r
-        if(g_sHandlers.pListHead->sHandle.dbHandler > (PERS_LLDB_MAX_STATIC_HANDLES + 1))\r\r
-        {\r\r
-            psListElemNew->pNext = g_sHandlers.pListHead ;\r\r
-            psListElemNew->sHandle.dbHandler = PERS_LLDB_MAX_STATIC_HANDLES + 1 ;\r\r
-            /* the rest of the members will be set by lldb_handles_InitHandle */\r\r
-            g_sHandlers.pListHead = psListElemNew ;\r\r
-            pHandler = &psListElemNew->sHandle;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if((NIL == pHandler) && bCanContinue)\r\r
-    {\r\r
-        /* no position available in the static array => we have to use the list\r\r
-         * the memory for psListElemNew has been allocated and the list has a head (with the smallest index)\r\r
-         * The new element has to get the smallest available index \r\r
-         * So will search for the first gap between two consecutive elements of the list and will introduce the new element between */\r\r
-        lldb_handles_list_el_s* pListElemCurrent1 = g_sHandlers.pListHead ;\r\r
-        lldb_handles_list_el_s* pListElemCurrent2 = pListElemCurrent1->pNext;\r\r
-        while(NIL != pListElemCurrent2)\r\r
-        {\r\r
-            if(pListElemCurrent2->sHandle.dbHandler - pListElemCurrent1->sHandle.dbHandler > 1)\r\r
-            {\r\r
-                /* found a gap => insert the element between and use the index next to pListElemCurrent1's */\r\r
-                psListElemNew->pNext = pListElemCurrent2 ;\r\r
-                psListElemNew->sHandle.dbHandler = pListElemCurrent1->sHandle.dbHandler + 1 ;\r\r
-                pListElemCurrent1->pNext = psListElemNew ;\r\r
-                pHandler = &psListElemNew->sHandle;\r\r
-                break ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                pListElemCurrent1 = pListElemCurrent2 ;\r\r
-                pListElemCurrent2 = pListElemCurrent2->pNext ;\r\r
-            }\r\r
-        }\r\r
-        if(NIL == pListElemCurrent2)\r\r
-        {\r\r
-            /* reached the end of the list => the list will have a new end */\r\r
-            psListElemNew->pNext = NIL ;\r\r
-            psListElemNew->sHandle.dbHandler = pListElemCurrent1->sHandle.dbHandler + 1 ;\r\r
-            pListElemCurrent1->pNext = psListElemNew ;\r\r
-            pHandler = &psListElemNew->sHandle;\r\r
-        }        \r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-        DLT_STRING((NIL!=pHandler) ? "Found availble handler <" : "ERROR can't find available handler <"); \r\r
-        DLT_INT((NIL!=pHandler) ? pHandler->dbHandler : (-1)); DLT_STRING(">");\r\r
-        DLT_STRING((NIL!=pHandler) ? (pHandler->dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "in static area" : "in dynamic list") : "") ) ;\r\r
-\r\r
-    return pHandler ;\r\r
-}/*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1011*/\r\r
-\r\r
-static void lldb_handles_InitHandle(lldb_handler_s* psHandle_inout, pers_lldb_purpose_e ePurpose, str_t const * dbPathname)\r\r
-{\r\r
-    psHandle_inout->bIsAssigned = true ;\r\r
-    psHandle_inout->ePurpose = ePurpose ;\r\r
-    (void)strncpy(psHandle_inout->dbPathname, dbPathname, sizeof(psHandle_inout->dbPathname)) ;\r\r
-}\r\r
-\r\r
-static bool_t lldb_handles_DeinitHandle(sint_t dbHandler)\r\r
-{\r\r
-    bool_t bEverythingOK = true ;\r\r
-    bool_t bHandlerFound = false ;\r\r
-        \r\r
-\r\r
-    if(dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES)\r\r
-    {\r\r
-        bHandlerFound = true ;\r\r
-        g_sHandlers.asStaticHandles[dbHandler].bIsAssigned = false ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        /* consider the situation when the handle is the head of the list */\r\r
-        if(NIL != g_sHandlers.pListHead)\r\r
-        {\r\r
-            if(dbHandler == g_sHandlers.pListHead->sHandle.dbHandler)\r\r
-            {\r\r
-                lldb_handles_list_el_s* pListElemTemp = NIL ;\r\r
-                \r\r
-                bHandlerFound = true ;\r\r
-                pListElemTemp = g_sHandlers.pListHead ;\r\r
-                g_sHandlers.pListHead = g_sHandlers.pListHead->pNext ;\r\r
-                free(pListElemTemp) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1012*/\r\r
-            }\r\r
-        }\r\r
-        else\r\r
-        {\r\r
-            bEverythingOK = false ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(bEverythingOK && ( ! bHandlerFound))\r\r
-    {\r\r
-        /* consider the situation when the handle is in the list (but not the head) */\r\r
-        lldb_handles_list_el_s* pListElemCurrent1 = g_sHandlers.pListHead ;\r\r
-        lldb_handles_list_el_s* pListElemCurrent2 = pListElemCurrent1->pNext;\r\r
-        while(NIL != pListElemCurrent2)\r\r
-        {\r\r
-            if(dbHandler == pListElemCurrent2->sHandle.dbHandler)\r\r
-            {\r\r
-                /* found the handle */\r\r
-                bHandlerFound = true ;\r\r
-                pListElemCurrent1->pNext = pListElemCurrent2->pNext ;\r\r
-                free(pListElemCurrent2) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1013*/\r\r
-                break ;\r\r
-            }\r\r
-            else\r\r
-            {\r\r
-                pListElemCurrent1 = pListElemCurrent2 ;\r\r
-                pListElemCurrent2 = pListElemCurrent2->pNext ;\r\r
-            }\r\r
-        }\r\r
-        if(NIL == pListElemCurrent2)\r\r
-        {\r\r
-            /* reached the end of the list without finding the handle */\r\r
-            bEverythingOK = false ;\r\r
-        }   \r\r
-    }\r\r
-\r\r
-    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");\r\r
-        DLT_STRING("dbHandler=<"); DLT_INT(dbHandler); DLT_STRING("> ");\r\r
-        DLT_STRING(bEverythingOK ? (dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "deinit handler in static area" : "deinit handler in dynamic list") : "ERROR - handler not found") ) ;\r\r
-\r\r
-    return bEverythingOK ;\r\r
-}\r\r
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of persComDbAccess.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date             Author              Reason
+* 2013.09.14       uidl9757            CSP_WZ#4872:  Improvements
+*                                                       - synchronization between threads of the same process
+*                                                       - number of maximum simultan open handles by a process is no longer limited
+* 2013.08.30       uidl9757            CSP_WZ#5356:  persistency common library uses too much stack size 
+* 2013.07.10       uidl9757            CSP_WZ#4586:  Add instrumentation for debug purposes
+* 2013.03.21       uidl9757            CSP_WZ#3774:  Default error handler causes the termination of the calling process
+* 2013.03.21       uidl9757            CSP_WZ#2798:  Workaround - reading from an emptied itzam db returns error
+* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source
+* 2013.01.03       uidl9757            CSP_WZ#2060:  Remove "cursor" interface
+* 2012.12.17       uidl9757            CSP_WZ#2060:  Changes to allow optimized access to DB
+* 2012.12.10       uidl9757            CSP_WZ#2060:  Created
+*
+**********************************************************************************************************************/
+
+#include <pthread.h>
+#include <stdio.h> /*DG C7MR2R-MISRA-C:2004 Rule 20.9-SSW_PersCommon_1003*/
+#include <stdlib.h>
+#include <string.h>
+#include <malloc.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "persComTypes.h"
+
+#include "itzam.h"
+
+#include "persComErrors.h"
+#include "persComDataOrg.h"
+#include "persComDbAccess.h"
+#include "persComRct.h"
+
+#include "pers_low_level_db_access_if.h"
+
+#include "dlt.h"
+/* L&T context */
+#define LT_HDR                          "[persComLLDB]"
+DLT_DECLARE_CONTEXT                      (persComLldbDLTCtx);
+
+/* ---------------------- local definition  ---------------------------- */
+/* max number of open handlers per process */
+#define PERS_LLDB_NO_OF_STATIC_HANDLES 16
+#define PERS_LLDB_MAX_STATIC_HANDLES (PERS_LLDB_NO_OF_STATIC_HANDLES-1)
+
+/* ---------------------- local types  --------------------------------- */
+typedef enum {
+  dbType_unknown = 0,
+  dbType_itzam
+  /* TODO: Add here IDs for supported DB engines */
+} dbType_e;
+
+typedef struct
+{
+    char m_key[PERS_DB_MAX_LENGTH_KEY_NAME];
+    char m_data[PERS_DB_MAX_SIZE_KEY_DATA];
+    int  m_dataSize ;
+}
+KeyValuePair_LocalDB_s;
+
+typedef struct
+{
+    char m_key[PERS_RCT_MAX_LENGTH_RESOURCE_ID];
+    char m_data[sizeof(PersistenceConfigurationKey_s)];
+}
+KeyValuePair_RCT_s;
+
+typedef struct
+{
+    bool_t              bIsAssigned ;
+    sint_t              dbHandler ;
+    pers_lldb_purpose_e ePurpose ;
+    itzam_btree         btree;
+    str_t               dbPathname[PERS_ORG_MAX_LENGTH_PATH_FILENAME] ;
+}lldb_handler_s ;
+
+typedef struct lldb_handles_list_el_s_
+{
+    lldb_handler_s                   sHandle ;
+    struct lldb_handles_list_el_s_ * pNext ;
+}lldb_handles_list_el_s ;
+
+typedef struct
+{
+    lldb_handler_s          asStaticHandles[PERS_LLDB_NO_OF_STATIC_HANDLES] ; /* static area should be enough for most of the processes*/
+    lldb_handles_list_el_s* pListHead ; /* for the processes with a large number of threads which use Persistency */
+}lldb_handlers_s ;
+
+/* ---------------------- local variables  --------------------------------- */
+static const char ListItemsSeparator = '\0';
+
+/* shared by all the threads within a process */
+static lldb_handlers_s g_sHandlers = {{{0}}} ;
+static pthread_mutex_t g_mutexLldb = PTHREAD_MUTEX_INITIALIZER; /*DG C7MR2R-MISRA-C:2004 Rule 18.4-SSW_PersCommon_1013*/
+
+/* ---------------------- local macros  --------------------------------- */
+
+
+
+/* ---------------------- local functions  --------------------------------- */
+static sint_t   DeleteDataFromItzamDB(        sint_t      dbHandler,      pconststr_t key );
+static void     ErrorHandler(                 pconststr_t function_name,  itzam_error error);
+static sint_t   GetAllKeysFromItzamLocalDB(   sint_t      dbHandler,      pstr_t      buffer,  sint_t   size );
+static sint_t   GetAllKeysFromItzamRCT(       sint_t      dbHandler,      pstr_t      buffer,  sint_t   size );
+static sint_t   GetKeySizeFromItzamLocalDB(   sint_t      dbHandler,      pconststr_t key) ;
+static sint_t   GetDataFromItzamLocalDB(      sint_t      dbHandler,      pconststr_t key,     pstr_t   buffer_out,   sint_t  bufSize );
+static sint_t   GetDataFromItzamRCT(          sint_t      dbHandler,      pconststr_t key,     PersistenceConfigurationKey_s* pConfig);
+static sint_t   SetDataInItzamLocalDB(        sint_t      dbHandler,      pconststr_t key,     pconststr_t data,         sint_t  dataSize );
+static sint_t   SetDataInItzamRCT(            sint_t      dbHandler,      pconststr_t key,     PersistenceConfigurationKey_s const * pConfig);
+/* access to resources shared by the threads within a process */
+static bool_t           lldb_handles_Lock(void);
+static bool_t           lldb_handles_Unlock(void);
+static lldb_handler_s*  lldb_handles_FindInUseHandle(sint_t dbHandler) ;
+static lldb_handler_s*  lldb_handles_FindAvailableHandle(void) ;
+static void             lldb_handles_InitHandle(lldb_handler_s* psHandle_inout, pers_lldb_purpose_e ePurpose, str_t const * dbPathname);
+static bool_t           lldb_handles_DeinitHandle(sint_t dbHandler);
+
+
+/**
+ * \brief write a key-value pair into database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param dbPathname                    [in] absolute path to DB
+ * \param ePurpose                      [in] see pers_lldb_purpose_e
+ * \param bForceCreationIfNotPresent    [in] if true, the DB is created if it does not exist
+ *
+ * \return >=0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_open(str_t const * dbPathname, pers_lldb_purpose_e ePurpose, bool_t bForceCreationIfNotPresent)
+{
+    sint_t returnValue = PERS_COM_FAILURE ;
+    bool_t bCanContinue = true ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    
+    static bool_t bFirstCall = true ;
+
+    if(bFirstCall)
+    {
+        pid_t pid = getpid() ;
+        str_t dltContextID[16] ; /* should be at most 4 characters string, but colissions occure */
+        
+        /* set an error handler - the default one will cause the termination of the calling process */
+        bFirstCall = false ;
+        itzam_set_default_error_handler(&ErrorHandler) ;
+        /* init DLT */
+        (void)snprintf(dltContextID, sizeof(dltContextID), "Pers_%04d", pid) ;
+        DLT_REGISTER_CONTEXT(persComLldbDLTCtx, dltContextID, "PersCommonLLDB");
+        DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("register context PersCommonLLDB ContextID="); DLT_STRING(dltContextID));
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("<<"); DLT_STRING(dbPathname); DLT_STRING(">>, ");
+            ((PersLldbPurpose_RCT == ePurpose) ? DLT_STRING("RCT, ") : DLT_STRING("DB, "));
+            ((true == bForceCreationIfNotPresent) ? DLT_STRING("forced, ") : DLT_STRING("unforced, "));
+            DLT_STRING(" ... ")) ;
+
+    if(lldb_handles_Lock())
+    {
+        bLocked = true ;
+        pLldbHandler = lldb_handles_FindAvailableHandle() ;
+        if(NIL == pLldbHandler)
+        {
+            bCanContinue = false ;
+            returnValue = PERS_COM_ERR_OUT_OF_MEMORY ;
+        }
+    }
+    else
+    {
+        bCanContinue = false ;
+    }
+
+    if(bCanContinue)
+    {
+        itzam_state state = ITZAM_NOT_FOUND;
+        size_t treeEntrySize = (PersLldbPurpose_RCT == ePurpose) ? sizeof(KeyValuePair_RCT_s) : sizeof(KeyValuePair_LocalDB_s) ;
+        
+        state = itzam_btree_open( & pLldbHandler->btree, dbPathname, &itzam_comparator_string, &ErrorHandler, 0/*recover*/, 0/*read_only*/);
+        if( state != ITZAM_OKAY )
+        {
+            if(bForceCreationIfNotPresent)
+            {
+                state = itzam_btree_create( & pLldbHandler->btree, dbPathname, ITZAM_BTREE_ORDER_DEFAULT, (itzam_int)treeEntrySize, &itzam_comparator_string, &ErrorHandler );
+                if(ITZAM_OKAY != state)
+                {
+                    bCanContinue = false ;
+                    returnValue = PERS_COM_FAILURE ;
+                }
+            }
+            else
+            {
+                bCanContinue = false ;
+                returnValue = PERS_COM_ERR_NOT_FOUND ;
+            }
+        }
+
+        if(bCanContinue)
+        {
+            lldb_handles_InitHandle(pLldbHandler, ePurpose, dbPathname) ;            
+            returnValue = pLldbHandler->dbHandler;
+        }
+        else
+        {
+            /* clean up */            
+            returnValue = PERS_COM_FAILURE ;
+            (void)lldb_handles_DeinitHandle(pLldbHandler->dbHandler) ;
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("<<"); DLT_STRING(dbPathname); DLT_STRING(">>, ");
+            ((PersLldbPurpose_RCT == ePurpose) ? DLT_STRING("RCT, ") : DLT_STRING("DB, "));
+            ((true == bForceCreationIfNotPresent) ? DLT_STRING("forced, ") : DLT_STRING("unforced, "));
+            DLT_STRING("retval=<"); DLT_INT(returnValue); DLT_STRING(">")) ;
+    
+    return returnValue ;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1005*/
+
+
+/**
+ * \brief write a key-value pair into database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param handlerDB     [in] handler obtained with pers_lldb_open
+ *
+ * \return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_close(sint_t handlerDB)
+{
+    sint_t returnValue = PERS_COM_SUCCESS ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("handlerDB="); DLT_INT(handlerDB); DLT_STRING("...")) ;
+
+    if(handlerDB >= 0)
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(handlerDB) ;
+            if(NIL == pLldbHandler)
+            {
+                returnValue = PERS_COM_FAILURE ;
+            }
+            else
+            {
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        returnValue = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == returnValue)
+    {
+        if(ITZAM_OKAY == itzam_btree_close( & pLldbHandler->btree))
+        {
+            if( ! lldb_handles_DeinitHandle(pLldbHandler->dbHandler))
+            {
+                returnValue = PERS_COM_FAILURE ;
+            }
+        }
+        else
+        {
+            returnValue = PERS_COM_FAILURE ;
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("handlerDB="); DLT_INT(handlerDB);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(returnValue); DLT_STRING(">")) ;
+
+    return returnValue ;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+/**
+ * \brief write a key-value pair into database
+ * \note : DB type is identified from dbPathname (based on extension)
+ * \note : DB is created if it does not exist
+ *
+ * \param handlerDB     [in] handler obtained with pers_lldb_open
+ * \param ePurpose      [in] see pers_lldb_purpose_e
+ * \param key           [in] key's name
+ * \param data          [in] buffer with key's data
+ * \param dataSize      [in] size of key's data
+ *
+ * \return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_write_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, str_t const * data, sint_t dataSize)
+{
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        {
+            eErrorCode = SetDataInItzamLocalDB(handlerDB, key, data, dataSize) ;
+            break ;
+        }
+        case PersLldbPurpose_RCT:
+        {
+            eErrorCode = SetDataInItzamRCT(handlerDB, key, (PersistenceConfigurationKey_s const *)data) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+
+/**
+ * \brief read a key's value from database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param handlerDB         [in] handler obtained with pers_lldb_open
+ * \param ePurpose          [in] see pers_lldb_purpose_e
+ * \param key               [in] key's name
+ * \param dataBuffer_out    [out]buffer where to return the read data
+ * \param bufSize           [in] size of dataBuffer_out
+ *
+ * \return read size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_read_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key, pstr_t dataBuffer_out, sint_t bufSize)
+{
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        {
+            eErrorCode = GetDataFromItzamLocalDB(handlerDB, key, dataBuffer_out, bufSize) ;
+            break ;
+        }
+        case PersLldbPurpose_RCT:
+        {
+            eErrorCode = GetDataFromItzamRCT(handlerDB, key, (PersistenceConfigurationKey_s*)dataBuffer_out) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+/**
+ * \brief read a key's value from database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param handlerDB         [in] handler obtained with pers_lldb_open
+ * \param ePurpose          [in] see pers_lldb_purpose_e
+ * \param key               [in] key's name
+ * \return key's size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_get_key_size(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key)
+{
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        {
+            eErrorCode = GetKeySizeFromItzamLocalDB(handlerDB, key) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+/**
+ * \brief delete key from database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param handlerDB         [in] handler obtained with pers_lldb_open
+ * \param ePurpose          [in] see pers_lldb_purpose_e
+ * \param key               [in] key's name
+ *
+ * \return 0 for success, negative value otherway (see pers_error_codes.h)
+ */
+sint_t pers_lldb_delete_key(sint_t handlerDB, pers_lldb_purpose_e ePurpose, str_t const * key)
+{
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        case PersLldbPurpose_RCT:
+        {
+            eErrorCode = DeleteDataFromItzamDB(handlerDB, key) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+
+/**
+ * \brief Find the buffer's size needed to accomodate the listing of keys' names in database
+ * \note : DB type is identified from dbPathname (based on extension)
+ *
+ * \param handlerDB         [in] handler obtained with pers_lldb_open
+ * \param ePurpose          [in] see pers_lldb_purpose_e
+ *
+ * \return needed size, or negative value in case of error (see pers_error_codes.h)
+ */
+sint_t pers_lldb_get_size_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose)
+{
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        {
+            eErrorCode = GetAllKeysFromItzamLocalDB(handlerDB, NIL, 0) ;
+            break ;
+        }
+        case PersLldbPurpose_RCT:
+        {
+            eErrorCode = GetAllKeysFromItzamRCT(handlerDB, NIL, 0) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+
+/**
+ * \brief List the keys' names in database
+ * \note : DB type is identified from dbPathname (based on extension)
+ * \note : keys are separated by '\0'
+ *
+ * \param handlerDB         [in] handler obtained with pers_lldb_open
+ * \param ePurpose          [in] see pers_lldb_purpose_e
+ * \param listingBuffer_out [out]buffer where to return the listing
+ * \param bufSize           [in] size of listingBuffer_out
+ *
+ * \return listing size, or negative value in case of error (see pers_error_codes.h)
+ */
+ sint_t pers_lldb_get_keys_list(sint_t handlerDB, pers_lldb_purpose_e ePurpose, pstr_t listingBuffer_out, sint_t bufSize)
+ {
+    sint_t eErrorCode = PERS_COM_SUCCESS ;
+
+    switch(ePurpose)
+    {
+        case PersLldbPurpose_DB:
+        {
+            eErrorCode = GetAllKeysFromItzamLocalDB(handlerDB, listingBuffer_out, bufSize) ;
+            break ;
+        }
+        case PersLldbPurpose_RCT:
+        {
+            eErrorCode = GetAllKeysFromItzamRCT(handlerDB, listingBuffer_out, bufSize) ;
+            break ;
+        }
+        default:
+        {
+            eErrorCode = PERS_COM_ERR_INVALID_PARAM ;
+            break ;
+        }
+    }
+
+    return eErrorCode ;
+}
+
+static sint_t DeleteDataFromItzamDB( sint_t dbHandler, pconststr_t key ) 
+{
+    bool_t bCanContinue = true ;
+    sint_t delete_size = PERS_COM_FAILURE ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("handlerDB="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>...")) ;
+
+    if( (dbHandler >= 0) && (NIL != key))
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+            }
+            else
+            {
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+    }
+
+
+    if(bCanContinue)
+    {
+        switch(pLldbHandler->ePurpose)
+        {
+            case PersLldbPurpose_DB:
+            {
+                KeyValuePair_LocalDB_s search;
+                if( itzam_true == itzam_btree_find( &pLldbHandler->btree, key, & search ) )
+                {
+                    if(ITZAM_OKAY == itzam_btree_remove( &pLldbHandler->btree, key ))
+                    {
+                        delete_size = search.m_dataSize ;
+                    }
+                    else
+                    {
+                        delete_size = PERS_COM_FAILURE ;
+                    }
+                }
+                else
+                {
+                    delete_size = PERS_COM_ERR_NOT_FOUND ;
+                }
+                break ;
+            }
+            case PersLldbPurpose_RCT:
+            {
+                KeyValuePair_RCT_s search;
+                if( itzam_true == itzam_btree_find( &pLldbHandler->btree, key, & search ) )
+                {
+                    if(ITZAM_OKAY == itzam_btree_remove( &pLldbHandler->btree, key ))
+                    {
+                        delete_size = sizeof(PersistenceConfigurationKey_s) ;
+                    }
+                    else
+                    {
+                        delete_size = PERS_COM_FAILURE ;
+                    }
+                }
+                else
+                {
+                    delete_size = PERS_COM_ERR_NOT_FOUND ;
+                }
+                break ;
+            }
+            default:
+            {
+                break ;
+            }
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("handlerDB="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(delete_size); DLT_STRING(">")) ;
+
+    return delete_size;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+static void ErrorHandler(pconststr_t function_name, itzam_error error ) 
+{
+    (void)fprintf( stderr, "pers_lldb:ErrorHandler:Itzam error in %s: %d\n", function_name, (sint_t)error );
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+                DLT_STRING("ErrorHandler:Itzam error in "); DLT_STRING(function_name);
+                DLT_STRING("error=<"); DLT_INT((sint_t)error); DLT_STRING(">") ) ;
+}
+
+static sint_t GetAllKeysFromItzamLocalDB( sint_t dbHandler, pstr_t buffer, sint_t size )
+{
+    bool_t bCanContinue = true ;
+    itzam_btree_cursor cursor;
+    sint_t availableSize = size;
+    sint_t result = 0 ;
+    KeyValuePair_LocalDB_s crtKey;
+    bool_t bOnlySizeNeeded = (NIL == buffer) ;
+    itzam_state itzState ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("buffer="); DLT_UINT((uint_t)buffer);
+            DLT_STRING("size="); DLT_INT(size); DLT_STRING("...")) ;
+
+    if(dbHandler >= 0)
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                result = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    result = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        result = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue)
+    {
+        if( ( buffer != NIL ) && ( size > 0 ) ) 
+        {
+            (void)memset( buffer, 0, (size_t)size );
+        }
+
+        itzState = itzam_btree_cursor_create( & cursor, & pLldbHandler->btree) ;
+        if(ITZAM_OKAY == itzState)
+        {
+            (void)memset( & crtKey, 0, sizeof( crtKey ) );
+            itzState = itzam_btree_cursor_read( & cursor, & crtKey ) ;
+            if(ITZAM_OKAY == itzState)
+            {
+                /* Add the length of the key separator to the count */
+                size_t keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ;
+                if(keyLen > 0)
+                {
+                    if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )
+                    {
+                        (void)strncpy( buffer, crtKey.m_key, keyLen);
+                        *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                        buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                        availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                    }
+                    result += (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                }
+
+                while ( itzam_btree_cursor_next( & cursor ) == itzam_true ) 
+                {
+                    (void)memset( & crtKey, 0, sizeof( crtKey ) );
+                    if( ITZAM_OKAY == itzam_btree_cursor_read( & cursor, & crtKey ) ) 
+                    {
+                        /* Add the length of the key separator to the count */
+                        keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ; /* + sizeof( ListItemsSeparator ); */
+                        if(keyLen > 0)
+                        {
+                            if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )
+                            {
+                                (void)strncpy( buffer, crtKey.m_key, keyLen);
+                                *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                                buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                                availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                            }
+                            result += (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                        }  
+                    }
+                }
+
+                (void)itzam_btree_cursor_free( & cursor );
+            }
+        }
+        else
+        {
+            if(ITZAM_FAILED == itzState)
+            {
+                /* no data found */
+                result = 0 ;
+            }
+            else
+            {
+                result = PERS_COM_FAILURE;
+            }
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(result); DLT_STRING(">")) ;
+
+    return result;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 11-SSW_PersCommon_1001*/ /*DG C7MR2R-ISQP Metric 1-SSW_PersCommon_1006*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1007*/
+
+static sint_t GetAllKeysFromItzamRCT( sint_t dbHandler, pstr_t buffer, sint_t size )
+{
+    bool_t bCanContinue = true ;
+    itzam_btree_cursor cursor;
+    sint_t availableSize = size;
+    sint_t result = 0 ;
+    KeyValuePair_RCT_s crtKey;
+    bool_t bOnlySizeNeeded = (NIL == buffer) ;
+    itzam_state itzState ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("buffer="); DLT_UINT((uint_t)buffer);
+            DLT_STRING("size="); DLT_INT(size); DLT_STRING("...")) ;
+
+    if(dbHandler >= 0)
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                result = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    result = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        result = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue)
+    {
+        if( ( buffer != NIL ) && ( size > 0 ) ) 
+        {
+            (void)memset( buffer, 0, (size_t)size );
+        }
+
+        itzState = itzam_btree_cursor_create( & cursor, & pLldbHandler->btree) ;
+        if(ITZAM_OKAY == itzState)
+        {
+            (void)memset( & crtKey, 0, sizeof( crtKey ) );
+            itzState = itzam_btree_cursor_read( & cursor, & crtKey ) ;
+            if(ITZAM_OKAY == itzState)
+            {
+                /* Add the length of the key separator to the count */
+                size_t keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ;
+                if(keyLen > 0)
+                {
+                    if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )
+                    {
+                        (void)strncpy( buffer, crtKey.m_key, keyLen);
+                        *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                        buffer += (sint_t)(keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                        availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                    }
+                    result += (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                }
+
+                while ( itzam_btree_cursor_next( & cursor ) == itzam_true ) 
+                {
+                    (void)memset( & crtKey, 0, sizeof( crtKey ) );
+                    if( ITZAM_OKAY == itzam_btree_cursor_read( & cursor, & crtKey ) ) 
+                    {
+                        /* Add the length of the key separator to the count */
+                        keyLen = strnlen( crtKey.m_key, sizeof( crtKey.m_key ) ) ; /* + sizeof( ListItemsSeparator ); */
+                        if(keyLen > 0)
+                        {
+                            if( (! bOnlySizeNeeded) && ( (sint_t)keyLen < availableSize ) )
+                            {
+                                (void)strncpy( buffer, crtKey.m_key, keyLen);
+                                *(buffer+keyLen) = ListItemsSeparator; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                                buffer += (keyLen + sizeof(ListItemsSeparator)) ; /*DG C7MR2R-MISRA-C:2004 Rule 17.4-SSW_PersCommon_1004*/
+                                availableSize -= (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                            }
+                            result += (sint_t)(keyLen + sizeof(ListItemsSeparator));
+                        }  
+                    }
+                }
+
+                (void)itzam_btree_cursor_free( & cursor );
+            }
+        }
+        else
+        {
+            if(ITZAM_FAILED == itzState)
+            {
+                /* no data found */
+                result = 0 ;
+            }
+            else
+            {
+                result = PERS_COM_FAILURE;
+            }
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(result); DLT_STRING(">")) ;
+
+    return result;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/ /*DG C7MR2R-ISQP Metric 11-SSW_PersCommon_0002*/ /*DG C7MR2R-ISQP Metric 1-SSW_PersCommon_1008*/ /*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1009*/
+
+
+/* return no of bytes written, or negative value in case of error */
+static sint_t SetDataInItzamLocalDB(sint_t dbHandler, pconststr_t key, pconststr_t data, sint_t dataSize)
+{
+    bool_t bCanContinue = true ;
+    sint_t size_written = PERS_COM_FAILURE;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("size<<"); DLT_INT(dataSize); DLT_STRING(">> ...")) ;
+
+    if((    dbHandler >= 0)
+        &&  (NIL != key)
+        &&  (NIL != data)
+        &&  (dataSize > 0) )
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                size_written = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    size_written = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        size_written = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue)
+    {
+        KeyValuePair_LocalDB_s search_insert; /* use a single variable to reduce stack size */
+
+        if( itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search_insert ) )
+        {            
+            if(ITZAM_OKAY != itzam_btree_remove( & pLldbHandler->btree, key ))
+            {
+                bCanContinue = false ;
+            }
+        }
+
+        if(bCanContinue)
+        {
+            (void)memset(search_insert.m_data, 0, sizeof(search_insert.m_data) );
+            (void)strncpy(search_insert.m_key, key, sizeof(search_insert.m_key)) ;
+            (void)memcpy(search_insert.m_data, data, (size_t)dataSize) ;
+            search_insert.m_dataSize = dataSize ;
+            if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & search_insert ) ))
+            {
+                size_written = dataSize;
+            }
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("size<<"); DLT_INT(dataSize); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(size_written); DLT_STRING(">")) ;
+    
+    return size_written;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+static sint_t SetDataInItzamRCT( sint_t dbHandler, pconststr_t key, PersistenceConfigurationKey_s const * pConfig)
+{
+    bool_t bCanContinue = true ;
+    sint_t size_written = PERS_COM_FAILURE;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>...")) ;
+
+    if(     (dbHandler >= 0)
+        &&  (NIL != key)
+        &&  (NIL != pConfig) )
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                size_written = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    size_written = PERS_COM_FAILURE ;
+                }                
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        size_written = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue) 
+    {
+        KeyValuePair_RCT_s search, insert;
+
+        (void)memset(insert.m_data, 0, sizeof(insert.m_data) );
+        (void)strncpy(insert.m_key, key, sizeof(insert.m_key)) ;
+        (void)memcpy(insert.m_data, pConfig, sizeof(PersistenceConfigurationKey_s)) ;
+
+        if( itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search ) )
+        {
+            if(ITZAM_OKAY == itzam_btree_remove( & pLldbHandler->btree, key ))
+            {
+                if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & insert ) ))
+                {
+                    size_written = (sint_t)sizeof(PersistenceConfigurationKey_s);
+                }
+            }
+        }
+        else
+        {
+            if(ITZAM_OKAY == itzam_btree_insert( & pLldbHandler->btree, ( void * )( & insert ) ))
+            {
+                size_written = (sint_t)sizeof(PersistenceConfigurationKey_s);
+            }
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(size_written); DLT_STRING(">")) ;
+    
+    return size_written;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+/* return size of key, or negative value in case of error */
+static sint_t GetKeySizeFromItzamLocalDB(sint_t dbHandler, pconststr_t key)
+{
+    bool_t bCanContinue = true ;
+    sint_t size_read = PERS_COM_FAILURE ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">> ...")) ;
+
+    if((dbHandler >= 0) && (NIL != key))
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                size_read = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    size_read = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        size_read = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue)
+    {
+        KeyValuePair_LocalDB_s search;
+        
+        if( itzam_btree_find( & pLldbHandler->btree, key, & search ) == itzam_true )
+        {
+            size_read = search.m_dataSize ;
+        }
+        else
+        {
+            size_read = PERS_COM_ERR_NOT_FOUND ;
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;
+    
+    return size_read;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+/* return no of bytes read, or negative value in case of error */
+static sint_t GetDataFromItzamLocalDB(sint_t dbHandler, pconststr_t key, pstr_t buffer_out, sint_t bufSize)
+{
+    bool_t bCanContinue = true ;
+    sint_t size_read = PERS_COM_FAILURE ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);;
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("bufsize=<<"); DLT_INT(bufSize); DLT_STRING(">> ... ")) ;
+
+    if(     (dbHandler >= 0)
+        &&  (NIL != key)
+        &&  (NIL != buffer_out)
+        &&  (bufSize > 0) )
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                size_read = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_DB != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    size_read = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        size_read = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    
+    if(bCanContinue)
+    {
+        KeyValuePair_LocalDB_s search;
+
+        if( itzam_btree_find( & pLldbHandler->btree, key, & search ) == itzam_true )
+        {
+            if( bufSize >= search.m_dataSize)
+            {
+                size_read = search.m_dataSize ;
+                (void)memcpy(buffer_out, search.m_data, (size_t)size_read) ;
+            }
+            else
+            {
+                size_read = PERS_COM_ERR_BUFFER_TOO_SMALL ;
+            }
+        }
+        else
+        {
+            size_read = PERS_COM_ERR_NOT_FOUND ;
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("bufsize=<<"); DLT_INT(bufSize); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;
+    
+    return size_read;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+static sint_t GetDataFromItzamRCT( sint_t dbHandler, pconststr_t key, PersistenceConfigurationKey_s* pConfig)
+{
+    bool_t bCanContinue = true ;
+    sint_t size_read = PERS_COM_FAILURE ;
+    lldb_handler_s* pLldbHandler = NIL ;
+    bool_t bLocked = false ;
+    str_t dbPathnameTemp[PERS_ORG_MAX_LENGTH_PATH_FILENAME] = "invalid path" ;
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">> ...")) ;
+
+    if(     (dbHandler >= 0)
+        &&  (NIL != key)
+        &&  (NIL != pConfig) )
+    {
+        if(lldb_handles_Lock())
+        {
+            bLocked = true ;
+            pLldbHandler = lldb_handles_FindInUseHandle(dbHandler) ;
+            if(NIL == pLldbHandler)
+            {
+                bCanContinue = false ;
+                size_read = PERS_COM_ERR_INVALID_PARAM ;
+            }
+            else
+            {
+                if(PersLldbPurpose_RCT != pLldbHandler->ePurpose)
+                {/* this would be very bad */
+                    bCanContinue = false ;
+                    size_read = PERS_COM_FAILURE ;
+                }
+                /* to not use DLT while mutex locked */
+                (void)strncpy(dbPathnameTemp, pLldbHandler->dbPathname, sizeof(dbPathnameTemp)) ;
+            }
+        }        
+    }
+    else
+    {
+        bCanContinue = false ;
+        size_read = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(bCanContinue)
+    {
+        KeyValuePair_RCT_s search;
+
+        if(itzam_true == itzam_btree_find( & pLldbHandler->btree, key, & search ) )
+        {
+            (void)memcpy(pConfig, &(search.m_data), sizeof(PersistenceConfigurationKey_s) );
+            size_read = sizeof(PersistenceConfigurationKey_s);
+        }
+        else
+        {
+            size_read = PERS_COM_ERR_NOT_FOUND ;
+        }
+    }
+
+    if(bLocked)
+    {
+        (void)lldb_handles_Unlock() ;
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("dbHandler="); DLT_INT(dbHandler);
+            DLT_STRING("<<"); DLT_STRING(dbPathnameTemp); DLT_STRING(">>, ");
+            DLT_STRING("key=<<"); DLT_STRING(key); DLT_STRING(">>, ");
+            DLT_STRING("retval=<"); DLT_INT(size_read); DLT_STRING(">")) ;
+    
+    return size_read;
+}/*DG C7MR2R-ISQP Metric 10-SSW_PersCommon_0001*/
+
+static bool_t lldb_handles_Lock(void)
+{
+    bool_t bEverythingOK = true ;
+    sint_t siErr = pthread_mutex_lock(&g_mutexLldb) ;
+    if(0 != siErr)
+    {
+        bEverythingOK = false ;
+        DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("pthread_mutex_lock failed with error=<"); DLT_INT(siErr); DLT_STRING(">")) ;
+    }
+
+    return bEverythingOK ;
+}
+
+static bool_t lldb_handles_Unlock(void)
+{
+    bool_t bEverythingOK = true ;
+    sint_t siErr = pthread_mutex_unlock (&g_mutexLldb) ;
+    if(0 != siErr)
+    {
+        bEverythingOK = false ;
+        DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+            DLT_STRING("pthread_mutex_unlock failed with error=<"); DLT_INT(siErr); DLT_STRING(">")) ;
+    }
+
+    return bEverythingOK ;
+}
+
+/* it is assumed dbHandler is checked by the caller */
+static lldb_handler_s* lldb_handles_FindInUseHandle(sint_t dbHandler)
+{
+    lldb_handler_s* pHandler = NIL ;
+    
+    if(dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES)
+    {
+        if(g_sHandlers.asStaticHandles[dbHandler].bIsAssigned)
+        {
+            pHandler = &g_sHandlers.asStaticHandles[dbHandler] ;
+        }
+    }
+    else
+    {
+        lldb_handles_list_el_s* pListElemCurrent = g_sHandlers.pListHead ;
+        while(NIL != pListElemCurrent)
+        {
+            if(dbHandler == pListElemCurrent->sHandle.dbHandler)
+            {
+                pHandler = &pListElemCurrent->sHandle;             
+                break ;
+            }
+            pListElemCurrent = pListElemCurrent->pNext ;
+        }
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+        DLT_STRING((NIL!=pHandler) ? "Found handler <" : "ERROR can't find handler <"); DLT_INT(dbHandler); DLT_STRING(">");
+        DLT_STRING((NIL!=pHandler) ? (dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "in static area" : "in dynamic list") : "")) ;
+
+    return pHandler ;
+}
+
+static lldb_handler_s* lldb_handles_FindAvailableHandle(void)
+{
+    bool_t bCanContinue = true ;
+    lldb_handler_s* pHandler = NIL ;
+    lldb_handles_list_el_s* psListElemNew = NIL ;
+
+    /* first try to find an available handle in the static area */
+    sint_t siIndex = 0 ;
+    for(siIndex = 0 ; siIndex <= PERS_LLDB_MAX_STATIC_HANDLES ; siIndex++)
+    {
+        if( ! g_sHandlers.asStaticHandles[siIndex].bIsAssigned)
+        {
+            /* index setting should be done only once at the initialization of the static array
+             * Anyway, doing it here is more consistent  */
+            g_sHandlers.asStaticHandles[siIndex].dbHandler = siIndex ;
+            pHandler = &g_sHandlers.asStaticHandles[siIndex] ;
+            break ;
+        }
+    }
+
+    if(NIL == pHandler)
+    {
+        /* no position available in the static array => we have to use the list
+         * allocate memory for the new element and process the situation when the list is headless */
+
+        psListElemNew = (lldb_handles_list_el_s*)malloc(sizeof(lldb_handles_list_el_s)) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1010*/
+        if(NIL == psListElemNew)
+        {
+            bCanContinue = false ;
+            DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+                DLT_STRING("malloc failed")) ;
+        }
+        else
+        {
+            if(NIL == g_sHandlers.pListHead)
+            {
+                /* the list not yet used/created, so use the new created element as the head */
+                g_sHandlers.pListHead = psListElemNew ;
+                g_sHandlers.pListHead->pNext = NIL ;
+                g_sHandlers.pListHead->sHandle.dbHandler = PERS_LLDB_MAX_STATIC_HANDLES + 1 ;
+                /* the rest of the members will be set by lldb_handles_InitHandle */
+                pHandler = &psListElemNew->sHandle;
+            }
+        }
+    }
+
+    if((NIL == pHandler) && bCanContinue)
+    {
+        /* no position available in the static array => we have to use the list
+         * the memory for psListElemNew has been allocated and the list has a head
+         * The new element has to get the smallest index 
+         * Now lets consider the situation when the head of the list has an index higher than (PERS_LLDB_MAX_STATIC_HANDLES + 1)
+         * => the list will have a new head !!! */
+        if(g_sHandlers.pListHead->sHandle.dbHandler > (PERS_LLDB_MAX_STATIC_HANDLES + 1))
+        {
+            psListElemNew->pNext = g_sHandlers.pListHead ;
+            psListElemNew->sHandle.dbHandler = PERS_LLDB_MAX_STATIC_HANDLES + 1 ;
+            /* the rest of the members will be set by lldb_handles_InitHandle */
+            g_sHandlers.pListHead = psListElemNew ;
+            pHandler = &psListElemNew->sHandle;
+        }
+    }
+
+    if((NIL == pHandler) && bCanContinue)
+    {
+        /* no position available in the static array => we have to use the list
+         * the memory for psListElemNew has been allocated and the list has a head (with the smallest index)
+         * The new element has to get the smallest available index 
+         * So will search for the first gap between two consecutive elements of the list and will introduce the new element between */
+        lldb_handles_list_el_s* pListElemCurrent1 = g_sHandlers.pListHead ;
+        lldb_handles_list_el_s* pListElemCurrent2 = pListElemCurrent1->pNext;
+        while(NIL != pListElemCurrent2)
+        {
+            if(pListElemCurrent2->sHandle.dbHandler - pListElemCurrent1->sHandle.dbHandler > 1)
+            {
+                /* found a gap => insert the element between and use the index next to pListElemCurrent1's */
+                psListElemNew->pNext = pListElemCurrent2 ;
+                psListElemNew->sHandle.dbHandler = pListElemCurrent1->sHandle.dbHandler + 1 ;
+                pListElemCurrent1->pNext = psListElemNew ;
+                pHandler = &psListElemNew->sHandle;
+                break ;
+            }
+            else
+            {
+                pListElemCurrent1 = pListElemCurrent2 ;
+                pListElemCurrent2 = pListElemCurrent2->pNext ;
+            }
+        }
+        if(NIL == pListElemCurrent2)
+        {
+            /* reached the end of the list => the list will have a new end */
+            psListElemNew->pNext = NIL ;
+            psListElemNew->sHandle.dbHandler = pListElemCurrent1->sHandle.dbHandler + 1 ;
+            pListElemCurrent1->pNext = psListElemNew ;
+            pHandler = &psListElemNew->sHandle;
+        }        
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+        DLT_STRING((NIL!=pHandler) ? "Found availble handler <" : "ERROR can't find available handler <"); 
+        DLT_INT((NIL!=pHandler) ? pHandler->dbHandler : (-1)); DLT_STRING(">");
+        DLT_STRING((NIL!=pHandler) ? (pHandler->dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "in static area" : "in dynamic list") : "") ) ;
+
+    return pHandler ;
+}/*DG C7MR2R-ISQP Metric 6-SSW_PersCommon_1011*/
+
+static void lldb_handles_InitHandle(lldb_handler_s* psHandle_inout, pers_lldb_purpose_e ePurpose, str_t const * dbPathname)
+{
+    psHandle_inout->bIsAssigned = true ;
+    psHandle_inout->ePurpose = ePurpose ;
+    (void)strncpy(psHandle_inout->dbPathname, dbPathname, sizeof(psHandle_inout->dbPathname)) ;
+}
+
+static bool_t lldb_handles_DeinitHandle(sint_t dbHandler)
+{
+    bool_t bEverythingOK = true ;
+    bool_t bHandlerFound = false ;
+        
+
+    if(dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES)
+    {
+        bHandlerFound = true ;
+        g_sHandlers.asStaticHandles[dbHandler].bIsAssigned = false ;
+    }
+    else
+    {
+        /* consider the situation when the handle is the head of the list */
+        if(NIL != g_sHandlers.pListHead)
+        {
+            if(dbHandler == g_sHandlers.pListHead->sHandle.dbHandler)
+            {
+                lldb_handles_list_el_s* pListElemTemp = NIL ;
+                
+                bHandlerFound = true ;
+                pListElemTemp = g_sHandlers.pListHead ;
+                g_sHandlers.pListHead = g_sHandlers.pListHead->pNext ;
+                free(pListElemTemp) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1012*/
+            }
+        }
+        else
+        {
+            bEverythingOK = false ;
+        }
+    }
+
+    if(bEverythingOK && ( ! bHandlerFound))
+    {
+        /* consider the situation when the handle is in the list (but not the head) */
+        lldb_handles_list_el_s* pListElemCurrent1 = g_sHandlers.pListHead ;
+        lldb_handles_list_el_s* pListElemCurrent2 = pListElemCurrent1->pNext;
+        while(NIL != pListElemCurrent2)
+        {
+            if(dbHandler == pListElemCurrent2->sHandle.dbHandler)
+            {
+                /* found the handle */
+                bHandlerFound = true ;
+                pListElemCurrent1->pNext = pListElemCurrent2->pNext ;
+                free(pListElemCurrent2) ; /*DG C7MR2R-MISRA-C:2004 Rule 20.4-SSW_PersCommon_1013*/
+                break ;
+            }
+            else
+            {
+                pListElemCurrent1 = pListElemCurrent2 ;
+                pListElemCurrent2 = pListElemCurrent2->pNext ;
+            }
+        }
+        if(NIL == pListElemCurrent2)
+        {
+            /* reached the end of the list without finding the handle */
+            bEverythingOK = false ;
+        }   
+    }
+
+    DLT_LOG(persComLldbDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":");
+        DLT_STRING("dbHandler=<"); DLT_INT(dbHandler); DLT_STRING("> ");
+        DLT_STRING(bEverythingOK ? (dbHandler <= PERS_LLDB_MAX_STATIC_HANDLES ? "deinit handler in static area" : "deinit handler in dynamic list") : "ERROR - handler not found") ) ;
+
+    return bEverythingOK ;
+}
index 5f5cc65..3fa7412 100644 (file)
-/**********************************************************************************************************************\r\r
-*\r\r
-* Copyright (C) 2012 Continental Automotive Systems, Inc.\r\r
-*\r\r
-* Author: Ionut.Ieremie@continental-corporation.com\r\r
-*\r\r
-* Implementation of persComRct.h\r\r
-*\r\r
-* This Source Code Form is subject to the terms of the Mozilla Public\r\r
-* License, v. 2.0. If a copy of the MPL was not distributed with this\r\r
-* file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\r
-*\r\r
-* Date             Author              Reason\r\r
-* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source\r\r
-* 2012.12.10       uidl9757            CSP_WZ#2060:  Created\r\r
-*\r\r
-**********************************************************************************************************************/\r\r
-\r\r
-#include "persComTypes.h"\r\r
-#include "string.h"\r\r
-\r\r
-#include "persComErrors.h"\r\r
-#include "persComDataOrg.h"\r\r
-#include "pers_low_level_db_access_if.h"\r\r
-#include "persComRct.h"\r\r
-\r\r
-/** \r\r
- * \brief Obtain a handler to RCT indicated by rctPathname\r\r
- * \note : RCT is created if it does not exist and (bForceCreationIfNotPresent != 0)\r\r
- *\r\r
- * \param rctPathname                   [in] absolute path to RCT (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)\r\r
- * \param bForceCreationIfNotPresent    [in] if !=0x0, the RCT is created if it does not exist\r\r
- *\r\r
- * \return >= 0 for valid handler, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctOpen(char const * rctPathname, unsigned char bForceCreationIfNotPresent)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(NIL != rctPathname)\r\r
-    {\r\r
-        if(strlen(rctPathname) >= PERS_ORG_MAX_LENGTH_PATH_FILENAME)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_open(rctPathname, PersLldbPurpose_RCT, bForceCreationIfNotPresent);\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief Close handler to RCT\r\r
- *\r\r
- * \param handlerRCT    [in] handler obtained with persComRctOpen\r\r
- *\r\r
- * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctClose(signed int handlerRCT)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(handlerRCT < 0)\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_close(handlerRCT) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-/**\r\r
- * \brief write a resourceID-value pair into RCT\r\r
- *\r\r
- * \param handlerRCT    [in] handler obtained with persComRctOpen\r\r
- * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
- * \param psConfig      [in] configuration for resourceID\r\r
- *\r\r
- * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctWrite(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s const * psConfig)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerRCT < 0)\r\r
-        ||  (NIL == resourceID)\r\r
-        ||  (NIL == psConfig)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_write_key(handlerRCT, PersLldbPurpose_RCT, resourceID, (pstr_t)psConfig, sizeof(PersistenceConfigurationKey_s)) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief read a resourceID's configuration from RCT\r\r
- *\r\r
- * \param handlerRCT    [in] handler obtained with persComRctOpen\r\r
- * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
- * \param psConfig_out  [out]where to return the configuration for resourceID\r\r
- *\r\r
- * \return read size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctRead(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s const * psConfig_out)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerRCT < 0)\r\r
-        ||  (NIL == resourceID)\r\r
-        ||  (NIL == psConfig_out)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_read_key(handlerRCT, PersLldbPurpose_RCT, resourceID, (pstr_t)psConfig_out, sizeof(PersistenceConfigurationKey_s)) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief delete a resourceID's configuration from RCT\r\r
- *\r\r
- * \param handlerRCT    [in] handler obtained with persComRctOpen\r\r
- * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
- *\r\r
- * \return 0 for success, or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctDelete(signed int handlerRCT, char const * resourceID)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerRCT < 0)\r\r
-        ||  (NIL == resourceID)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-    else\r\r
-    {\r\r
-        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)\r\r
-        {\r\r
-            iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-        }\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_delete_key(handlerRCT, PersLldbPurpose_RCT, resourceID) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief Find the buffer's size needed to accomodate the listing of resourceIDs in RCT\r\r
- *\r\r
- * \param handlerRCT    [in] handler obtained with persComRctOpen\r\r
- *\r\r
- * \return needed size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctGetSizeResourcesList(signed int handlerRCT)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(handlerRCT < 0)\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_get_size_keys_list(handlerRCT, PersLldbPurpose_RCT) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
-\r\r
-/**\r\r
- * \brief Get the list of the resourceIDs in RCT\r\r
- * \note : resourceIDs in the list are separated by '\0'\r\r
- *\r\r
- * \param handlerRCT        [in] handler obtained with persComRctOpen\r\r
- * \param listBuffer_out    [out]buffer where to return the list of resourceIDs\r\r
- * \param listBufferSize    [in] size of listBuffer_out\r\r
- *\r\r
- * \return list size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)\r\r
- */\r\r
-signed int persComRctGetResourcesList(signed int handlerRCT, char* listBuffer_out, signed int listBufferSize)\r\r
-{\r\r
-    sint_t iErrCode = PERS_COM_SUCCESS ;\r\r
-\r\r
-    if(     (handlerRCT < 0)\r\r
-        ||  (NIL == listBuffer_out)\r\r
-        ||  (listBufferSize <= 0)\r\r
-    )\r\r
-    {\r\r
-        iErrCode = PERS_COM_ERR_INVALID_PARAM ;\r\r
-    }\r\r
-\r\r
-    if(PERS_COM_SUCCESS == iErrCode)\r\r
-    {\r\r
-        iErrCode = pers_lldb_get_keys_list(handlerRCT, PersLldbPurpose_RCT, (pstr_t)listBuffer_out, listBufferSize) ;\r\r
-    }\r\r
-\r\r
-    return iErrCode ;\r\r
-}\r\r
-\r\r
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of persComRct.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date             Author              Reason
+* 2013.02.05       uidl9757            CSP_WZ#2220:  Adaptation for open source
+* 2012.12.10       uidl9757            CSP_WZ#2060:  Created
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "string.h"
+
+#include "persComErrors.h"
+#include "persComDataOrg.h"
+#include "pers_low_level_db_access_if.h"
+#include "persComRct.h"
+
+/** 
+ * \brief Obtain a handler to RCT indicated by rctPathname
+ * \note : RCT is created if it does not exist and (bForceCreationIfNotPresent != 0)
+ *
+ * \param rctPathname                   [in] absolute path to RCT (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+ * \param bForceCreationIfNotPresent    [in] if !=0x0, the RCT is created if it does not exist
+ *
+ * \return >= 0 for valid handler, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctOpen(char const * rctPathname, unsigned char bForceCreationIfNotPresent)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(NIL != rctPathname)
+    {
+        if(strlen(rctPathname) >= PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+    else
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_open(rctPathname, PersLldbPurpose_RCT, bForceCreationIfNotPresent);
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief Close handler to RCT
+ *
+ * \param handlerRCT    [in] handler obtained with persComRctOpen
+ *
+ * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctClose(signed int handlerRCT)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(handlerRCT < 0)
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_close(handlerRCT) ;
+    }
+
+    return iErrCode ;
+}
+
+/**
+ * \brief write a resourceID-value pair into RCT
+ *
+ * \param handlerRCT    [in] handler obtained with persComRctOpen
+ * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+ * \param psConfig      [in] configuration for resourceID
+ *
+ * \return 0 for success, negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctWrite(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s const * psConfig)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerRCT < 0)
+        ||  (NIL == resourceID)
+        ||  (NIL == psConfig)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_write_key(handlerRCT, PersLldbPurpose_RCT, resourceID, (pstr_t)psConfig, sizeof(PersistenceConfigurationKey_s)) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief read a resourceID's configuration from RCT
+ *
+ * \param handlerRCT    [in] handler obtained with persComRctOpen
+ * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+ * \param psConfig_out  [out]where to return the configuration for resourceID
+ *
+ * \return read size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctRead(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s const * psConfig_out)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerRCT < 0)
+        ||  (NIL == resourceID)
+        ||  (NIL == psConfig_out)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_read_key(handlerRCT, PersLldbPurpose_RCT, resourceID, (pstr_t)psConfig_out, sizeof(PersistenceConfigurationKey_s)) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief delete a resourceID's configuration from RCT
+ *
+ * \param handlerRCT    [in] handler obtained with persComRctOpen
+ * \param resourceID    [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+ *
+ * \return 0 for success, or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctDelete(signed int handlerRCT, char const * resourceID)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerRCT < 0)
+        ||  (NIL == resourceID)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+    else
+    {
+        if(strlen(resourceID) >= PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+        {
+            iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+        }
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_delete_key(handlerRCT, PersLldbPurpose_RCT, resourceID) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief Find the buffer's size needed to accomodate the listing of resourceIDs in RCT
+ *
+ * \param handlerRCT    [in] handler obtained with persComRctOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctGetSizeResourcesList(signed int handlerRCT)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(handlerRCT < 0)
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_get_size_keys_list(handlerRCT, PersLldbPurpose_RCT) ;
+    }
+
+    return iErrCode ;
+}
+
+
+/**
+ * \brief Get the list of the resourceIDs in RCT
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerRCT        [in] handler obtained with persComRctOpen
+ * \param listBuffer_out    [out]buffer where to return the list of resourceIDs
+ * \param listBufferSize    [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+signed int persComRctGetResourcesList(signed int handlerRCT, char* listBuffer_out, signed int listBufferSize)
+{
+    sint_t iErrCode = PERS_COM_SUCCESS ;
+
+    if(     (handlerRCT < 0)
+        ||  (NIL == listBuffer_out)
+        ||  (listBufferSize <= 0)
+    )
+    {
+        iErrCode = PERS_COM_ERR_INVALID_PARAM ;
+    }
+
+    if(PERS_COM_SUCCESS == iErrCode)
+    {
+        iErrCode = pers_lldb_get_keys_list(handlerRCT, PersLldbPurpose_RCT, (pstr_t)listBuffer_out, listBufferSize) ;
+    }
+
+    return iErrCode ;
+}
+