• 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.0 2010-10-24 21:53 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 
00350         if (buf != NULL)
00351             pb += (size_t) len;
00352 
00353         size += len;
00354     }
00355 
00356     if (buf != NULL)
00357         *pb = 0;
00358 
00359     return size;
00360 }

Generated on Sun Oct 24 2010 22:02:54 for OCILIB (C Driver for Oracle) by  doxygen 1.7.1