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 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 /* NAME: db_convert_Cstring_to_value_datetime
00173  * INPUT: buf, a C string formated as indicated by sqltype, value, a dbValue
00174  *  to put the converted value into
00175  * OUTPUT: the converted datetime value in value
00176  * PROCESSING: the format of buf must be as follows
00177  *  buf == "CURRENT" in a case-insignificant fashion
00178  *   value is marked as current
00179  *  sqltype == DB_SQL_TYPE_DATE
00180  *   "year*month*day"
00181  *  sqltype == DB_SQL_TYPE_TIME
00182  *   "hour*minute*second"
00183  *  sqltype == DB_SQL_TYPE_TIMESTAMP
00184  *   "year*month*day hour*minute*second"
00185  *  otherwise the to and from markings in sqltype are used.
00186  *  where "*" represents any non-whitespace character
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 }

Generated on Sun Apr 6 17:31:38 2008 for GRASS by  doxygen 1.5.5