1 /*!
2   \file lib/db/dbmi_base/value.c
3 
4   \brief DBMI Library (base) - value management
5 
6   (C) 1999-2009, 2011 by the GRASS Development Team
7 
8   This program is free software under the GNU General Public License
9   (>=v2). Read the file COPYING that comes with GRASS for details.
10 
11   \author Joel Jones (CERL/UIUC), Radim Blazek
12   \author Doxygenized by Martin Landa <landa.martin gmail.com> (2011)
13 */
14 
15 #include <stdlib.h>
16 #include <grass/dbmi.h>
17 
18 /*!
19   \brief Check of value is null
20 
21   \param value pointer to dbValue
22 
23   \return non-zero is null
24   \return zero is not null
25 */
db_test_value_isnull(dbValue * value)26 int db_test_value_isnull(dbValue * value)
27 {
28     return (value->isNull != 0);
29 }
30 
31 /*!
32   \brief Get integer value
33 
34   \param value pointer to dbValue
35 
36   \return value
37 */
db_get_value_int(dbValue * value)38 int db_get_value_int(dbValue * value)
39 {
40     return (value->i);
41 }
42 
43 /*!
44   \brief Get double precision value
45 
46   \param value pointer to dbValue
47 
48   \return value
49 */
db_get_value_double(dbValue * value)50 double db_get_value_double(dbValue * value)
51 {
52     return (value->d);
53 }
54 
55 /*!
56   \brief Get value as double
57 
58   For given value and C type of value returns double representation.
59 
60   \param value pointer to dbValue
61   \param ctype C data type
62 
63   \return value
64 */
db_get_value_as_double(dbValue * value,int ctype)65 double db_get_value_as_double(dbValue * value, int ctype)
66 {
67     double val;
68 
69     switch (ctype) {
70     case (DB_C_TYPE_INT):
71 	val = (double)db_get_value_int(value);
72 	break;
73     case (DB_C_TYPE_STRING):
74 	val = atof(db_get_value_string(value));
75 	break;
76     case (DB_C_TYPE_DOUBLE):
77 	val = db_get_value_double(value);
78 	break;
79     default:
80 	val = 0;
81     }
82     return val;
83 }
84 
85 /*!
86   \brief Get string value
87 
88   \param value pointer to dbValue
89 
90   \return value
91 */
db_get_value_string(dbValue * value)92 const char *db_get_value_string(dbValue * value)
93 {
94     return (db_get_string(&value->s));
95 }
96 
97 /*!
98   \brief Get year value
99 
100   \param value pointer to dbValue
101 
102   \return value
103 */
db_get_value_year(dbValue * value)104 int db_get_value_year(dbValue * value)
105 {
106     return (value->t.year);
107 }
108 
109 /*!
110   \brief Get month value
111 
112   \param value pointer to dbValue
113 
114   \return value
115 */
db_get_value_month(dbValue * value)116 int db_get_value_month(dbValue * value)
117 {
118     return (value->t.month);
119 }
120 
121 /*!
122   \brief Get day value
123 
124   \param value pointer to dbValue
125 
126   \return value
127 */
db_get_value_day(dbValue * value)128 int db_get_value_day(dbValue * value)
129 {
130     return (value->t.day);
131 }
132 
133 /*!
134   \brief Get hour value
135 
136   \param value pointer to dbValue
137 
138   \return value
139 */
db_get_value_hour(dbValue * value)140 int db_get_value_hour(dbValue * value)
141 {
142     return (value->t.hour);
143 }
144 
145 /*!
146   \brief Get minute value
147 
148   \param value pointer to dbValue
149 
150   \return value
151 */
db_get_value_minute(dbValue * value)152 int db_get_value_minute(dbValue * value)
153 {
154     return (value->t.minute);
155 }
156 
157 /*!
158   \brief Get seconds value
159 
160   \param value pointer to dbValue
161 
162   \return value
163 */
db_get_value_seconds(dbValue * value)164 double db_get_value_seconds(dbValue * value)
165 {
166     return (value->t.seconds);
167 }
168 
169 /*!
170   \brief Set value to null
171 
172   \param value pointer to dbValue
173 */
db_set_value_null(dbValue * value)174 void db_set_value_null(dbValue * value)
175 {
176     value->isNull = 1;
177 }
178 
179 /*!
180   \brief Set value to not null
181 
182   \param value pointer to dbValue
183 */
db_set_value_not_null(dbValue * value)184 void db_set_value_not_null(dbValue * value)
185 {
186     value->isNull = 0;
187 }
188 
189 /*!
190   \brief Set integer value
191 
192   \param value pointer to dbValue
193   \param i integer value
194 */
db_set_value_int(dbValue * value,int i)195 void db_set_value_int(dbValue * value, int i)
196 {
197     value->i = i;
198     db_set_value_not_null(value);
199 }
200 
201 /*!
202   \brief Set double precision value
203 
204   \param value pointer to dbValue
205   \param d double value
206 */
db_set_value_double(dbValue * value,double d)207 void db_set_value_double(dbValue * value, double d)
208 {
209     value->d = d;
210     db_set_value_not_null(value);
211 }
212 
213 /*!
214   \brief Set string value
215 
216   \param value pointer to dbValue
217   \param s string value
218 */
db_set_value_string(dbValue * value,const char * s)219 int db_set_value_string(dbValue * value, const char *s)
220 {
221     db_set_value_not_null(value);
222     return db_set_string(&value->s, s);
223 }
224 
225 /*!
226   \brief Set year value
227 
228   \param value pointer to dbValue
229   \param year year value
230 */
db_set_value_year(dbValue * value,int year)231 void db_set_value_year(dbValue * value, int year)
232 {
233     value->t.year = year;
234     db_set_value_datetime_not_current(value);
235 }
236 
237 /*!
238   \brief Set month value
239 
240   \param value pointer to dbValue
241   \param month month value
242 */
db_set_value_month(dbValue * value,int month)243 void db_set_value_month(dbValue * value, int month)
244 {
245     value->t.month = month;
246     db_set_value_datetime_not_current(value);
247 }
248 
249 /*!
250   \brief Set day value
251 
252   \param value pointer to dbValue
253   \param day day value
254 */
db_set_value_day(dbValue * value,int day)255 void db_set_value_day(dbValue * value, int day)
256 {
257     value->t.day = day;
258     db_set_value_datetime_not_current(value);
259 }
260 
261 /*!
262   \brief Set hour value
263 
264   \param value pointer to dbValue
265   \param hour hour value
266 */
db_set_value_hour(dbValue * value,int hour)267 void db_set_value_hour(dbValue * value, int hour)
268 {
269     value->t.hour = hour;
270     db_set_value_datetime_not_current(value);
271 }
272 
273 /*!
274   \brief Set minute value
275 
276   \param value pointer to dbValue
277   \param minute minute value
278 */
db_set_value_minute(dbValue * value,int minute)279 void db_set_value_minute(dbValue * value, int minute)
280 {
281     value->t.minute = minute;
282     db_set_value_datetime_not_current(value);
283 }
284 
285 /*!
286   \brief Set seconds value
287 
288   \param value pointer to dbValue
289   \param seconds seconds value
290 */
db_set_value_seconds(dbValue * value,double seconds)291 void db_set_value_seconds(dbValue * value, double seconds)
292 {
293     value->t.seconds = seconds;
294     db_set_value_datetime_not_current(value);
295 }
296 
297 /*!
298   \brief Check if datatime is current
299 
300   \param value pointer to dbValue
301 
302   \return non-zero for true
303   \return zero for false
304 */
db_test_value_datetime_current(dbValue * value)305 int db_test_value_datetime_current(dbValue * value)
306 {
307     return (value->t.current != 0);
308 }
309 
310 /*!
311   \brief Set datetime to current
312 
313   \param value pointer to dbValue
314 */
db_set_value_datetime_current(dbValue * value)315 void db_set_value_datetime_current(dbValue * value)
316 {
317     value->t.current = 1;
318     db_set_value_not_null(value);
319 }
320 
321 /*!
322   \brief Set value to non-current
323 
324   \param value pointer to dbValue
325 */
db_set_value_datetime_not_current(dbValue * value)326 void db_set_value_datetime_not_current(dbValue * value)
327 {
328     value->t.current = 0;
329     db_set_value_not_null(value);
330 }
331 
332 /*!
333   \brief Copy value
334 
335   Copy value from src to destination
336 
337   \param dst destination dbValue
338   \param src source dbValue
339 */
db_copy_value(dbValue * dst,dbValue * src)340 void db_copy_value(dbValue * dst, dbValue * src)
341 {
342     dst->isNull = src->isNull;
343     dst->i = src->i;
344     dst->d = src->d;
345     if (src->s.nalloc > 0)
346 	db_copy_string(&(dst->s), &(src->s));
347     dst->t.current = src->t.current;
348     dst->t.year = src->t.year;
349     dst->t.month = src->t.month;
350     dst->t.day = src->t.day;
351     dst->t.hour = src->t.hour;
352     dst->t.minute = src->t.minute;
353     dst->t.seconds = src->t.seconds;
354 }
355 
356 /*!
357   \brief Initialize dbCatValArray
358 
359   \param arr pointer to dbCatValArray to be initialized
360 */
db_CatValArray_init(dbCatValArray * arr)361 void db_CatValArray_init(dbCatValArray * arr)
362 {
363     arr->n_values = 0;
364     arr->alloc = 0;
365     arr->value = NULL;
366 }
367 
368 /*!
369   \brief Free allocated dbCatValArray
370 
371   \param arr pointer to dbCatValArray
372 */
db_CatValArray_free(dbCatValArray * arr)373 void db_CatValArray_free(dbCatValArray * arr)
374 {
375     if (arr->ctype == DB_C_TYPE_STRING || arr->ctype == DB_C_TYPE_DATETIME) {
376 	int i;
377 
378 	for (i = 0; i < arr->n_values; i++) {
379 	    if (arr->ctype == DB_C_TYPE_STRING && arr->value[i].val.s) {
380 		db_free_string(arr->value[i].val.s);
381 	    }
382 	    if (arr->ctype == DB_C_TYPE_DATETIME && arr->value[i].val.t) {
383 		db_free(arr->value[i].val.t);
384 	    }
385 	}
386     }
387 
388     G_free(arr->value);
389 }
390 
391 /*!
392   \brief Allocate dbCatValArray
393 
394   \todo return type void?
395 
396   \param arr pointer to dbCatValArray
397   \param n number of items
398 
399   \return DB_OK
400 */
db_CatValArray_alloc(dbCatValArray * arr,int n)401 int db_CatValArray_alloc(dbCatValArray * arr, int n)
402 {
403     arr->value = (dbCatVal *) G_calloc(n, sizeof(dbCatVal));
404 
405     arr->alloc = n;
406 
407     return DB_OK;
408 }
409 
410 /*!
411   \brief Realloc dbCatValArray
412 
413   \todo return code void?
414 
415   \param arr pointer to dbCatValArray
416   \param n number of items
417 
418   \return DB_OK
419 */
db_CatValArray_realloc(dbCatValArray * arr,int n)420 int db_CatValArray_realloc(dbCatValArray * arr, int n)
421 {
422     arr->value = (dbCatVal *) G_realloc(arr->value, n * sizeof(dbCatVal));
423 
424     arr->alloc = n;
425 
426     return DB_OK;
427 }
428