change the path of socket & inotify file
[platform/core/pim/contacts-service.git] / common / ctsvc_query.c
1 /*
2  * Contacts Service
3  *
4  * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include "contacts.h"
21 #include "ctsvc_internal.h"
22 #include "ctsvc_filter.h"
23
24 typedef enum {
25         QUERY_SORTKEY,
26         QUERY_PROJECTION,
27 } query_property_type_e;
28
29 static bool __ctsvc_query_property_check(const property_info_s *properties,
30                 int count, query_property_type_e property_type, unsigned int property_id)
31 {
32         int i;
33
34         for (i = 0; i < count; i++) {
35                 property_info_s *p = (property_info_s*)&(properties[i]);
36                 if (property_id == p->property_id) {
37                         if (property_type == QUERY_PROJECTION) {
38                                 if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL ||
39                                                 p->property_type == CTSVC_SEARCH_PROPERTY_PROJECTION)
40                                         return true;
41                                 else
42                                         return false;
43                         } else {
44                                 return true;
45                         }
46                 }
47         }
48         return false;
49 }
50
51 EXPORT_API int contacts_query_create(const char *view_uri, contacts_query_h *out_query)
52 {
53         ctsvc_query_s *query;
54
55         RETV_IF(NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER);
56         *out_query = NULL;
57
58         RETV_IF(NULL == view_uri || NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER);
59
60         query = calloc(1, sizeof(ctsvc_query_s));
61         RETV_IF(NULL == query, CONTACTS_ERROR_OUT_OF_MEMORY);
62
63         query->view_uri = strdup(view_uri);
64         query->properties = (property_info_s*)ctsvc_view_get_all_property_infos(view_uri, &query->property_count);
65         *out_query = (contacts_query_h)query;
66
67         return CONTACTS_ERROR_NONE;
68 }
69
70 EXPORT_API int contacts_query_set_projection(contacts_query_h query, unsigned int property_ids[], int count)
71 {
72         ctsvc_query_s *query_s;
73         int i;
74         bool find;
75
76         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
77         query_s = (ctsvc_query_s*)query;
78
79         for (i = 0; i < count; i++) {
80                 find = __ctsvc_query_property_check(query_s->properties, query_s->property_count,
81                                 QUERY_PROJECTION, property_ids[i]);
82                 RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
83                                 "property_id(%d) is not supported on view_uri(%s)", property_ids[i], query_s->view_uri);
84         }
85         if (query_s->projection)
86                 free(query_s->projection);
87
88         query_s->projection = calloc(count, sizeof(unsigned int));
89         if (NULL == query_s->projection) {
90                 /* LCOV_EXCL_START */
91                 ERR("calloc() Fail");
92                 return CONTACTS_ERROR_OUT_OF_MEMORY;
93                 /* LCOV_EXCL_STOP */
94         }
95         memcpy(query_s->projection, property_ids, sizeof(unsigned int) * count);
96         query_s->projection_count = count;
97
98         return CONTACTS_ERROR_NONE;
99 }
100
101 EXPORT_API int contacts_query_set_filter(contacts_query_h query, contacts_filter_h filter)
102 {
103         int ret;
104         ctsvc_query_s *s_query;
105         contacts_filter_h new_filter;
106
107         RETV_IF(NULL == query || NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER);
108         s_query = (ctsvc_query_s*)query;
109
110         ret = ctsvc_filter_clone(filter, &new_filter);
111         RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_filter_clone Fail(%d)", ret);
112         s_query->filter = (ctsvc_composite_filter_s*)new_filter;
113
114         return CONTACTS_ERROR_NONE;
115 }
116
117 EXPORT_API int contacts_query_set_sort(contacts_query_h query, unsigned int property_id, bool asc)
118 {
119         ctsvc_query_s *query_s;
120         bool find = false;
121
122         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
123         query_s = (ctsvc_query_s*)query;
124
125         find = __ctsvc_query_property_check(query_s->properties, query_s->property_count, QUERY_SORTKEY, property_id);
126         RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
127                         "property_id(%d) is not supported on view_uri(%s)", property_id, query_s->view_uri);
128         query_s->sort_property_id = property_id;
129         query_s->sort_asc = asc;
130
131         return CONTACTS_ERROR_NONE;
132 }
133
134 EXPORT_API int contacts_query_destroy(contacts_query_h query)
135 {
136         ctsvc_query_s *s_query;
137         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
138         s_query = (ctsvc_query_s*)query;
139
140         if (s_query->filter)
141                 contacts_filter_destroy((contacts_filter_h)s_query->filter);
142
143         free(s_query->projection);
144         free(s_query->view_uri);
145         free(s_query);
146
147         return CONTACTS_ERROR_NONE;
148 }
149
150 EXPORT_API int contacts_query_set_distinct(contacts_query_h query, bool set)
151 {
152         ctsvc_query_s *query_s;
153
154         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
155         query_s = (ctsvc_query_s*)query;
156         query_s->distinct = set;
157
158         return CONTACTS_ERROR_NONE;
159 }
160