From 7b4f3e26c10b4efa12891c1ba6930823e797994d Mon Sep 17 00:00:00 2001 From: Ingo Huerner Date: Thu, 10 Jan 2013 12:00:49 +0100 Subject: [PATCH] If no entry for a resource in prct the data will be put into local cached; A user file that not exists will be now automatically created --- .../persistence_client_library_data_organization.h | 2 +- src/persistence_client_library_file.c | 61 +++++++++++++++++++++- src/persistence_client_library_prct_access.c | 15 +++++- src/persistence_client_library_prct_access.h | 2 +- test/persistence_client_library_test.c | 40 +++++++++++++- 5 files changed, 114 insertions(+), 6 deletions(-) diff --git a/include_protected/persistence_client_library_data_organization.h b/include_protected/persistence_client_library_data_organization.h index d026d3e..abd08e1 100644 --- a/include_protected/persistence_client_library_data_organization.h +++ b/include_protected/persistence_client_library_data_organization.h @@ -57,7 +57,7 @@ enum _PersistenceConstantDef PasMsg_Block = 1, /// persistence administration service block access PasMsg_WriteBack = 2, /// persistence administration service write_back PasMsg_Unblock = 4, /// persistence administration service unblock access - PasErrorStatus_RespPend = 88, /// persistence administration service msg return status + PasErrorStatus_RespPend = 50, /// persistence administration service msg return status PasErrorStatus_OK = 100, /// persistence administration service msg return status PasErrorStatus_FAIL = -1, /// persistence administration service msg return status diff --git a/src/persistence_client_library_file.c b/src/persistence_client_library_file.c index c825005..25b51b9 100644 --- a/src/persistence_client_library_file.c +++ b/src/persistence_client_library_file.c @@ -120,7 +120,66 @@ int file_open(unsigned int ldbid, const char* resource_id, unsigned int user_no, } else { - printf("file_open ERROR: %s \n", strerror(errno) ); + // file does not exist, create file and folder + + const char* delimiters = "/\n"; // search for blank and end of line + char* tokenArray[24]; + char createPath[DbPathMaxLen]; + int numTokens = 0; + int i = 0; + int validPath = 1; + + tokenArray[numTokens++] = strtok(dbPath, delimiters); + while(tokenArray[numTokens-1] != NULL ) + { + tokenArray[numTokens] = strtok(NULL, delimiters); + if(tokenArray[numTokens] != NULL) + { + numTokens++; + if(numTokens >= 24) + { + validPath = 0; + break; + } + } + else + { + break; + } + } + + if(validPath == 1) + { + memset(createPath, 0, DbPathMaxLen); + snprintf(createPath, DbPathMaxLen, "/%s",tokenArray[0] ); + for(i=1; i no valid path to create: %s\n", dbPath); + } } } diff --git a/src/persistence_client_library_prct_access.c b/src/persistence_client_library_prct_access.c index 7330ccb..4507596 100644 --- a/src/persistence_client_library_prct_access.c +++ b/src/persistence_client_library_prct_access.c @@ -135,6 +135,7 @@ int get_db_context(PersistenceInfo_s* dbContext, const char* resource_id, unsign //printf("get_db_context ==> data: %s\n", search.data); memset(dbContext->configKey.reponsible, 0, MaxConfKeyLengthResp); memset(dbContext->configKey.custom_name, 0, MaxConfKeyLengthCusName); + dbContext->configKey.policy = search.data.policy; dbContext->configKey.storage = search.data.storage; dbContext->configKey.permission = search.data.permission; @@ -167,8 +168,18 @@ int get_db_context(PersistenceInfo_s* dbContext, const char* resource_id, unsign if(resourceFound == 0) { - printf("get_db_context - error resource not found %s \n", resource_id); - rval = EPERS_NOKEY; + // + // resource NOT found in resource table ==> default is local cached + // + dbContext->configKey.policy = PersistencePolicy_wc; + dbContext->configKey.storage = PersistenceStorage_local; + dbContext->configKey.permission = 0; // TODO define default permission + dbContext->configKey.max_size = defaultMaxKeyValDataSize; + memcpy(dbContext->configKey.reponsible, "default", MaxConfKeyLengthResp); + memcpy(dbContext->configKey.custom_name, "default", MaxConfKeyLengthCusName); + //printf("get_db_context ==> R E S O U R C E N O T found: %s \n", resource_id); + + rval = get_db_path_and_key(dbContext, resource_id, isFile, dbKey, dbPath); } return rval; diff --git a/src/persistence_client_library_prct_access.h b/src/persistence_client_library_prct_access.h index 9632826..0a05c58 100644 --- a/src/persistence_client_library_prct_access.h +++ b/src/persistence_client_library_prct_access.h @@ -56,7 +56,7 @@ int get_db_path_and_key(PersistenceInfo_s* dbContext, const char* resource_id, u * @param dbPath the array where the database location path will be stored * @param cached_resource flag to identify if the resource is cached (value 1)or write through (value 0) * - * @return 0 or a negative value with one of the following errors: EPERS_NOKEY, EPERS_NOKEYDATA or EPERS_NOPRCTABLE + * @return 0 or a negative value with one of the following errors: EPERS_NOKEYDATA or EPERS_NOPRCTABLE */ int get_db_context(PersistenceInfo_s* dbContext, const char* resource_id, unsigned int isFile, char dbKey[], char dbPath[]); diff --git a/test/persistence_client_library_test.c b/test/persistence_client_library_test.c index f87c1b0..7b02d22 100644 --- a/test/persistence_client_library_test.c +++ b/test/persistence_client_library_test.c @@ -210,6 +210,37 @@ END_TEST +START_TEST(test_SetDataNoPRCT) +{ + int ret = 0; + unsigned char buffer[READ_SIZE]; + struct tm *locTime; + time_t t = time(0); + + char sysTimeBuffer[128]; + memset(buffer, 0, READ_SIZE); + + locTime = localtime(&t); + + snprintf(sysTimeBuffer, 128, "TimeAndData: \"%s %d.%d.%d - %d:%.2d:%.2d Uhr\"", dayOfWeek[locTime->tm_wday], locTime->tm_mday, locTime->tm_mon, (locTime->tm_year+1900), + locTime->tm_hour, locTime->tm_min, locTime->tm_sec); + + ret = key_write_data(0xFF, "NoPRCT", 1, 2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer)); + fail_unless(ret == strlen(sysTimeBuffer), "Wrong write size"); + printf("Write Buffer : %s\n", sysTimeBuffer); + + // read data again and and verify datat has been written correctly + memset(buffer, 0, READ_SIZE); + ret = key_read_data(0xFF, "NoPRCT", 1, 2, buffer, READ_SIZE); + fail_unless(strncmp((char*)buffer, sysTimeBuffer, strlen(sysTimeBuffer)) == 0, "Buffer not correctly read"); + fail_unless(ret == strlen(sysTimeBuffer), "Wrong read size"); + printf("read buffer : %s\n", buffer); + +} +END_TEST + + + START_TEST(test_GetDataSize) { int size = 0; @@ -308,7 +339,10 @@ START_TEST(test_DataFile) fail_unless(ret == 0, "File can't be removed ==> /media/mediaDBWrite.db"); fd = file_open(0xFF, "media/mediaDBWrite.db", 1, 1); - fail_unless(fd == -1, "File can be opend, but should not ==> /media/mediaDBWrite.db"); + fail_unless(fd != -1, "File can't be opend ==> /media/mediaDBWrite.db"); + + ret = file_remove(0xFF, "media/mediaDBWrite.db", 1, 1); + fail_unless(ret == 0, "File can't be removed ==> /media/mediaDBWrite.db"); // map file ------------------------------------------------------ @@ -507,6 +541,9 @@ static Suite * persistencyClientLib_suite() TCase * tc_persSetData = tcase_create("SetData"); tcase_add_test(tc_persSetData, test_SetData); + TCase * tc_persSetDataNoPRCT = tcase_create("SetDataNoPRCT"); + tcase_add_test(tc_persSetDataNoPRCT, test_SetDataNoPRCT); + TCase * tc_persGetDataSize = tcase_create("GetDataSize"); tcase_add_test(tc_persGetDataSize, test_GetDataSize); @@ -530,6 +567,7 @@ static Suite * persistencyClientLib_suite() suite_add_tcase(s, tc_persGetData); suite_add_tcase(s, tc_persSetData); + suite_add_tcase(s, tc_persSetDataNoPRCT); suite_add_tcase(s, tc_persGetDataSize); suite_add_tcase(s, tc_persDeleteData); suite_add_tcase(s, tc_persGetDataHandle); -- 2.7.4