4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include "ctsvc_internal.h"
22 #include "ctsvc_filter.h"
27 } query_property_type_e;
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)
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)
51 EXPORT_API int contacts_query_create(const char *view_uri, contacts_query_h *out_query)
53 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
56 RETV_IF(NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER);
59 RETV_IF(NULL == view_uri || NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER);
61 query = calloc(1, sizeof(ctsvc_query_s));
62 RETV_IF(NULL == query, CONTACTS_ERROR_OUT_OF_MEMORY);
64 #ifdef _CONTACTS_IPC_CLIENT
65 ctsvc_view_uri_init();
68 query->view_uri = strdup(view_uri);
69 query->properties = (property_info_s*)ctsvc_view_get_all_property_infos(view_uri, &query->property_count);
70 *out_query = (contacts_query_h)query;
72 return CONTACTS_ERROR_NONE;
75 EXPORT_API int contacts_query_set_projection(contacts_query_h query, unsigned int property_ids[], int count)
77 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
78 ctsvc_query_s *query_s;
82 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
83 query_s = (ctsvc_query_s*)query;
85 for (i = 0; i < count; i++) {
86 find = __ctsvc_query_property_check(query_s->properties, query_s->property_count,
87 QUERY_PROJECTION, property_ids[i]);
88 RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
89 "property_id(%d) is not supported on view_uri(%s)", property_ids[i], query_s->view_uri);
91 if (query_s->projection)
92 free(query_s->projection);
94 query_s->projection = calloc(count, sizeof(unsigned int));
95 if (NULL == query_s->projection) {
98 return CONTACTS_ERROR_OUT_OF_MEMORY;
101 memcpy(query_s->projection, property_ids, sizeof(unsigned int) * count);
102 query_s->projection_count = count;
104 return CONTACTS_ERROR_NONE;
107 EXPORT_API int contacts_query_set_filter(contacts_query_h query, contacts_filter_h filter)
109 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
111 ctsvc_query_s *s_query;
112 ctsvc_composite_filter_s *s_filter;
113 contacts_filter_h new_filter;
115 RETV_IF(NULL == query || NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER);
116 s_query = (ctsvc_query_s*)query;
117 s_filter = (ctsvc_composite_filter_s*)filter;
118 if (s_query->view_uri && s_filter->view_uri && STRING_EQUAL != strcmp(s_query->view_uri, s_filter->view_uri))
119 return CONTACTS_ERROR_INVALID_PARAMETER;
121 ret = ctsvc_filter_clone(filter, &new_filter);
122 RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_filter_clone Fail(%d)", ret);
123 s_query->filter = (ctsvc_composite_filter_s*)new_filter;
125 return CONTACTS_ERROR_NONE;
128 EXPORT_API int contacts_query_set_sort(contacts_query_h query, unsigned int property_id, bool asc)
130 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
131 ctsvc_query_s *query_s;
134 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
135 query_s = (ctsvc_query_s*)query;
137 find = __ctsvc_query_property_check(query_s->properties, query_s->property_count, QUERY_SORTKEY, property_id);
138 RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
139 "property_id(%d) is not supported on view_uri(%s)", property_id, query_s->view_uri);
140 query_s->sort_property_id = property_id;
141 query_s->sort_asc = asc;
143 return CONTACTS_ERROR_NONE;
146 EXPORT_API int contacts_query_destroy(contacts_query_h query)
148 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
149 ctsvc_query_s *s_query;
150 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
151 s_query = (ctsvc_query_s*)query;
153 #ifdef _CONTACTS_IPC_CLIENT
154 ctsvc_view_uri_deinit();
158 contacts_filter_destroy((contacts_filter_h)s_query->filter);
160 free(s_query->projection);
161 free(s_query->view_uri);
164 return CONTACTS_ERROR_NONE;
167 EXPORT_API int contacts_query_set_distinct(contacts_query_h query, bool set)
169 CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
170 ctsvc_query_s *query_s;
172 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
173 query_s = (ctsvc_query_s*)query;
174 query_s->distinct = set;
176 return CONTACTS_ERROR_NONE;