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