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
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
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 }