00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "ocilib_internal.h"
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 int OCI_ParseSqlFmt
00046 (
00047 OCI_Statement *stmt,
00048 mtext *buf,
00049 const mtext *format,
00050 va_list *pargs
00051 )
00052 {
00053 int size = 0;
00054 int len = 0;
00055 boolean quote = FALSE;
00056 mtext *pb = buf;
00057 const mtext *pf = format;
00058
00059 OCI_CHECK(format == NULL, 0);
00060
00061 for (; *pf != 0; pf++)
00062 {
00063 if (*pf != MT('%'))
00064 {
00065 if (buf != NULL)
00066 *(pb++) = *pf;
00067
00068 size++;
00069 continue;
00070 }
00071 else
00072 {
00073 quote = TRUE;
00074 len = 0;
00075
00076 if ( *(++pf) == MT('%'))
00077 {
00078 if (buf != NULL)
00079 *pb = *pf;
00080
00081 quote = FALSE;
00082 len = 1;
00083 }
00084 }
00085
00086 switch (*pf)
00087 {
00088 case MT('s'):
00089 case MT('m'):
00090 {
00091 const mtext *str = (const mtext *) va_arg(*pargs, const mtext *);
00092
00093 if (str != NULL && str[0] != 0)
00094 {
00095 len = (int) ((str!= NULL) ? mtslen(str) : OCI_SIZE_NULL);
00096
00097 if ((quote == TRUE) && (*pf != MT('m')))
00098 {
00099 if (buf != NULL)
00100 {
00101 *pb = 39;
00102 mtscpy(pb + (size_t) 1, str);
00103 *(pb + (size_t) (len + 1)) = MT('\'');
00104 }
00105
00106 len+=2;
00107 }
00108 else if (buf != NULL)
00109 mtscpy(pb, str);
00110 }
00111 else
00112 {
00113 if (*pf != MT('m'))
00114 {
00115 len = OCI_SIZE_NULL;
00116
00117 if (buf != NULL)
00118 mtscpy(pb, OCI_STRING_NULL);
00119 }
00120 }
00121 break;
00122 }
00123 case MT('t'):
00124 {
00125 OCI_Date *date = (OCI_Date *) va_arg(*pargs, OCI_Date *);
00126
00127 if (buf != NULL)
00128 {
00129 if (date != NULL)
00130 {
00131 len = mtsprintf(pb, OCI_SIZE_DATE,
00132 MT("to_date('%02i%02i%04i%02i%02i%02i',")
00133 MT("'DDMMYYYYHH24MISS')"),
00134 date->handle->OCIDateDD,
00135 date->handle->OCIDateMM,
00136 date->handle->OCIDateYYYY,
00137 date->handle->OCIDateTime.OCITimeHH,
00138 date->handle->OCIDateTime.OCITimeMI,
00139 date->handle->OCIDateTime.OCITimeSS);
00140 }
00141 else
00142 {
00143 mtscpy(pb, OCI_STRING_NULL);
00144 len = OCI_SIZE_NULL;
00145 }
00146 }
00147 else
00148 len = ((date != NULL) ? OCI_SIZE_DATE : OCI_SIZE_NULL);
00149
00150 break;
00151 }
00152 case MT('p'):
00153 {
00154 OCI_Timestamp *tmsp = (OCI_Timestamp *) va_arg(*pargs, OCI_Timestamp *);
00155
00156 if (buf != NULL)
00157 {
00158 if (tmsp != NULL)
00159 {
00160 mtext str_ff[12];
00161 int yy, mm, dd, hh, mi, ss, ff;
00162
00163 yy = mm = dd = mi = hh = ss = ff = 0;
00164
00165 OCI_TimestampGetDateTime(tmsp, &yy, &mm, &dd,
00166 &hh, &mi, &ss, &ff);
00167
00168 if (ff > 0)
00169 mtsprintf(str_ff, (int) msizeof(str_ff)- 1, MT("%i"), ff);
00170 else
00171 mtscpy(str_ff, MT("00"));
00172
00173 str_ff[2] = 0;
00174
00175 len = mtsprintf(pb, OCI_SIZE_TIMESTAMP,
00176 MT("to_timestamp(%02i%02i%04i%02i%02i%02i%s,")
00177 MT("DDMMYYYYHH24MISSFF)"),
00178 dd, mm, yy, hh, mi, ss, str_ff);
00179 }
00180 else
00181 {
00182 mtscpy(pb, OCI_STRING_NULL);
00183 len = OCI_SIZE_NULL;
00184 }
00185 }
00186 else
00187 len = ((tmsp != NULL) ? OCI_SIZE_TIMESTAMP : OCI_SIZE_NULL);
00188
00189 break;
00190 }
00191 case MT('v'):
00192 {
00193 mtext temp[128];
00194
00195 OCI_Interval *itv = (OCI_Interval *) va_arg(*pargs, OCI_Interval *);
00196
00197 temp[0] = 0;
00198
00199 if (itv != NULL)
00200 {
00201 OCI_IntervalToText(itv, 3, 3, (int) msizeof(temp)- 1, temp);
00202
00203 len = (int) mtslen(temp);
00204
00205 if ((buf != NULL) && (len > 0))
00206 mtscpy(pb, temp);
00207 }
00208 else
00209 {
00210 len = OCI_SIZE_NULL;
00211
00212 if ((buf != NULL) && (len > 0))
00213 mtscpy(pb, OCI_STRING_NULL);
00214 }
00215
00216 break;
00217 }
00218 case MT('i'):
00219 {
00220 mtext temp[64];
00221
00222 temp[0] = 0;
00223
00224 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%i"),
00225 va_arg(*pargs, int));
00226
00227 if ((buf != NULL) && (len > 0))
00228 mtscpy(pb, temp);
00229
00230 break;
00231 }
00232 case MT('u'):
00233 {
00234 mtext temp[64];
00235
00236 temp[0] = 0;
00237
00238 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%u"),
00239 va_arg(*pargs, unsigned int));
00240
00241 if ((buf != NULL) && (len > 0))
00242 mtscpy(pb, temp);
00243
00244 break;
00245 }
00246 case MT('l'):
00247 {
00248 mtext temp[64];
00249
00250 temp[0] = 0;
00251
00252 pf++;
00253
00254 if (*pf == MT('i'))
00255 {
00256 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%lld"),
00257 va_arg(*pargs, big_int));
00258 }
00259 else if (*pf == MT('u'))
00260 {
00261 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%llu"),
00262 va_arg(*pargs, big_uint));
00263 }
00264 else
00265 len = 0;
00266
00267 if ((buf != NULL) && (len > 0))
00268 mtscpy(pb, temp);
00269
00270 break;
00271 }
00272 case MT('h'):
00273 {
00274 mtext temp[64];
00275
00276 temp[0] = 0;
00277
00278 pf++;
00279
00280
00281
00282 if (*pf == 'i')
00283 {
00284 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%hd"),
00285 va_arg(*pargs, int));
00286 }
00287 else if (*pf == 'u')
00288 {
00289 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%hu"),
00290 va_arg(*pargs, unsigned int));
00291 }
00292 else
00293 len = 0;
00294
00295 if ((buf != NULL) && (len > 0))
00296 mtscpy(pb, temp);
00297
00298 break;
00299 }
00300 case MT('g'):
00301 {
00302 mtext temp[128];
00303
00304 temp[0] = 0;
00305
00306 len = (int) mtsprintf(temp, (int) msizeof(temp) - 1, MT("%f"),
00307 va_arg(*pargs, double));
00308
00309 if ((buf != NULL) && (len > 0))
00310 mtscpy(pb, temp);
00311
00312 break;
00313 }
00314 case MT('r'):
00315 {
00316 mtext temp[128];
00317
00318 OCI_Ref *ref = (OCI_Ref *) va_arg(*pargs, OCI_Ref *);
00319
00320 temp[0] = 0;
00321
00322 if (ref != NULL)
00323 {
00324 OCI_RefToText(ref, (unsigned int) msizeof(temp) - 1, temp);
00325
00326 len = (int) mtslen(temp);
00327
00328 if ((buf != NULL) && (len > 0))
00329 mtscpy(pb, temp);
00330 }
00331 else
00332 {
00333 len = OCI_SIZE_NULL;
00334
00335 if ((buf != NULL) && (len > 0))
00336 mtscpy(pb, OCI_STRING_NULL);
00337 }
00338
00339 break;
00340 }
00341 default:
00342 {
00343 OCI_ExceptionParsingToken(stmt->con, stmt, *pf);
00344
00345 return 0;
00346 }
00347 }
00348
00349 if (buf != NULL)
00350 pb += (size_t) len;
00351
00352 size += len;
00353 }
00354
00355 if (buf != NULL)
00356 *pb = 0;
00357
00358 return size;
00359 }