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