• Main Page
  • Modules
  • Data Structures
  • Files
  • File List

D:/Perso/dev/ocilib/ocilib/src/format.c

00001 /*
00002     +-----------------------------------------------------------------------------------------+
00003     |                                                                                         |
00004     |                               OCILIB - C Driver for Oracle                              |
00005     |                                                                                         |
00006     |                                (C Wrapper for Oracle OCI)                               |
00007     |                                                                                         |
00008     |                              Website : http://www.ocilib.net                            |
00009     |                                                                                         |
00010     |             Copyright (c) 2007-2010 Vincent ROGIER <vince.rogier@ocilib.net>            |
00011     |                                                                                         |
00012     +-----------------------------------------------------------------------------------------+
00013     |                                                                                         |
00014     |             This library is free software; you can redistribute it and/or               |
00015     |             modify it under the terms of the GNU Lesser General Public                  |
00016     |             License as published by the Free Software Foundation; either                |
00017     |             version 2 of the License, or (at your option) any later version.            |
00018     |                                                                                         |
00019     |             This library is distributed in the hope that it will be useful,             |
00020     |             but WITHOUT ANY WARRANTY; without even the implied warranty of              |
00021     |             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           |
00022     |             Lesser General Public License for more details.                             |
00023     |                                                                                         |
00024     |             You should have received a copy of the GNU Lesser General Public            |
00025     |             License along with this library; if not, write to the Free                  |
00026     |             Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.          |
00027     |                                                                                         |
00028     +-----------------------------------------------------------------------------------------+
00029 */
00030 
00031 /* --------------------------------------------------------------------------------------------- *
00032  * $Id: format.c, v 3.8.1 2010-12-13 00:00 Vincent Rogier $
00033  * --------------------------------------------------------------------------------------------- */
00034 
00035 #include "ocilib_internal.h"
00036 
00037 /* ********************************************************************************************* *
00038  *                             PRIVATE FUNCTIONS
00039  * ********************************************************************************************* */
00040 
00041 /* --------------------------------------------------------------------------------------------- *
00042  * OCI_ParseSqlFmt
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                 /* short ints must be passed as int to va_args */
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 }

Generated on Mon Dec 13 2010 22:32:01 for OCILIB (C Driver for Oracle) by  doxygen 1.7.2