related sturct and queryparam
[platform/upstream/iotivity.git] / service / notification / src / provider / cache / linux / NSProviderMemoryCache.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSProviderMemoryCache.h"\r
22 \r
23 NSCacheList * NSStorageCreate()\r
24 {\r
25     pthread_mutex_lock(&NSCacheMutex);\r
26     NSCacheList * newList = (NSCacheList *) OICMalloc(sizeof(NSCacheList));\r
27     if (!newList)\r
28     {\r
29         pthread_mutex_unlock(&NSCacheMutex);\r
30         return NULL;\r
31     }\r
32 \r
33     newList->head = newList->tail = NULL;\r
34 \r
35     pthread_mutex_unlock(&NSCacheMutex);\r
36 \r
37     NS_LOG(DEBUG, "NSCacheCreate");\r
38 \r
39     return newList;\r
40 }\r
41 \r
42 NSCacheElement * NSStorageRead(NSCacheList * list, const char * findId)\r
43 {\r
44     pthread_mutex_lock(&NSCacheMutex);\r
45 \r
46     NS_LOG(DEBUG, "NSCacheRead - IN");\r
47 \r
48     NSCacheElement * iter = list->head;\r
49     NSCacheElement * next = NULL;\r
50     NSCacheType type = list->cacheType;\r
51 \r
52     NS_LOG_V(DEBUG, "Find ID - %s", findId);\r
53 \r
54     while (iter)\r
55     {\r
56         next = iter->next;\r
57 \r
58         if (NSProviderCompareIdCacheData(type, iter->data, findId))\r
59         {\r
60             NS_LOG(DEBUG, "Found in Cache");\r
61             pthread_mutex_unlock(&NSCacheMutex);\r
62             return iter;\r
63         }\r
64 \r
65         iter = next;\r
66     }\r
67 \r
68     NS_LOG(DEBUG, "Not found in Cache");\r
69     NS_LOG(DEBUG, "NSCacheRead - OUT");\r
70     pthread_mutex_unlock(&NSCacheMutex);\r
71 \r
72     return NULL;\r
73 }\r
74 \r
75 NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool state)\r
76 {\r
77     pthread_mutex_lock(&NSCacheMutex);\r
78 \r
79     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - IN");\r
80 \r
81     if (id == NULL)\r
82     {\r
83         NS_LOG(DEBUG, "id is NULL");\r
84         pthread_mutex_unlock(&NSCacheMutex);\r
85         return NS_ERROR;\r
86     }\r
87 \r
88     pthread_mutex_unlock(&NSCacheMutex);\r
89     NSCacheElement * it = NSStorageRead(list, id);\r
90     pthread_mutex_lock(&NSCacheMutex);\r
91 \r
92     if (it)\r
93     {\r
94         NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
95         if (strcmp(itData->id, id) == 0)\r
96         {\r
97             NS_LOG(DEBUG, "Update Data - IN");\r
98 \r
99             NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
100             NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
101             NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
102             NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
103 \r
104             NS_LOG_V(DEBUG, "update state = %d", state);\r
105 \r
106             itData->isWhite = state;\r
107 \r
108             NS_LOG(DEBUG, "Update Data - OUT");\r
109             pthread_mutex_unlock(&NSCacheMutex);\r
110             return NS_OK;\r
111         }\r
112     }\r
113     else\r
114     {\r
115         NS_LOG(DEBUG, "Not Found Data");\r
116     }\r
117 \r
118     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - OUT");\r
119     pthread_mutex_unlock(&NSCacheMutex);\r
120     return NS_ERROR;\r
121 }\r
122 \r
123 NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
124 {\r
125     pthread_mutex_lock(&NSCacheMutex);\r
126 \r
127     NSCacheType type = list->cacheType;\r
128 \r
129     NS_LOG(DEBUG, "NSCacheWrite - IN");\r
130 \r
131     if (newObj == NULL)\r
132     {\r
133         NS_LOG(DEBUG, "newObj is NULL - IN");\r
134         pthread_mutex_unlock(&NSCacheMutex);\r
135         return NS_ERROR;\r
136     }\r
137 \r
138     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
139     {\r
140         NS_LOG(DEBUG, "Type is SUBSCRIBER");\r
141 \r
142         NSCacheSubData * subData = (NSCacheSubData *) newObj->data;\r
143 \r
144         pthread_mutex_unlock(&NSCacheMutex);\r
145         NSCacheElement * it = NSStorageRead(list, subData->id);\r
146         pthread_mutex_lock(&NSCacheMutex);\r
147 \r
148         if (it)\r
149         {\r
150             NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
151 \r
152             if (strcmp(itData->id, subData->id) == 0)\r
153             {\r
154                 NS_LOG(DEBUG, "Update Data - IN");\r
155 \r
156                 NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
157                 NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
158                 NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
159                 NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
160 \r
161                 NS_LOG_V(DEBUG, "subData_ID = %s", subData->id);\r
162                 NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);\r
163                 NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);\r
164                 NS_LOG_V(DEBUG, "subData_IsWhite = %d", subData->isWhite);\r
165 \r
166                 if (itData->messageObId == 0)\r
167                 {\r
168                     itData->messageObId = subData->messageObId;\r
169                 }\r
170 \r
171                 if (itData->syncObId == 0)\r
172                 {\r
173                     itData->syncObId = subData->syncObId;\r
174                 }\r
175 \r
176                 NS_LOG(DEBUG, "Update Data - OUT");\r
177 \r
178                 pthread_mutex_unlock(&NSCacheMutex);\r
179                 return NS_OK;\r
180             }\r
181         }\r
182 \r
183     }\r
184     else if (type == NS_PROVIDER_CACHE_MESSAGE)\r
185     {\r
186         NS_LOG(DEBUG, "Type is MESSAGE");\r
187 \r
188         NSCacheMsgData * msgData = (NSCacheMsgData *) newObj->data;\r
189 \r
190         NSCacheElement * it = NSStorageRead(list, msgData->id);\r
191         if (it)\r
192         {\r
193             NSCacheMsgData * itData = (NSCacheMsgData *) it->data;\r
194 \r
195             if (strcmp(itData->id, msgData->id) == 0)\r
196             {\r
197 \r
198                 itData->messageType = msgData->messageType;\r
199                 NS_LOG(DEBUG, "Updated messageType");\r
200                 pthread_mutex_unlock(&NSCacheMutex);\r
201                 return NS_OK;\r
202 \r
203             }\r
204         }\r
205     }\r
206 \r
207     if (list->head == NULL)\r
208     {\r
209         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
210         list->head = list->tail = newObj;\r
211         pthread_mutex_unlock(&NSCacheMutex);\r
212         return NS_OK;\r
213     }\r
214 \r
215     list->tail = list->tail->next = newObj;\r
216     NS_LOG(DEBUG, "list->head is not NULL");\r
217     pthread_mutex_unlock(&NSCacheMutex);\r
218     return NS_OK;\r
219 }\r
220 \r
221 NSResult NSStorageDelete(NSCacheList * list, const char * delId)\r
222 {\r
223     pthread_mutex_lock(&NSCacheMutex);\r
224     NSCacheElement * prev = list->head;\r
225     NSCacheElement * del = list->head;\r
226 \r
227     NSCacheType type = list->cacheType;\r
228 \r
229     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
230     {\r
231         if (del == list->head) // first object\r
232         {\r
233             if (del == list->tail) // first object (one object)\r
234                 list->tail = del->next;\r
235 \r
236             list->head = del->next;\r
237 \r
238             NSProviderDeleteCacheData(type, del->data);\r
239             OICFree(del);\r
240             pthread_mutex_unlock(&NSCacheMutex);\r
241             return NS_OK;\r
242         }\r
243     }\r
244 \r
245     del = del->next;\r
246     while (del)\r
247     {\r
248         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
249         {\r
250             if (del == list->tail) // delete object same to last object\r
251                 list->tail = prev;\r
252 \r
253             prev->next = del->next;\r
254             NSProviderDeleteCacheData(type, del->data);\r
255             OICFree(del);\r
256             pthread_mutex_unlock(&NSCacheMutex);\r
257             return NS_OK;\r
258         }\r
259 \r
260         prev = del;\r
261         del = del->next;\r
262     }\r
263     pthread_mutex_unlock(&NSCacheMutex);\r
264     return NS_OK;\r
265 }\r
266 \r
267 NSResult NSStorageDestroy(NSCacheList * list)\r
268 {\r
269     NSCacheElement * iter = list->head;\r
270     NSCacheElement * next = NULL;\r
271 \r
272     NSCacheType type = list->cacheType;\r
273 \r
274     while (iter)\r
275     {\r
276         next = (NSCacheElement *) iter->next;\r
277 \r
278         NSProviderDeleteCacheData(type, iter->data);\r
279         OICFree(iter);\r
280 \r
281         iter = next;\r
282     }\r
283 \r
284     OICFree(list);\r
285 \r
286     return NS_OK;\r
287 }\r
288 \r
289 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
290 {\r
291     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
292 \r
293     if (data == NULL)\r
294     {\r
295         return false;\r
296     }\r
297 \r
298     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
299     {\r
300         NSCacheSubData * subData = (NSCacheSubData *) data;\r
301 \r
302 \r
303         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
304         NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
305 \r
306         if (strcmp(subData->id, id) == 0)\r
307         {\r
308             NS_LOG(DEBUG, "SubData is Same");\r
309             return true;\r
310         }\r
311 \r
312         NS_LOG(DEBUG, "Message Data is Not Same");\r
313         return false;\r
314 \r
315     }\r
316     else if (type == NS_PROVIDER_CACHE_MESSAGE)\r
317     {\r
318         NSCacheMsgData * msgData = (NSCacheMsgData *) data;\r
319 \r
320         if (strcmp(msgData->id, id) == 0)\r
321         {\r
322             NS_LOG(DEBUG, "Message Data is Same");\r
323             return true;\r
324         }\r
325 \r
326         NS_LOG(DEBUG, "Message Data is Not Same");\r
327         return false;\r
328     }\r
329 \r
330     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
331 \r
332     return false;\r
333 }\r
334 \r
335 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
336 {\r
337     if (data == NULL)\r
338     {\r
339         return NS_OK;\r
340     }\r
341 \r
342     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
343     {\r
344         NSCacheSubData * subData = (NSCacheSubData *) data;\r
345         if (subData->id)\r
346         {\r
347             OICFree(subData->id);\r
348             subData->id = NULL;\r
349         }\r
350 \r
351         OICFree(subData);\r
352 \r
353         return NS_OK;\r
354     }\r
355     else if (type == NS_PROVIDER_CACHE_MESSAGE)\r
356     {\r
357         NSCacheMsgData * msgData = (NSCacheMsgData *) data;\r
358 \r
359         if (msgData->id)\r
360         {\r
361             OICFree(msgData->id);\r
362             msgData->id = NULL;\r
363         }\r
364 \r
365         if (msgData->nsMessage)\r
366         {\r
367             NSFreeMessage(msgData->nsMessage);\r
368         }\r
369 \r
370         OICFree(msgData);\r
371 \r
372         return NS_OK;\r
373     }\r
374 \r
375     return NS_OK;\r
376 }\r
377 \r