more code
[iotcloud.git] / src / server / iotquery.cpp
index 89b98a90f076846f72e3bb51a24e62046880cd36..af5a9765ccc816a0c6da53ed725fb8a81a35497a 100644 (file)
@@ -25,15 +25,16 @@ IoTQuery::IoTQuery(FCGX_Request *request) :
   iotcloudroot(NULL),
   dir(NULL),
   length(0),
+  firstentry(0),
+  lastentry(0),
+  numqueueentries(DEFAULT_SIZE),
   fd(-1)
 {
 }
 
-
 IoTQuery::~IoTQuery() {
-  if (fd >= 0) {
+  if (fd >= 0)
     close(fd);
-  }
   if (directory)
     delete directory;
   if (data)
@@ -41,7 +42,15 @@ IoTQuery::~IoTQuery() {
   if (dir != NULL)
     closedir(dir);
 }
-  
+
+int IoTQuery::checkDirectory() {
+  struct stat s;
+  int err=stat(directory, &s);
+  if (-1 == err)
+    return 0;
+  return S_ISDIR(s.st_mode);
+}
+
 void IoTQuery::processQuery() {
   parseQuery();
   getDirectory();
@@ -51,14 +60,14 @@ void IoTQuery::processQuery() {
     return;
   
   if (directory == NULL ||
-      (dir = opendir(directory)) == NULL)
+      checkDirectory())
     return;
   
-  if (openMaxFile() < 0)
+  if (openStatusFile() < 0)
     return;
 
   flock(fd, LOCK_EX);
-      
+  
   cout << "Content-type: text/html\r\n"
        << "\r\n"
        << "<html>\n"
@@ -94,7 +103,6 @@ void IoTQuery::readData() {
   } while (!cin.eof());
 }
 
-
 void IoTQuery::parseQuery() {
   uri = FCGX_GetParam(uri_str, request->envp);
   query = FCGX_GetParam(query_str, request->envp);
@@ -122,16 +130,60 @@ void IoTQuery::getDirectory() {
   directory[directory_len]=0;
 }
 
-int IoTQuery::openMaxFile() {
-  char maxfile[]="queuesize";
+int doread(int fd, void *ptr, size_t count, off_t offset) {
+  do {
+    size_t bytesread=pread(fd, ptr, count, offset);
+    if (bytesread==count) {
+      return 1;
+    } else if (bytesread==0) {
+      return 0;
+    }
+  } while(1);  
+}
+
+void IoTQuery::updateStatusFile() {
+  pwrite(fd, &numqueueentries, sizeof(numqueueentries), OFFSET_MAX);
+  pwrite(fd, &firstentry, sizeof(firstentry), OFFSET_FIRST);
+  pwrite(fd, &lastentry, sizeof(lastentry), OFFSET_LAST);
+}
+
+int IoTQuery::openStatusFile() {
+  char statusfile[]="queuestatus";
   int len=strlen(directory);
 
-  char * filename=new char[len+sizeof(maxfile)+2];
+  char * filename=new char[len+sizeof(statusfile)+2];
   memcpy(filename, directory, len);
   filename[len]='/';
-  memcpy(filename+len+1, maxfile, sizeof(maxfile));
-  filename[len+sizeof(maxfile)+1]=0;
+  memcpy(filename+len+1, statusfile, sizeof(statusfile));
+  filename[len+sizeof(statusfile)+1]=0;
   fd=open(filename, O_CREAT| O_RDWR, S_IRUSR| S_IWUSR);
   delete filename;
+
+  if (fd < 0)
+    return fd;
+  
+  int size;
+  int needwrite=0;
+  if (doread(fd, &size, sizeof(size), OFFSET_MAX))
+    numqueueentries=size;
+  else
+    needwrite=1;
+
+  long entry;
+  if (doread(fd, &entry, sizeof(entry), OFFSET_FIRST))
+    firstentry=entry;
+  else
+    needwrite=1;
+
+  if (doread(fd, &entry, sizeof(entry), OFFSET_LAST))
+    lastentry=entry;
+  else
+    needwrite=1;
+      
+  if (needwrite)
+    updateStatusFile();
+  
   return fd;
 }
+
+