00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <grass/dbmi.h>
00004
00005 static char ds = '-';
00006 static char ts = ':';
00007
00014 int db_convert_value_datetime_into_string(dbValue * value, int sqltype,
00015 dbString * string)
00016 {
00017 int to, from;
00018 int year, month, day, hour, minute;
00019 double seconds;
00020 char *xs;
00021 char buf[64];
00022
00023 if (db_test_value_datetime_current(value))
00024 return db_set_string(string, "CURRENT");
00025
00026 *buf = 0;
00027
00028 year = db_get_value_year(value);
00029 month = db_get_value_month(value);
00030 day = db_get_value_day(value);
00031 hour = db_get_value_hour(value);
00032 minute = db_get_value_minute(value);
00033 seconds = db_get_value_seconds(value);
00034 if (seconds < 10.0)
00035 xs = "0";
00036 else
00037 xs = "";
00038
00039 db_interval_range(sqltype, &from, &to);
00040 switch (from) {
00041 case DB_YEAR:
00042 switch (to) {
00043 case DB_YEAR:
00044 sprintf(buf, "%d", year);
00045 break;
00046 case DB_MONTH:
00047 sprintf(buf, "%d%c%d", year, ds, month);
00048 break;
00049 case DB_DAY:
00050 sprintf(buf, "%d%c%d%c%d", year, ds, month, ds, day);
00051 break;
00052 case DB_HOUR:
00053 sprintf(buf, "%d%c%d%c%d %d", year, ds, month, ds, day, hour);
00054 break;
00055 case DB_MINUTE:
00056 sprintf(buf, "%d%c%d%c%d %d%c%02d",
00057 year, ds, month, ds, day, hour, ts, minute);
00058 break;
00059 case DB_SECOND:
00060 case DB_FRACTION:
00061 sprintf(buf, "%d%c%d%c%d %d%c%02d%c%s%.10g",
00062 year, ds, month, ds, day, hour, ts, minute, ts, xs,
00063 seconds);
00064 break;
00065 }
00066 break;
00067 case DB_MONTH:
00068 switch (to) {
00069 case DB_MONTH:
00070 sprintf(buf, "%d", month);
00071 break;
00072 case DB_DAY:
00073 sprintf(buf, "%d%c%d", month, ds, day);
00074 break;
00075 case DB_HOUR:
00076 sprintf(buf, "%d%c%d %d", month, ds, day, hour);
00077 break;
00078 case DB_MINUTE:
00079 sprintf(buf, "%d%c%d %d%c%02d", month, ds, day, hour, ts, minute);
00080 break;
00081 case DB_SECOND:
00082 case DB_FRACTION:
00083 sprintf(buf, "%d%c%d %d%c%02d%c%s%.10g",
00084 month, ds, day, hour, ts, minute, ts, xs, seconds);
00085 break;
00086 }
00087 break;
00088 case DB_DAY:
00089 switch (to) {
00090 case DB_DAY:
00091 sprintf(buf, "%d", day);
00092 break;
00093 case DB_HOUR:
00094 sprintf(buf, "%d %d", day, hour);
00095 break;
00096 case DB_MINUTE:
00097 sprintf(buf, "%d %d%c%02d", day, hour, ts, minute);
00098 break;
00099 case DB_SECOND:
00100 case DB_FRACTION:
00101 sprintf(buf, "%d %d%c%02d%c%s%.10g",
00102 day, hour, ts, minute, ts, xs, seconds);
00103 break;
00104 }
00105 break;
00106 case DB_HOUR:
00107 switch (to) {
00108 case DB_HOUR:
00109 sprintf(buf, "%d", hour);
00110 break;
00111 case DB_MINUTE:
00112 sprintf(buf, "%d%c%02d", hour, ts, minute);
00113 break;
00114 case DB_SECOND:
00115 case DB_FRACTION:
00116 sprintf(buf, "%d%c%02d%c%s%.10g", hour, ts, minute, ts, xs,
00117 seconds);
00118 break;
00119 }
00120 break;
00121 case DB_MINUTE:
00122 switch (to) {
00123 case DB_MINUTE:
00124 sprintf(buf, "%d", minute);
00125 break;
00126 case DB_SECOND:
00127 case DB_FRACTION:
00128 sprintf(buf, "%d%c%s%.10g", minute, ts, xs, seconds);
00129 break;
00130 }
00131 break;
00132 case DB_SECOND:
00133 case DB_FRACTION:
00134 switch (to) {
00135 case DB_SECOND:
00136 case DB_FRACTION:
00137 sprintf(buf, "%g", seconds);
00138 break;
00139 }
00140 break;
00141 default:
00142 switch (sqltype) {
00143 case DB_SQL_TYPE_DATE:
00144 sprintf(buf, "%d%c%d%c%d", year, ds, month, ds, day);
00145 break;
00146 case DB_SQL_TYPE_TIME:
00147 sprintf(buf, "%d%c%02d%c%s%.10g",
00148 hour, ts, minute, ts, xs, seconds);
00149 break;
00150 case DB_SQL_TYPE_TIMESTAMP:
00151 sprintf(buf, "%d%c%d%c%d %d%c%02d%c%s%.10g",
00152 year, ds, month, ds, day, hour, ts, minute, ts, xs,
00153 seconds);
00154 break;
00155 }
00156 }
00157 return db_set_string(string, buf);
00158 }
00159
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 int db_convert_Cstring_to_value_datetime(const char *buf, int sqltype,
00183 dbValue * value)
00184 {
00185 int from, to;
00186 int year, month, day, hour, minute;
00187 double seconds;
00188
00189 year = month = day = 0;
00190 hour = minute = 0;
00191 seconds = 0;
00192
00193 if (db_nocase_compare(buf, "CURRENT")) {
00194 db_set_value_datetime_current(value);
00195 return DB_OK;
00196 }
00197
00198 db_interval_range(sqltype, &from, &to);
00199 switch (from) {
00200 case DB_YEAR:
00201 switch (to) {
00202 case DB_YEAR:
00203 sscanf(buf, "%d", &year);
00204 break;
00205 case DB_MONTH:
00206 sscanf(buf, "%d%*c%d", &year, &month);
00207 break;
00208 case DB_DAY:
00209 sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
00210 break;
00211 case DB_HOUR:
00212 sscanf(buf, "%d%*c%d%*c%d %d", &year, &month, &day, &hour);
00213 break;
00214 case DB_MINUTE:
00215 sscanf(buf, "%d%*c%d%*c%d %d%*c%d",
00216 &year, &month, &day, &hour, &minute);
00217 break;
00218 case DB_SECOND:
00219 case DB_FRACTION:
00220 sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf",
00221 &year, &month, &day, &hour, &minute, &seconds);
00222 break;
00223 }
00224 break;
00225 case DB_MONTH:
00226 switch (to) {
00227 case DB_MONTH:
00228 sscanf(buf, "%d", &month);
00229 break;
00230 case DB_DAY:
00231 sscanf(buf, "%d%*c%d", &month, &day);
00232 break;
00233 case DB_HOUR:
00234 sscanf(buf, "%d%*c%d %d", &month, &day, &hour);
00235 break;
00236 case DB_MINUTE:
00237 sscanf(buf, "%d%*c%d %d%*c%d", &month, &day, &hour, &minute);
00238 break;
00239 case DB_SECOND:
00240 case DB_FRACTION:
00241 sscanf(buf, "%d%*c%d %d%*c%d%*c%lf",
00242 &month, &day, &hour, &minute, &seconds);
00243 break;
00244 }
00245 break;
00246 case DB_DAY:
00247 switch (to) {
00248 case DB_DAY:
00249 sscanf(buf, "%d", &day);
00250 break;
00251 case DB_HOUR:
00252 sscanf(buf, "%d %d", &day, &hour);
00253 break;
00254 case DB_MINUTE:
00255 sscanf(buf, "%d %d%*c%d", &day, &hour, &minute);
00256 break;
00257 case DB_SECOND:
00258 case DB_FRACTION:
00259 sscanf(buf, "%d %d%*c%d%*c%lf", &day, &hour, &minute, &seconds);
00260 break;
00261 }
00262 break;
00263 case DB_HOUR:
00264 switch (to) {
00265 case DB_HOUR:
00266 sscanf(buf, "%d", &hour);
00267 break;
00268 case DB_MINUTE:
00269 sscanf(buf, "%d%*c%d", &hour, &minute);
00270 break;
00271 case DB_SECOND:
00272 case DB_FRACTION:
00273 sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
00274 break;
00275 }
00276 break;
00277 case DB_MINUTE:
00278 switch (to) {
00279 case DB_MINUTE:
00280 sscanf(buf, "%d", &minute);
00281 break;
00282 case DB_SECOND:
00283 case DB_FRACTION:
00284 sscanf(buf, "%d%*c%lf", &minute, &seconds);
00285 break;
00286 }
00287 break;
00288 case DB_SECOND:
00289 case DB_FRACTION:
00290 sscanf(buf, "%lf", &seconds);
00291 break;
00292 default:
00293 switch (sqltype) {
00294 case DB_SQL_TYPE_DATE:
00295 sscanf(buf, "%d%*c%d%*c%d", &year, &month, &day);
00296 break;
00297 case DB_SQL_TYPE_TIME:
00298 sscanf(buf, "%d%*c%d%*c%lf", &hour, &minute, &seconds);
00299 break;
00300 case DB_SQL_TYPE_TIMESTAMP:
00301 sscanf(buf, "%d%*c%d%*c%d %d%*c%d%*c%lf",
00302 &year, &month, &day, &hour, &minute, &seconds);
00303 break;
00304 }
00305 }
00306
00307 db_set_value_year(value, year);
00308 db_set_value_month(value, month);
00309 db_set_value_day(value, day);
00310 db_set_value_hour(value, hour);
00311 db_set_value_minute(value, minute);
00312 db_set_value_seconds(value, seconds);
00313
00314 return DB_OK;
00315 }