GRASS Programmer's Manual 6.4.1(2011)
|
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%02d", year, ds, month); 00048 break; 00049 case DB_DAY: 00050 sprintf(buf, "%d%c%02d%c%02d", year, ds, month, ds, day); 00051 break; 00052 case DB_HOUR: 00053 sprintf(buf, "%d%c%02d%c%02d %02d", year, ds, month, ds, day, hour); 00054 break; 00055 case DB_MINUTE: 00056 sprintf(buf, "%d%c%02d%c%02d %02d%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%02d%c%02d %02d%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, "%02d%c%02d", month, ds, day); 00074 break; 00075 case DB_HOUR: 00076 sprintf(buf, "%02d%c%02d %02d", month, ds, day, hour); 00077 break; 00078 case DB_MINUTE: 00079 sprintf(buf, "%02d%c%02d %02d%c%02d", month, ds, day, hour, ts, minute); 00080 break; 00081 case DB_SECOND: 00082 case DB_FRACTION: 00083 sprintf(buf, "%02d%c%02d %02d%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, "%02d", day); 00092 break; 00093 case DB_HOUR: 00094 sprintf(buf, "%02d %02d", day, hour); 00095 break; 00096 case DB_MINUTE: 00097 sprintf(buf, "%02d %02d%c%02d", day, hour, ts, minute); 00098 break; 00099 case DB_SECOND: 00100 case DB_FRACTION: 00101 sprintf(buf, "%02d %02d%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, "%02d", hour); 00110 break; 00111 case DB_MINUTE: 00112 sprintf(buf, "%02d%c%02d", hour, ts, minute); 00113 break; 00114 case DB_SECOND: 00115 case DB_FRACTION: 00116 sprintf(buf, "%02d%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, "%02d", minute); 00125 break; 00126 case DB_SECOND: 00127 case DB_FRACTION: 00128 sprintf(buf, "%02d%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%02d%c%02d", year, ds, month, ds, day); 00145 break; 00146 case DB_SQL_TYPE_TIME: 00147 sprintf(buf, "%02d%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%02d%c%02d %02d%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 }