datetime.c

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

Generated on Sat Jul 22 22:05:40 2006 for GRASS by  doxygen 1.4.7