datetime.c

Go to the documentation of this file.
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 /* NAME: db_convert_Cstring_to_value_datetime
00167  * INPUT: buf, a C string formated as indicated by sqltype, value, a dbValue
00168  *  to put the converted value into
00169  * OUTPUT: the converted datetime value in value
00170  * PROCESSING: the format of buf must be as follows
00171  *  buf == "CURRENT" in a case-insignificant fashion
00172  *   value is marked as current
00173  *  sqltype == DB_SQL_TYPE_DATE
00174  *   "year*month*day"
00175  *  sqltype == DB_SQL_TYPE_TIME
00176  *   "hour*minute*second"
00177  *  sqltype == DB_SQL_TYPE_TIMESTAMP
00178  *   "year*month*day hour*minute*second"
00179  *  otherwise the to and from markings in sqltype are used.
00180  *  where "*" represents any non-whitespace character
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 }
Generated on Tue Apr 6 13:27:21 2010 for GRASS Programmer's Manual by  doxygen 1.6.3