datetime.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <grass/dbmi.h>
  4. static char ds = '-';
  5. static char ts = ':';
  6. /*!
  7. \fn
  8. \brief
  9. \return
  10. \param
  11. */
  12. int db_convert_value_datetime_into_string(dbValue * value, int sqltype,
  13. dbString * string)
  14. {
  15. int to, from;
  16. int year, month, day, hour, minute;
  17. double seconds;
  18. char *xs;
  19. char buf[64];
  20. if (db_test_value_datetime_current(value))
  21. return db_set_string(string, "CURRENT");
  22. *buf = 0;
  23. year = db_get_value_year(value);
  24. month = db_get_value_month(value);
  25. day = db_get_value_day(value);
  26. hour = db_get_value_hour(value);
  27. minute = db_get_value_minute(value);
  28. seconds = db_get_value_seconds(value);
  29. if (seconds < 10.0)
  30. xs = "0";
  31. else
  32. xs = "";
  33. db_interval_range(sqltype, &from, &to);
  34. switch (from) {
  35. case DB_YEAR:
  36. switch (to) {
  37. case DB_YEAR:
  38. sprintf(buf, "%d", year);
  39. break;
  40. case DB_MONTH:
  41. sprintf(buf, "%d%c%02d", year, ds, month);
  42. break;
  43. case DB_DAY:
  44. sprintf(buf, "%d%c%02d%c%02d", year, ds, month, ds, day);
  45. break;
  46. case DB_HOUR:
  47. sprintf(buf, "%d%c%02d%c%02d %02d", year, ds, month, ds, day, hour);
  48. break;
  49. case DB_MINUTE:
  50. sprintf(buf, "%d%c%02d%c%02d %02d%c%02d",
  51. year, ds, month, ds, day, hour, ts, minute);
  52. break;
  53. case DB_SECOND:
  54. case DB_FRACTION:
  55. sprintf(buf, "%d%c%02d%c%02d %02d%c%02d%c%s%.10g",
  56. year, ds, month, ds, day, hour, ts, minute, ts, xs,
  57. seconds);
  58. break;
  59. }
  60. break;
  61. case DB_MONTH:
  62. switch (to) {
  63. case DB_MONTH:
  64. sprintf(buf, "%d", month);
  65. break;
  66. case DB_DAY:
  67. sprintf(buf, "%02d%c%02d", month, ds, day);
  68. break;
  69. case DB_HOUR:
  70. sprintf(buf, "%02d%c%02d %02d", month, ds, day, hour);
  71. break;
  72. case DB_MINUTE:
  73. sprintf(buf, "%02d%c%02d %02d%c%02d", month, ds, day, hour, ts, minute);
  74. break;
  75. case DB_SECOND:
  76. case DB_FRACTION:
  77. sprintf(buf, "%02d%c%02d %02d%c%02d%c%s%.10g",
  78. month, ds, day, hour, ts, minute, ts, xs, seconds);
  79. break;
  80. }
  81. break;
  82. case DB_DAY:
  83. switch (to) {
  84. case DB_DAY:
  85. sprintf(buf, "%02d", day);
  86. break;
  87. case DB_HOUR:
  88. sprintf(buf, "%02d %02d", day, hour);
  89. break;
  90. case DB_MINUTE:
  91. sprintf(buf, "%02d %02d%c%02d", day, hour, ts, minute);
  92. break;
  93. case DB_SECOND:
  94. case DB_FRACTION:
  95. sprintf(buf, "%02d %02d%c%02d%c%s%.10g",
  96. day, hour, ts, minute, ts, xs, seconds);
  97. break;
  98. }
  99. break;
  100. case DB_HOUR:
  101. switch (to) {
  102. case DB_HOUR:
  103. sprintf(buf, "%02d", hour);
  104. break;
  105. case DB_MINUTE:
  106. sprintf(buf, "%02d%c%02d", hour, ts, minute);
  107. break;
  108. case DB_SECOND:
  109. case DB_FRACTION:
  110. sprintf(buf, "%02d%c%02d%c%s%.10g", hour, ts, minute, ts, xs,
  111. seconds);
  112. break;
  113. }
  114. break;
  115. case DB_MINUTE:
  116. switch (to) {
  117. case DB_MINUTE:
  118. sprintf(buf, "%02d", minute);
  119. break;
  120. case DB_SECOND:
  121. case DB_FRACTION:
  122. sprintf(buf, "%02d%c%s%.10g", minute, ts, xs, seconds);
  123. break;
  124. }
  125. break;
  126. case DB_SECOND:
  127. case DB_FRACTION:
  128. switch (to) {
  129. case DB_SECOND:
  130. case DB_FRACTION:
  131. sprintf(buf, "%g", seconds);
  132. break;
  133. }
  134. break;
  135. default:
  136. switch (sqltype) {
  137. case DB_SQL_TYPE_DATE:
  138. sprintf(buf, "%d%c%02d%c%02d", year, ds, month, ds, day);
  139. break;
  140. case DB_SQL_TYPE_TIME:
  141. sprintf(buf, "%02d%c%02d%c%s%.10g",
  142. hour, ts, minute, ts, xs, seconds);
  143. break;
  144. case DB_SQL_TYPE_TIMESTAMP:
  145. sprintf(buf, "%d%c%02d%c%02d %02d%c%02d%c%s%.10g",
  146. year, ds, month, ds, day, hour, ts, minute, ts, xs,
  147. seconds);
  148. break;
  149. }
  150. }
  151. return db_set_string(string, buf);
  152. }
  153. /*!
  154. \fn
  155. \brief
  156. \return
  157. \param
  158. */
  159. /* NAME: db_convert_Cstring_to_value_datetime
  160. * INPUT: buf, a C string formated as indicated by sqltype, value, a dbValue
  161. * to put the converted value into
  162. * OUTPUT: the converted datetime value in value
  163. * PROCESSING: the format of buf must be as follows
  164. * buf == "CURRENT" in a case-insignificant fashion
  165. * value is marked as current
  166. * sqltype == DB_SQL_TYPE_DATE
  167. * "year*month*day"
  168. * sqltype == DB_SQL_TYPE_TIME
  169. * "hour*minute*second"
  170. * sqltype == DB_SQL_TYPE_TIMESTAMP
  171. * "year*month*day hour*minute*second"
  172. * otherwise the to and from markings in sqltype are used.
  173. * where "*" represents any non-whitespace character
  174. */
  175. int db_convert_Cstring_to_value_datetime(const char *buf, int sqltype,
  176. dbValue * value)
  177. {
  178. int from, to;
  179. int year, month, day, hour, minute;
  180. double seconds;
  181. year = month = day = 0;
  182. hour = minute = 0;
  183. seconds = 0;
  184. if (db_nocase_compare(buf, "CURRENT")) {
  185. db_set_value_datetime_current(value);
  186. return DB_OK;
  187. }
  188. db_interval_range(sqltype, &from, &to);
  189. switch (from) {
  190. case DB_YEAR:
  191. switch (to) {
  192. case DB_YEAR:
  193. sscanf(buf, "%d", &year);
  194. break;
  195. case DB_MONTH:
  196. sscanf(buf, "%d%*c%d", &year, &month);
  197. break;
  198. case DB_DAY:
  199. sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
  200. break;
  201. case DB_HOUR:
  202. sscanf(buf, "%d%*c%d%*c%d %d", &year, &month, &day, &hour);
  203. break;
  204. case DB_MINUTE:
  205. sscanf(buf, "%d%*c%d%*c%d %d%*c%d",
  206. &year, &month, &day, &hour, &minute);
  207. break;
  208. case DB_SECOND:
  209. case DB_FRACTION:
  210. sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf",
  211. &year, &month, &day, &hour, &minute, &seconds);
  212. break;
  213. }
  214. break;
  215. case DB_MONTH:
  216. switch (to) {
  217. case DB_MONTH:
  218. sscanf(buf, "%d", &month);
  219. break;
  220. case DB_DAY:
  221. sscanf(buf, "%d%*c%d", &month, &day);
  222. break;
  223. case DB_HOUR:
  224. sscanf(buf, "%d%*c%d %d", &month, &day, &hour);
  225. break;
  226. case DB_MINUTE:
  227. sscanf(buf, "%d%*c%d %d%*c%d", &month, &day, &hour, &minute);
  228. break;
  229. case DB_SECOND:
  230. case DB_FRACTION:
  231. sscanf(buf, "%d%*c%d %d%*c%d%*c%lf",
  232. &month, &day, &hour, &minute, &seconds);
  233. break;
  234. }
  235. break;
  236. case DB_DAY:
  237. switch (to) {
  238. case DB_DAY:
  239. sscanf(buf, "%d", &day);
  240. break;
  241. case DB_HOUR:
  242. sscanf(buf, "%d %d", &day, &hour);
  243. break;
  244. case DB_MINUTE:
  245. sscanf(buf, "%d %d%*c%d", &day, &hour, &minute);
  246. break;
  247. case DB_SECOND:
  248. case DB_FRACTION:
  249. sscanf(buf, "%d %d%*c%d%*c%lf", &day, &hour, &minute, &seconds);
  250. break;
  251. }
  252. break;
  253. case DB_HOUR:
  254. switch (to) {
  255. case DB_HOUR:
  256. sscanf(buf, "%d", &hour);
  257. break;
  258. case DB_MINUTE:
  259. sscanf(buf, "%d%*c%d", &hour, &minute);
  260. break;
  261. case DB_SECOND:
  262. case DB_FRACTION:
  263. sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
  264. break;
  265. }
  266. break;
  267. case DB_MINUTE:
  268. switch (to) {
  269. case DB_MINUTE:
  270. sscanf(buf, "%d", &minute);
  271. break;
  272. case DB_SECOND:
  273. case DB_FRACTION:
  274. sscanf(buf, "%d%*c%lf", &minute, &seconds);
  275. break;
  276. }
  277. break;
  278. case DB_SECOND:
  279. case DB_FRACTION:
  280. sscanf(buf, "%lf", &seconds);
  281. break;
  282. default:
  283. switch (sqltype) {
  284. case DB_SQL_TYPE_DATE:
  285. sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
  286. break;
  287. case DB_SQL_TYPE_TIME:
  288. sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
  289. break;
  290. case DB_SQL_TYPE_TIMESTAMP:
  291. sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf",
  292. &year, &month, &day, &hour, &minute, &seconds);
  293. break;
  294. }
  295. }
  296. db_set_value_year(value, year);
  297. db_set_value_month(value, month);
  298. db_set_value_day(value, day);
  299. db_set_value_hour(value, hour);
  300. db_set_value_minute(value, minute);
  301. db_set_value_seconds(value, seconds);
  302. return DB_OK;
  303. }