GRASS GIS 8 Programmer's Manual  8.5.0dev(2025)-813c4202c3
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
19 static char ds = '-';
20 static 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  */
203 int db_convert_Cstring_to_value_datetime(const char *buf, int sqltype,
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
#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