GRASS 8 Programmer's Manual 8.6.0dev(2026)-ddeab64dbf
Loading...
Searching...
No Matches
datetime.c
Go to the documentation of this file.
1/*!
2 \file lib/db/dbmi_base/datetime.c
3
4 \brief DBMI Library (base) - datetime conversions
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 <stdio.h>
16#include <string.h>
17#include <grass/dbmi.h>
18
19static char ds = '-';
20static char ts = ':';
21
22/*!
23 \brief Convert datetime value into string
24
25 \param value pointer to dbValue
26 \param sqltype SQL data type
27 \param[out] string pointer to dbString
28
29 \return DB_OK on success
30 */
32 dbString *string)
33{
34 int to, from;
35 int year, month, day, hour, minute;
36 double seconds;
37 char *xs;
38 char buf[64];
39
41 return db_set_string(string, "CURRENT");
42
43 *buf = 0;
44
45 year = db_get_value_year(value);
46 month = db_get_value_month(value);
47 day = db_get_value_day(value);
48 hour = db_get_value_hour(value);
49 minute = db_get_value_minute(value);
50 seconds = db_get_value_seconds(value);
51 if (seconds < 10.0)
52 xs = "0";
53 else
54 xs = "";
55
56 db_interval_range(sqltype, &from, &to);
57 switch (from) {
58 case DB_YEAR:
59 switch (to) {
60 case DB_YEAR:
61 snprintf(buf, sizeof(buf), "%d", year);
62 break;
63 case DB_MONTH:
64 snprintf(buf, sizeof(buf), "%d%c%02d", year, ds, month);
65 break;
66 case DB_DAY:
67 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d", year, ds, month, ds,
68 day);
69 break;
70 case DB_HOUR:
71 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d %02d", year, ds, month,
72 ds, day, hour);
73 break;
74 case DB_MINUTE:
75 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d %02d%c%02d", year, ds,
76 month, ds, day, hour, ts, minute);
77 break;
78 case DB_SECOND:
79 case DB_FRACTION:
80 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d %02d%c%02d%c%s%.10g",
81 year, ds, month, ds, day, hour, ts, minute, ts, xs,
82 seconds);
83 break;
84 }
85 break;
86 case DB_MONTH:
87 switch (to) {
88 case DB_MONTH:
89 snprintf(buf, sizeof(buf), "%d", month);
90 break;
91 case DB_DAY:
92 snprintf(buf, sizeof(buf), "%02d%c%02d", month, ds, day);
93 break;
94 case DB_HOUR:
95 snprintf(buf, sizeof(buf), "%02d%c%02d %02d", month, ds, day, hour);
96 break;
97 case DB_MINUTE:
98 snprintf(buf, sizeof(buf), "%02d%c%02d %02d%c%02d", month, ds, day,
99 hour, ts, minute);
100 break;
101 case DB_SECOND:
102 case DB_FRACTION:
103 snprintf(buf, sizeof(buf), "%02d%c%02d %02d%c%02d%c%s%.10g", month,
104 ds, day, hour, ts, minute, ts, xs, seconds);
105 break;
106 }
107 break;
108 case DB_DAY:
109 switch (to) {
110 case DB_DAY:
111 snprintf(buf, sizeof(buf), "%02d", day);
112 break;
113 case DB_HOUR:
114 snprintf(buf, sizeof(buf), "%02d %02d", day, hour);
115 break;
116 case DB_MINUTE:
117 snprintf(buf, sizeof(buf), "%02d %02d%c%02d", day, hour, ts,
118 minute);
119 break;
120 case DB_SECOND:
121 case DB_FRACTION:
122 snprintf(buf, sizeof(buf), "%02d %02d%c%02d%c%s%.10g", day, hour,
123 ts, minute, ts, xs, seconds);
124 break;
125 }
126 break;
127 case DB_HOUR:
128 switch (to) {
129 case DB_HOUR:
130 snprintf(buf, sizeof(buf), "%02d", hour);
131 break;
132 case DB_MINUTE:
133 snprintf(buf, sizeof(buf), "%02d%c%02d", hour, ts, minute);
134 break;
135 case DB_SECOND:
136 case DB_FRACTION:
137 snprintf(buf, sizeof(buf), "%02d%c%02d%c%s%.10g", hour, ts, minute,
138 ts, xs, seconds);
139 break;
140 }
141 break;
142 case DB_MINUTE:
143 switch (to) {
144 case DB_MINUTE:
145 snprintf(buf, sizeof(buf), "%02d", minute);
146 break;
147 case DB_SECOND:
148 case DB_FRACTION:
149 snprintf(buf, sizeof(buf), "%02d%c%s%.10g", minute, ts, xs,
150 seconds);
151 break;
152 }
153 break;
154 case DB_SECOND:
155 case DB_FRACTION:
156 switch (to) {
157 case DB_SECOND:
158 case DB_FRACTION:
159 snprintf(buf, sizeof(buf), "%g", seconds);
160 break;
161 }
162 break;
163 default:
164 switch (sqltype) {
165 case DB_SQL_TYPE_DATE:
166 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d", year, ds, month, ds,
167 day);
168 break;
169 case DB_SQL_TYPE_TIME:
170 snprintf(buf, sizeof(buf), "%02d%c%02d%c%s%.10g", hour, ts, minute,
171 ts, xs, seconds);
172 break;
174 snprintf(buf, sizeof(buf), "%d%c%02d%c%02d %02d%c%02d%c%s%.10g",
175 year, ds, month, ds, day, hour, ts, minute, ts, xs,
176 seconds);
177 break;
178 }
179 }
180 return db_set_string(string, buf);
181}
182
183/*!
184 \brief Convert datetime string to value
185
186 The format of <em>buf</em> must be as follows
187 - buf == "CURRENT" in a case-insignificant fashion value is marked as current
188 - sqltype == DB_SQL_TYPE_DATE
189 "year*month*day"
190 - sqltype == DB_SQL_TYPE_TIME
191 "hour*minute*second"
192 - sqltype == DB_SQL_TYPE_TIMESTAMP
193 "year*month*day hour*minute*second"
194 - otherwise the to and from markings in sqltype are used,
195 where "*" represents any non-whitespace character
196
197 \param buf input string buffer
198 \param sqltype SQL data type
199 \param[out] value pointer to dbValue to be set
200
201 \return DB_OK
202 */
204 dbValue *value)
205{
206 int from, to;
207 int year, month, day, hour, minute;
208 double seconds;
209
210 year = month = day = 0;
211 hour = minute = 0;
212 seconds = 0;
213
214 if (db_nocase_compare(buf, "CURRENT")) {
216 return DB_OK;
217 }
218
219 db_interval_range(sqltype, &from, &to);
220 switch (from) {
221 case DB_YEAR:
222 switch (to) {
223 case DB_YEAR:
224 sscanf(buf, "%d", &year);
225 break;
226 case DB_MONTH:
227 sscanf(buf, "%d%*c%d", &year, &month);
228 break;
229 case DB_DAY:
230 sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
231 break;
232 case DB_HOUR:
233 sscanf(buf, "%d%*c%d%*c%d %d", &year, &month, &day, &hour);
234 break;
235 case DB_MINUTE:
236 sscanf(buf, "%d%*c%d%*c%d %d%*c%d", &year, &month, &day, &hour,
237 &minute);
238 break;
239 case DB_SECOND:
240 case DB_FRACTION:
241 sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf", &year, &month, &day,
242 &hour, &minute, &seconds);
243 break;
244 }
245 break;
246 case DB_MONTH:
247 switch (to) {
248 case DB_MONTH:
249 sscanf(buf, "%d", &month);
250 break;
251 case DB_DAY:
252 sscanf(buf, "%d%*c%d", &month, &day);
253 break;
254 case DB_HOUR:
255 sscanf(buf, "%d%*c%d %d", &month, &day, &hour);
256 break;
257 case DB_MINUTE:
258 sscanf(buf, "%d%*c%d %d%*c%d", &month, &day, &hour, &minute);
259 break;
260 case DB_SECOND:
261 case DB_FRACTION:
262 sscanf(buf, "%d%*c%d %d%*c%d%*c%lf", &month, &day, &hour, &minute,
263 &seconds);
264 break;
265 }
266 break;
267 case DB_DAY:
268 switch (to) {
269 case DB_DAY:
270 sscanf(buf, "%d", &day);
271 break;
272 case DB_HOUR:
273 sscanf(buf, "%d %d", &day, &hour);
274 break;
275 case DB_MINUTE:
276 sscanf(buf, "%d %d%*c%d", &day, &hour, &minute);
277 break;
278 case DB_SECOND:
279 case DB_FRACTION:
280 sscanf(buf, "%d %d%*c%d%*c%lf", &day, &hour, &minute, &seconds);
281 break;
282 }
283 break;
284 case DB_HOUR:
285 switch (to) {
286 case DB_HOUR:
287 sscanf(buf, "%d", &hour);
288 break;
289 case DB_MINUTE:
290 sscanf(buf, "%d%*c%d", &hour, &minute);
291 break;
292 case DB_SECOND:
293 case DB_FRACTION:
294 sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
295 break;
296 }
297 break;
298 case DB_MINUTE:
299 switch (to) {
300 case DB_MINUTE:
301 sscanf(buf, "%d", &minute);
302 break;
303 case DB_SECOND:
304 case DB_FRACTION:
305 sscanf(buf, "%d%*c%lf", &minute, &seconds);
306 break;
307 }
308 break;
309 case DB_SECOND:
310 case DB_FRACTION:
311 sscanf(buf, "%lf", &seconds);
312 break;
313 default:
314 switch (sqltype) {
315 case DB_SQL_TYPE_DATE:
316 sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
317 break;
318 case DB_SQL_TYPE_TIME:
319 sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
320 break;
322 sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf", &year, &month, &day,
323 &hour, &minute, &seconds);
324 break;
325 }
326 }
327
328 db_set_value_year(value, year);
329 db_set_value_month(value, month);
330 db_set_value_day(value, day);
331 db_set_value_hour(value, hour);
332 db_set_value_minute(value, minute);
333 db_set_value_seconds(value, seconds);
334
335 return DB_OK;
336}
int db_convert_value_datetime_into_string(dbValue *value, int sqltype, dbString *string)
Convert datetime value into string.
Definition datetime.c:31
int db_convert_Cstring_to_value_datetime(const char *buf, int sqltype, dbValue *value)
Convert datetime string to value.
Definition datetime.c:203
Main header of GRASS DataBase Management Interface.
#define DB_FRACTION
Definition dbmi.h:103
#define DB_SQL_TYPE_TIME
Definition dbmi.h:89
#define DB_MINUTE
Definition dbmi.h:101
#define DB_MONTH
Definition dbmi.h:98
#define DB_YEAR
Definition dbmi.h:97
#define DB_SQL_TYPE_DATE
Definition dbmi.h:88
#define DB_HOUR
Definition dbmi.h:100
#define DB_OK
Definition dbmi.h:71
#define DB_SQL_TYPE_TIMESTAMP
Definition dbmi.h:90
#define DB_DAY
Definition dbmi.h:99
#define DB_SECOND
Definition dbmi.h:102
int db_get_value_month(dbValue *)
Get month value.
Definition value.c:116
void db_set_value_hour(dbValue *, int)
Set hour value.
Definition value.c:267
int db_get_value_day(dbValue *)
Get day value.
Definition value.c:128
void db_set_value_datetime_current(dbValue *)
Set datetime to current.
Definition value.c:315
void db_set_value_year(dbValue *, int)
Set year value.
Definition value.c:231
double db_get_value_seconds(dbValue *)
Get seconds value.
Definition value.c:164
int db_get_value_year(dbValue *)
Get year value.
Definition value.c:104
int db_set_string(dbString *, const char *)
Inserts string to dbString (enlarge string)
Definition string.c:41
void db_set_value_minute(dbValue *, int)
Set minute value.
Definition value.c:279
void db_set_value_seconds(dbValue *, double)
Set seconds value.
Definition value.c:291
int db_get_value_hour(dbValue *)
Get hour value.
Definition value.c:140
int db_get_value_minute(dbValue *)
Get minute value.
Definition value.c:152
int db_nocase_compare(const char *, const char *)
Compare strings case-insensitive.
Definition case.c:69
int db_test_value_datetime_current(dbValue *)
Check if datatime is current.
Definition value.c:305
void db_set_value_day(dbValue *, int)
Set day value.
Definition value.c:255
void db_set_value_month(dbValue *, int)
Set month value.
Definition value.c:243
void db_interval_range(int, int *, int *)
Define range based on SQL data type.
Definition interval.c:24