12 const char * query_str="QUERY_STRING";
13 const char * uri_str="REQUEST_URI";
14 const char * method_str="REQUEST_METHOD";
15 const char * iotcloudroot_str="IOTCLOUD_ROOT";
16 const char * length_str="CONTENT_LENGTH";
18 IoTQuery::IoTQuery(FCGX_Request *request) :
29 requestsequencenumber(0),
30 numqueueentries(DEFAULT_SIZE),
34 IoTQuery::~IoTQuery() {
43 bool IoTQuery::checkDirectory() {
45 int err=stat(directory, &s);
48 return S_ISDIR(s.st_mode);
51 void IoTQuery::decodeQuery() {
52 int len=strlen(query);
53 char * str=new char[len+1];
54 memcpy(str, query, len+1);
58 char *command=strsep(&tok_ptr, "&");
59 if (strncmp(command, "putslot", 7) == 0)
62 if (strncmp(command, "getslot", 7) == 0)
65 /* Load Sequence Number for request */
66 char *sequencenumber_str = strsep(&tok_ptr, "&");
68 if (sequencenumber_str != NULL)
69 requestsequencenumber = strtoll(sequencenumber_str, NULL, 10);
71 /* Update size if we get request */
72 char * numqueueentries_str = tok_ptr;
73 if (numqueueentries_str != NULL)
74 numqueueentries = strtoll(numqueueentries_str, NULL, 10);
79 void doWrite(int fd, char *data, long long length) {
82 long long byteswritten=write(fd, &data[offset], length);
83 if (byteswritten > 0) {
84 length -= byteswritten;
85 offset += byteswritten;
87 cerr << "Bytes not written";
93 void IoTQuery::getSlot() {
97 void IoTQuery::putSlot() {
98 if (requestsequencenumber!=(newestentry+1)) {
103 int numberofliveslots=(int) ((newestentry-oldestentry)+1);
104 if (numberofliveslots >= numqueueentries) {
108 //write slot data out to file
109 char *filename = getSlotFileName(requestsequencenumber);
110 int slotfd = open(filename, O_CREAT|O_WRONLY, S_IRUSR| S_IWUSR);
111 doWrite(slotfd, data, length);
114 newestentry = requestsequencenumber; // update sequence number
115 updateStatusFile(); // update counts
118 char * IoTQuery::getSlotFileName(long long slot) {
119 int directorylen=strlen(directory);
120 char * filename=new char[25+directorylen];//19 digits for long number + 4 characters for SLOT + 1 character for null termination
121 snprintf(filename, 24+directorylen+1, "%s/SLOT%lld", directory, slot);
127 void IoTQuery::removeOldestSlot() {
128 if (oldestentry!=0) {
129 char * filename=getSlotFileName(oldestentry);
136 void IoTQuery::processQuery() {
141 if (strncmp(method, "POST", 4) != 0)
144 if (directory == NULL ||
148 if (!openStatusFile())
162 void IoTQuery::readData() {
164 data = new char[length+1];
165 memset(data, 0, length+1);
166 cin.read(data, length);
171 } while (!cin.eof());
174 void IoTQuery::getQuery() {
175 uri = FCGX_GetParam(uri_str, request->envp);
176 query = FCGX_GetParam(query_str, request->envp);
177 method = FCGX_GetParam(method_str, request->envp);
178 iotcloudroot = FCGX_GetParam(iotcloudroot_str, request->envp);
180 char * reqlength = FCGX_GetParam(length_str, request->envp);
182 length=strtoll(reqlength, NULL, 10);
188 void IoTQuery::getDirectory() {
189 char * split = strchr((char *)uri, '?');
192 int split_len = (int) (split-uri);
193 int rootdir_len = strlen(iotcloudroot);
194 int directory_len = split_len + rootdir_len + 1;
195 directory = new char[directory_len];
196 memcpy(directory, iotcloudroot, rootdir_len);
197 memcpy(directory + rootdir_len, uri, split_len);
198 directory[directory_len]=0;
201 int doread(int fd, void *ptr, size_t count, off_t offset) {
203 size_t bytesread=pread(fd, ptr, count, offset);
204 if (bytesread==count) {
206 } else if (bytesread==0) {
212 void IoTQuery::updateStatusFile() {
213 pwrite(fd, &numqueueentries, sizeof(numqueueentries), OFFSET_MAX);
214 pwrite(fd, &oldestentry, sizeof(oldestentry), OFFSET_OLD);
215 pwrite(fd, &newestentry, sizeof(newestentry), OFFSET_NEW);
218 bool IoTQuery::openStatusFile() {
219 char statusfile[]="queuestatus";
220 int len=strlen(directory);
222 char * filename=new char[len+sizeof(statusfile)+2];
223 memcpy(filename, directory, len);
225 memcpy(filename+len+1, statusfile, sizeof(statusfile));
226 filename[len+sizeof(statusfile)+1]=0;
227 fd=open(filename, O_CREAT| O_RDWR, S_IRUSR| S_IWUSR);
235 if (doread(fd, &size, sizeof(size), OFFSET_MAX))
236 numqueueentries=size;
241 if (doread(fd, &entry, sizeof(entry), OFFSET_OLD))
246 if (doread(fd, &entry, sizeof(entry), OFFSET_NEW))