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