If no entry for a resource in prct the data will be put into local cached; A user...
authorIngo Huerner <ingo.huerner@xse.de>
Thu, 10 Jan 2013 11:00:49 +0000 (12:00 +0100)
committerIngo Huerner <ingo.huerner@xse.de>
Thu, 10 Jan 2013 11:00:49 +0000 (12:00 +0100)
include_protected/persistence_client_library_data_organization.h
src/persistence_client_library_file.c
src/persistence_client_library_prct_access.c
src/persistence_client_library_prct_access.h
test/persistence_client_library_test.c

index d026d3e..abd08e1 100644 (file)
@@ -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
 
index c825005..25b51b9 100644 (file)
@@ -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<numTokens-1; i++)
+            {
+               // create folders
+               strncat(createPath, "/", DbPathMaxLen-1);
+               strncat(createPath, tokenArray[i], DbPathMaxLen-1);
+               mkdir(createPath, 0744);
+            }
+            // finally create the file
+            strncat(createPath, "/", DbPathMaxLen-1);
+            strncat(createPath, tokenArray[i], DbPathMaxLen-1);
+            handle = open(createPath, O_CREAT|O_RDWR |O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+            if(handle != -1)
+            {
+               if(handle < MaxPersHandle)
+               {
+                  __sync_fetch_and_add(&gOpenFdArray[handle], FileOpen); // set open flag
+               }
+               else
+               {
+                  close(handle);
+                  handle = EPERS_MAXHANDLE;
+               }
+            }
+         }
+         else
+         {
+            printf("file_open ==> no valid path to create: %s\n", dbPath);
+         }
       }
    }
 
index 7330ccb..4507596 100644 (file)
@@ -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;
index 9632826..0a05c58 100644 (file)
@@ -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[]);
 
index f87c1b0..7b02d22 100644 (file)
@@ -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);