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

Generated on Thu Jul 30 17:41:52 2009 for OCILIB (C Driver for Oracle) by  doxygen 1.5.4