revise packaging
[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 #ifdef _CONTACTS_IPC_CLIENT
64         ctsvc_view_uri_init();
65 #endif
66
67         query->view_uri = strdup(view_uri);
68         query->properties = (property_info_s*)ctsvc_view_get_all_property_infos(view_uri, &query->property_count);
69         *out_query = (contacts_query_h)query;
70
71         return CONTACTS_ERROR_NONE;
72 }
73
74 EXPORT_API int contacts_query_set_projection(contacts_query_h query, unsigned int property_ids[], int count)
75 {
76         ctsvc_query_s *query_s;
77         int i;
78         bool find;
79
80         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
81         query_s = (ctsvc_query_s*)query;
82
83         for (i = 0; i < count; i++) {
84                 find = __ctsvc_query_property_check(query_s->properties, query_s->property_count,
85                                 QUERY_PROJECTION, property_ids[i]);
86                 RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
87                                 "property_id(%d) is not supported on view_uri(%s)", property_ids[i], query_s->view_uri);
88         }
89         if (query_s->projection)
90                 free(query_s->projection);
91
92         query_s->projection = calloc(count, sizeof(unsigned int));
93         if (NULL == query_s->projection) {
94                 /* LCOV_EXCL_START */
95                 ERR("calloc() Fail");
96                 return CONTACTS_ERROR_OUT_OF_MEMORY;
97                 /* LCOV_EXCL_STOP */
98         }
99         memcpy(query_s->projection, property_ids, sizeof(unsigned int) * count);
100         query_s->projection_count = count;
101
102         return CONTACTS_ERROR_NONE;
103 }
104
105 EXPORT_API int contacts_query_set_filter(contacts_query_h query, contacts_filter_h filter)
106 {
107         int ret;
108         ctsvc_query_s *s_query;
109         contacts_filter_h new_filter;
110
111         RETV_IF(NULL == query || NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER);
112         s_query = (ctsvc_query_s*)query;
113
114         ret = ctsvc_filter_clone(filter, &new_filter);
115         RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_filter_clone Fail(%d)", ret);
116         s_query->filter = (ctsvc_composite_filter_s*)new_filter;
117
118         return CONTACTS_ERROR_NONE;
119 }
120
121 EXPORT_API int contacts_query_set_sort(contacts_query_h query, unsigned int property_id, bool asc)
122 {
123         ctsvc_query_s *query_s;
124         bool find = false;
125
126         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
127         query_s = (ctsvc_query_s*)query;
128
129         find = __ctsvc_query_property_check(query_s->properties, query_s->property_count, QUERY_SORTKEY, property_id);
130         RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
131                         "property_id(%d) is not supported on view_uri(%s)", property_id, query_s->view_uri);
132         query_s->sort_property_id = property_id;
133         query_s->sort_asc = asc;
134
135         return CONTACTS_ERROR_NONE;
136 }
137
138 EXPORT_API int contacts_query_destroy(contacts_query_h query)
139 {
140         ctsvc_query_s *s_query;
141         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
142         s_query = (ctsvc_query_s*)query;
143
144 #ifdef _CONTACTS_IPC_CLIENT
145         ctsvc_view_uri_deinit();
146 #endif
147
148         if (s_query->filter)
149                 contacts_filter_destroy((contacts_filter_h)s_query->filter);
150
151         free(s_query->projection);
152         free(s_query->view_uri);
153         free(s_query);
154
155         return CONTACTS_ERROR_NONE;
156 }
157
158 EXPORT_API int contacts_query_set_distinct(contacts_query_h query, bool set)
159 {
160         ctsvc_query_s *query_s;
161
162         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
163         query_s = (ctsvc_query_s*)query;
164         query_s->distinct = set;
165
166         return CONTACTS_ERROR_NONE;
167 }
168