ExtString.cpp

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/calculator/ExtString.cpp#2 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2004-2009 SQLstream, Inc.
00006 // Copyright (C) 2009-2009 LucidEra, Inc.
00007 //
00008 // This program is free software; you can redistribute it and/or modify it
00009 // under the terms of the GNU General Public License as published by the Free
00010 // Software Foundation; either version 2 of the License, or (at your option)
00011 // any later version approved by The Eigenbase Project.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the Free Software
00020 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021 */
00022 
00023 #include "fennel/common/CommonPreamble.h"
00024 #include "fennel/calculator/SqlString.h"
00025 #include "fennel/calculator/ExtendedInstructionTable.h"
00026 
00027 FENNEL_BEGIN_NAMESPACE
00028 
00029 
00030 void
00031 strCatA2(
00032     RegisterRef<char*>* result,
00033     RegisterRef<char*>* str1)
00034 {
00035     assert(StandardTypeDescriptor::isTextArray(str1->type()));
00036 
00037     // appending to a null results in null
00038     if (result->isNull() || str1->isNull()) {
00039         result->toNull();
00040         result->length(0);
00041     } else {
00042         result->length(
00043             SqlStrCat(
00044                 result->pointer(),
00045                 result->storage(),
00046                 result->length(),
00047                 str1->pointer(),
00048                 str1->stringLength()));
00049     }
00050 }
00051 
00052 void
00053 strCatA3(
00054     RegisterRef<char*>* result,
00055     RegisterRef<char*>* str1,
00056     RegisterRef<char*>* str2)
00057 {
00058     assert(StandardTypeDescriptor::isTextArray(str1->type()));
00059 
00060     // appending to a null results in null
00061     if (result->isNull() || str1->isNull() || str2->isNull()) {
00062         result->toNull();
00063         result->length(0);
00064     } else {
00065         result->length(
00066             SqlStrCat(
00067                 result->pointer(),
00068                 result->storage(),
00069                 str1->pointer(),
00070                 str1->stringLength(),
00071                 str2->pointer(),
00072                 str2->stringLength()));
00073     }
00074 }
00075 
00076 void
00077 strCmpA(
00078     RegisterRef<int32_t>* result,
00079     RegisterRef<char*>* str1,
00080     RegisterRef<char*>* str2)
00081 {
00082     assert(StandardTypeDescriptor::isTextArray(str1->type()));
00083 
00084     if (str1->isNull() || str2->isNull()) {
00085         result->toNull();
00086     } else {
00087         result->value(
00088             SqlStrCmp<1,1>(
00089                 str1->pointer(), str1->stringLength(),
00090                 str2->pointer(), str2->stringLength()));
00091     }
00092 }
00093 
00094 void
00095 strCmpOct(
00096     RegisterRef<int32_t>* result,
00097     RegisterRef<char*>* str1,
00098     RegisterRef<char*>* str2)
00099 {
00100     assert(StandardTypeDescriptor::isBinaryArray(str1->type()));
00101 
00102     if (str1->isNull() || str2->isNull()) {
00103         result->toNull();
00104     } else {
00105         result->value(
00106             SqlStrCmp_Bin(
00107                 str1->pointer(), str1->stringLength(),
00108                 str2->pointer(), str2->stringLength()));
00109     }
00110 }
00111 
00112 void
00113 strCpyA(
00114     RegisterRef<char*>* result,
00115     RegisterRef<char*>* str)
00116 {
00117     assert(result->type() == str->type());
00118     assert(StandardTypeDescriptor::isTextArray(str->type()));
00119 
00120     // copy to a null results in null
00121     if (result->isNull() || str->isNull()) {
00122         result->toNull();
00123         result->length(0);
00124     } else {
00125         if (str->type() == STANDARD_TYPE_CHAR) {
00126             result->length(
00127                 SqlStrCpy_Fix<1,1>(
00128                     result->pointer(),
00129                     result->storage(),
00130                     str->pointer(),
00131                     str->stringLength()));
00132         } else {
00133             result->length(
00134                 SqlStrCpy_Var(
00135                     result->pointer(),
00136                     result->storage(),
00137                     str->pointer(),
00138                     str->stringLength()));
00139         }
00140     }
00141 }
00142 
00143 
00144 void
00145 strLenBitA(
00146     RegisterRef<int32_t>* result,
00147     RegisterRef<char*>* str)
00148 {
00149     assert(StandardTypeDescriptor::isTextArray(str->type()));
00150 
00151     if (str->isNull()) {
00152         result->toNull();
00153     } else {
00154         result->value(SqlStrLenBit(str->stringLength()));
00155     }
00156 }
00157 
00158 void
00159 strLenCharA(
00160     RegisterRef<int32_t>* result,
00161     RegisterRef<char*>* str)
00162 {
00163     assert(StandardTypeDescriptor::isTextArray(str->type()));
00164 
00165     if (str->isNull()) {
00166         result->toNull();
00167     } else {
00168         result->value(
00169             SqlStrLenChar<1,1>(
00170                 str->pointer(),
00171                 str->stringLength()));
00172     }
00173 }
00174 
00175 void
00176 strLenOctA(
00177     RegisterRef<int32_t>* result,
00178     RegisterRef<char*>* str)
00179 {
00180     assert(StandardTypeDescriptor::isTextArray(str->type()));
00181 
00182     if (str->isNull()) {
00183         result->toNull();
00184     } else {
00185         result->value(SqlStrLenOct(str->stringLength()));
00186     }
00187 }
00188 
00189 void
00190 strOverlayA4(
00191     RegisterRef<char*>* result,
00192     RegisterRef<char*>* str,
00193     RegisterRef<char*>* overlay,
00194     RegisterRef<int32_t>* start)
00195 {
00196     assert(result->type() == STANDARD_TYPE_VARCHAR);
00197     assert(str->type() == overlay->type());
00198     assert(StandardTypeDescriptor::isTextArray(str->type()));
00199 
00200     // overlay to a null results in null
00201     if (result->isNull() || str->isNull() ||
00202         overlay->isNull() || start->isNull()) {
00203         result->toNull();
00204         result->length(0);
00205     } else {
00206         result->length(
00207             SqlStrOverlay<1,1>(
00208                 result->pointer(),
00209                 result->storage(),
00210                 str->pointer(),
00211                 str->stringLength(),
00212                 overlay->pointer(),
00213                 overlay->stringLength(),
00214                 start->value(),
00215                 0,
00216                 false));
00217     }
00218 }
00219 
00220 void
00221 strOverlayA5(
00222     RegisterRef<char*>* result,
00223     RegisterRef<char*>* str,
00224     RegisterRef<char*>* overlay,
00225     RegisterRef<int32_t>* start,
00226     RegisterRef<int32_t>* len)
00227 {
00228     assert(result->type() == STANDARD_TYPE_VARCHAR);
00229     assert(str->type() == overlay->type());
00230     assert(StandardTypeDescriptor::isTextArray(str->type()));
00231 
00232     // overlay to a null results in null
00233     if (result->isNull() || str->isNull() ||
00234         overlay->isNull() || start->isNull() || len->isNull()) {
00235         result->toNull();
00236         result->length(0);
00237     } else {
00238         result->length(
00239             SqlStrOverlay<1,1>(
00240                 result->pointer(),
00241                 result->storage(),
00242                 str->pointer(),
00243                 str->stringLength(),
00244                 overlay->pointer(),
00245                 overlay->stringLength(),
00246                 start->value(),
00247                 len->value(),
00248                 true));
00249     }
00250 }
00251 
00252 void
00253 strPosA(
00254     RegisterRef<int32_t>* result,
00255     RegisterRef<char*>* find,
00256     RegisterRef<char*>* str)
00257 {
00258     assert(str->type() == find->type());
00259     assert(StandardTypeDescriptor::isTextArray(str->type()));
00260 
00261     if (str->isNull() || find->isNull()) {
00262         result->toNull();
00263     } else {
00264         result->value(
00265             SqlStrPos<1,1>(
00266                 str->pointer(),
00267                 str->stringLength(),
00268                 find->pointer(),
00269                 find->stringLength()));
00270     }
00271 }
00272 
00273 void
00274 strSubStringA3(
00275     RegisterRef<char*>* result,
00276     RegisterRef<char*>* str,
00277     RegisterRef<int32_t>* start)
00278 {
00279     assert(result->type() == STANDARD_TYPE_VARCHAR);
00280     assert(StandardTypeDescriptor::isTextArray(str->type()));
00281 
00282     // substring to a null results in null
00283     if (result->isNull() || str->isNull() || start->isNull()) {
00284         result->toNull();
00285         result->length(0);
00286     } else {
00287         // Don't try anything fancy with RegisterRef accessors. KISS.
00288         char * ptr = result->pointer(); // preserve old value if possible
00289         // TODO: Not sure why cast from char* to char const * is required below.
00290         int32_t newLen = SqlStrSubStr<1,1>(
00291             const_cast<char const **>(&ptr),
00292             result->storage(),
00293             str->pointer(),
00294             str->stringLength(),
00295             start->value(),
00296             0,
00297             false);
00298         result->pointer(ptr, newLen);
00299     }
00300 }
00301 
00302 void
00303 strSubStringA4(
00304     RegisterRef<char*>* result,
00305     RegisterRef<char*>* str,
00306     RegisterRef<int32_t>* start,
00307     RegisterRef<int32_t>* len)
00308 {
00309     assert(result->type() == STANDARD_TYPE_VARCHAR);
00310     assert(StandardTypeDescriptor::isTextArray(str->type()));
00311 
00312     // substring to a null results in null
00313     if (result->isNull() || str->isNull() ||
00314         start->isNull() || len->isNull()) {
00315         result->toNull();
00316         result->length(0);
00317     } else {
00318         // Don't try anything fancy with RegisterRef accessors. KISS.
00319         char * ptr = result->pointer(); // preserve old value if possible
00320         // TODO: Not sure why cast from char* to char const * is required below.
00321         int32_t newLen = SqlStrSubStr<1,1>(
00322             const_cast<char const **>(&ptr),
00323             result->storage(),
00324             str->pointer(),
00325             str->stringLength(),
00326             start->value(),
00327             len->value(),
00328             true);
00329         result->pointer(ptr, newLen);
00330     }
00331 }
00332 
00333 void
00334 strToLowerA(
00335     RegisterRef<char*>* result,
00336     RegisterRef<char*>* str)
00337 {
00338     assert(StandardTypeDescriptor::isTextArray(str->type()));
00339     assert(str->type() == result->type());
00340 
00341     // tolower to a null results in null
00342     if (result->isNull() || str->isNull()) {
00343         result->toNull();
00344         result->length(0);
00345     } else {
00346         // fixed width case: length should be harmlessly reset to same value
00347         assert(
00348             str->type() == STANDARD_TYPE_CHAR
00349             ? (result->storage() == str->storage())
00350             : true);
00351         result->length(
00352             SqlStrAlterCase<1,1,AlterCaseLower>(
00353                 result->pointer(),
00354                 result->storage(),
00355                 str->pointer(),
00356                 str->stringLength()));
00357     }
00358 }
00359 
00360 void
00361 strToUpperA(
00362     RegisterRef<char*>* result,
00363     RegisterRef<char*>* str)
00364 {
00365     assert(StandardTypeDescriptor::isTextArray(str->type()));
00366     assert(str->type() == result->type());
00367 
00368     // toupper to a null results in null
00369     if (result->isNull() || str->isNull()) {
00370         result->toNull();
00371         result->length(0);
00372     } else {
00373         assert(
00374             str->type() == STANDARD_TYPE_CHAR
00375             ? (result->storage() == str->storage())
00376             : true);
00377         // fixed width case: length should be harmlessly reset to same value
00378         result->length(
00379             SqlStrAlterCase<1,1,AlterCaseUpper>(
00380                 result->pointer(),
00381                 result->storage(),
00382                 str->pointer(),
00383                 str->stringLength()));
00384     }
00385 }
00386 
00387 
00388 void
00389 strTrimA(
00390     RegisterRef<char*>* result,
00391     RegisterRef<char*>* str,
00392     RegisterRef<char*>* trimchar,
00393     RegisterRef<int32_t>* trimLeft,
00394     RegisterRef<int32_t>* trimRight)
00395  {
00396     assert(StandardTypeDescriptor::isTextArray(str->type()));
00397     assert(result->type() == STANDARD_TYPE_VARCHAR);
00398     assert(StandardTypeDescriptor::isTextArray(trimchar->type()));
00399 
00400     // trim to a null results in null
00401     if (result->isNull() || str->isNull() || trimchar->isNull() ||
00402         trimLeft->isNull() || trimRight->isNull()) {
00403         result->toNull();
00404         result->length(0);
00405     } else {
00406         // Don't try anything fancy with RegisterRef accessors. KISS.
00407         char * ptr = result->pointer(); // preserve old value if possible
00408 
00409         if (trimchar->stringLength() != 1) {
00410             // SQL99 Part 2 Section 6.18 General Rule 8.d) Data
00411             // Exception - Trim Error
00412             throw "22027";
00413         }
00414         // Note: This routine is for ASCII only, so the following is OK.
00415         char tc = *(trimchar->pointer());
00416 
00417         // Use trim by reference function:
00418         // TODO: Not sure why cast from char* to char const * is
00419         // required below.
00420         int32_t newLen = SqlStrTrim<1,1>(
00421             const_cast<char const **>(&ptr),
00422             str->pointer(),
00423             str->stringLength(),
00424             trimLeft->value(),
00425             trimRight->value(),
00426             tc);
00427         result->pointer(ptr, newLen);
00428     }
00429 }
00430 
00431 
00432 void
00433 ExtStringRegister(ExtendedInstructionTable* eit)
00434 {
00435     assert(eit != NULL);
00436 
00437     vector<StandardTypeDescriptorOrdinal> params_2F;
00438     params_2F.push_back(STANDARD_TYPE_CHAR);
00439     params_2F.push_back(STANDARD_TYPE_CHAR);
00440 
00441     vector<StandardTypeDescriptorOrdinal> params_2V;
00442     params_2V.push_back(STANDARD_TYPE_VARCHAR);
00443     params_2V.push_back(STANDARD_TYPE_VARCHAR);
00444 
00445     eit->add(
00446         "strCatA2", params_2F,
00447         (ExtendedInstruction2<char*, char*>*) NULL,
00448         &strCatA2);
00449     eit->add(
00450         "strCatA2", params_2V,
00451         (ExtendedInstruction2<char*, char*>*) NULL,
00452         &strCatA2);
00453 
00454 
00455     vector<StandardTypeDescriptorOrdinal> params_3F;
00456     params_3F.push_back(STANDARD_TYPE_CHAR);
00457     params_3F.push_back(STANDARD_TYPE_CHAR);
00458     params_3F.push_back(STANDARD_TYPE_CHAR);
00459 
00460     vector<StandardTypeDescriptorOrdinal> params_3V;
00461     params_3V.push_back(STANDARD_TYPE_VARCHAR);
00462     params_3V.push_back(STANDARD_TYPE_VARCHAR);
00463     params_3V.push_back(STANDARD_TYPE_VARCHAR);
00464 
00465     eit->add(
00466         "strCatA3", params_3F,
00467         (ExtendedInstruction3<char*, char*, char*>*) NULL,
00468         &strCatA3);
00469 
00470     eit->add(
00471         "strCatA3", params_3V,
00472         (ExtendedInstruction3<char*, char*, char*>*) NULL,
00473         &strCatA3);
00474 
00475     vector<StandardTypeDescriptorOrdinal> params_1N_2F;
00476     params_1N_2F.push_back(STANDARD_TYPE_INT_32);
00477     params_1N_2F.push_back(STANDARD_TYPE_CHAR);
00478     params_1N_2F.push_back(STANDARD_TYPE_CHAR);
00479 
00480     vector<StandardTypeDescriptorOrdinal> params_1N_2V;
00481     params_1N_2V.push_back(STANDARD_TYPE_INT_32);
00482     params_1N_2V.push_back(STANDARD_TYPE_VARCHAR);
00483     params_1N_2V.push_back(STANDARD_TYPE_VARCHAR);
00484 
00485     vector<StandardTypeDescriptorOrdinal> params_1N_1F_1V;
00486     params_1N_1F_1V.push_back(STANDARD_TYPE_INT_32);
00487     params_1N_1F_1V.push_back(STANDARD_TYPE_CHAR);
00488     params_1N_1F_1V.push_back(STANDARD_TYPE_VARCHAR);
00489 
00490     vector<StandardTypeDescriptorOrdinal> params_1N_1V_1F;
00491     params_1N_1V_1F.push_back(STANDARD_TYPE_INT_32);
00492     params_1N_1V_1F.push_back(STANDARD_TYPE_VARCHAR);
00493     params_1N_1V_1F.push_back(STANDARD_TYPE_CHAR);
00494 
00495     eit->add(
00496         "strCmpA", params_1N_2F,
00497         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00498         &strCmpA);
00499 
00500     eit->add(
00501         "strCmpA", params_1N_2V,
00502         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00503         &strCmpA);
00504 
00505     eit->add(
00506         "strCmpA", params_1N_1F_1V,
00507         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00508         &strCmpA);
00509 
00510     eit->add(
00511         "strCmpA", params_1N_1V_1F,
00512         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00513         &strCmpA);
00514 
00515     eit->add(
00516         "strCpyA", params_2V,
00517         (ExtendedInstruction2<char*, char*>*) NULL,
00518         &strCpyA);
00519 
00520     eit->add(
00521         "strCpyA", params_2F,
00522         (ExtendedInstruction2<char*, char*>*) NULL,
00523         &strCpyA);
00524 
00525     vector<StandardTypeDescriptorOrdinal> params_1N_2B;
00526     params_1N_2B.push_back(STANDARD_TYPE_INT_32);
00527     params_1N_2B.push_back(STANDARD_TYPE_BINARY);
00528     params_1N_2B.push_back(STANDARD_TYPE_BINARY);
00529 
00530     vector<StandardTypeDescriptorOrdinal> params_1N_2VB;
00531     params_1N_2VB.push_back(STANDARD_TYPE_INT_32);
00532     params_1N_2VB.push_back(STANDARD_TYPE_VARBINARY);
00533     params_1N_2VB.push_back(STANDARD_TYPE_VARBINARY);
00534 
00535     vector<StandardTypeDescriptorOrdinal> params_1N_1B_1VB;
00536     params_1N_1B_1VB.push_back(STANDARD_TYPE_INT_32);
00537     params_1N_1B_1VB.push_back(STANDARD_TYPE_BINARY);
00538     params_1N_1B_1VB.push_back(STANDARD_TYPE_VARBINARY);
00539 
00540     vector<StandardTypeDescriptorOrdinal> params_1N_1VB_1B;
00541     params_1N_1VB_1B.push_back(STANDARD_TYPE_INT_32);
00542     params_1N_1VB_1B.push_back(STANDARD_TYPE_VARBINARY);
00543     params_1N_1VB_1B.push_back(STANDARD_TYPE_BINARY);
00544 
00545     eit->add(
00546         "strCmpOct", params_1N_2B,
00547         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00548         &strCmpOct);
00549 
00550     eit->add(
00551         "strCmpOct", params_1N_2VB,
00552         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00553         &strCmpOct);
00554 
00555     eit->add(
00556         "strCmpOct", params_1N_1B_1VB,
00557         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00558         &strCmpOct);
00559 
00560     eit->add(
00561         "strCmpOct", params_1N_1VB_1B,
00562         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00563         &strCmpOct);
00564 
00565     vector<StandardTypeDescriptorOrdinal> params_1N_1F;
00566     params_1N_1F.push_back(STANDARD_TYPE_INT_32);
00567     params_1N_1F.push_back(STANDARD_TYPE_CHAR);
00568 
00569     vector<StandardTypeDescriptorOrdinal> params_1N_1V;
00570     params_1N_1V.push_back(STANDARD_TYPE_INT_32);
00571     params_1N_1V.push_back(STANDARD_TYPE_VARCHAR);
00572 
00573     eit->add(
00574         "strLenBitA", params_1N_1F,
00575         (ExtendedInstruction2<int32_t, char*>*) NULL,
00576         &strLenBitA);
00577     eit->add(
00578         "strLenBitA", params_1N_1V,
00579         (ExtendedInstruction2<int32_t, char*>*) NULL,
00580         &strLenBitA);
00581 
00582     eit->add(
00583         "strLenCharA", params_1N_1F,
00584         (ExtendedInstruction2<int32_t, char*>*) NULL,
00585         &strLenCharA);
00586     eit->add(
00587         "strLenCharA", params_1N_1V,
00588         (ExtendedInstruction2<int32_t, char*>*) NULL,
00589         &strLenCharA);
00590 
00591     eit->add(
00592         "strLenOctA", params_1N_1F,
00593         (ExtendedInstruction2<int32_t, char*>*) NULL,
00594         &strLenOctA);
00595     eit->add(
00596         "strLenOctA", params_1N_1V,
00597         (ExtendedInstruction2<int32_t, char*>*) NULL,
00598         &strLenOctA);
00599 
00600     vector<StandardTypeDescriptorOrdinal> params_1V_2F_2I;
00601     params_1V_2F_2I.push_back(STANDARD_TYPE_VARCHAR);
00602     params_1V_2F_2I.push_back(STANDARD_TYPE_CHAR);
00603     params_1V_2F_2I.push_back(STANDARD_TYPE_CHAR);
00604     params_1V_2F_2I.push_back(STANDARD_TYPE_INT_32);
00605     params_1V_2F_2I.push_back(STANDARD_TYPE_INT_32);
00606 
00607     vector<StandardTypeDescriptorOrdinal> params_3V_2I;
00608     params_3V_2I.push_back(STANDARD_TYPE_VARCHAR);
00609     params_3V_2I.push_back(STANDARD_TYPE_VARCHAR);
00610     params_3V_2I.push_back(STANDARD_TYPE_VARCHAR);
00611     params_3V_2I.push_back(STANDARD_TYPE_INT_32);
00612     params_3V_2I.push_back(STANDARD_TYPE_INT_32);
00613 
00614     eit->add(
00615         "strOverlayA5", params_1V_2F_2I,
00616         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00617         &strOverlayA5);
00618 
00619     eit->add(
00620         "strOverlayA5", params_3V_2I,
00621         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00622         &strOverlayA5);
00623 
00624     vector<StandardTypeDescriptorOrdinal> params_1V_2F_1I;
00625     params_1V_2F_1I.push_back(STANDARD_TYPE_VARCHAR);
00626     params_1V_2F_1I.push_back(STANDARD_TYPE_CHAR);
00627     params_1V_2F_1I.push_back(STANDARD_TYPE_CHAR);
00628     params_1V_2F_1I.push_back(STANDARD_TYPE_INT_32);
00629 
00630     vector<StandardTypeDescriptorOrdinal> params_3V_1I;
00631     params_3V_1I.push_back(STANDARD_TYPE_VARCHAR);
00632     params_3V_1I.push_back(STANDARD_TYPE_VARCHAR);
00633     params_3V_1I.push_back(STANDARD_TYPE_VARCHAR);
00634     params_3V_1I.push_back(STANDARD_TYPE_INT_32);
00635 
00636     eit->add(
00637         "strOverlayA4", params_1V_2F_1I,
00638         (ExtendedInstruction4<char*, char*, char*, int32_t>*) NULL,
00639         &strOverlayA4);
00640 
00641     eit->add(
00642         "strOverlayA4", params_3V_1I,
00643         (ExtendedInstruction4<char*, char*, char*, int32_t>*) NULL,
00644         &strOverlayA4);
00645 
00646 
00647     eit->add(
00648         "strPosA", params_1N_2F,
00649         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00650         &strPosA);
00651 
00652     eit->add(
00653         "strPosA", params_1N_2V,
00654         (ExtendedInstruction3<int32_t, char*, char*>*) NULL,
00655         &strPosA);
00656 
00657     vector<StandardTypeDescriptorOrdinal> params_1V_1F_1N;
00658     params_1V_1F_1N.push_back(STANDARD_TYPE_VARCHAR);
00659     params_1V_1F_1N.push_back(STANDARD_TYPE_CHAR);
00660     params_1V_1F_1N.push_back(STANDARD_TYPE_INT_32);
00661 
00662     vector<StandardTypeDescriptorOrdinal> params_2V_1N;
00663     params_2V_1N.push_back(STANDARD_TYPE_VARCHAR);
00664     params_2V_1N.push_back(STANDARD_TYPE_VARCHAR);
00665     params_2V_1N.push_back(STANDARD_TYPE_INT_32);
00666 
00667     eit->add(
00668         "strSubStringA3", params_1V_1F_1N,
00669         (ExtendedInstruction3<char*, char*, int32_t>*) NULL,
00670         &strSubStringA3);
00671 
00672     eit->add(
00673         "strSubStringA3", params_2V_1N,
00674         (ExtendedInstruction3<char*, char*, int32_t>*) NULL,
00675         &strSubStringA3);
00676 
00677     vector<StandardTypeDescriptorOrdinal> params_1V_1F_2N;
00678     params_1V_1F_2N.push_back(STANDARD_TYPE_VARCHAR);
00679     params_1V_1F_2N.push_back(STANDARD_TYPE_CHAR);
00680     params_1V_1F_2N.push_back(STANDARD_TYPE_INT_32);
00681     params_1V_1F_2N.push_back(STANDARD_TYPE_INT_32);
00682 
00683     vector<StandardTypeDescriptorOrdinal> params_2V_2N;
00684     params_2V_2N.push_back(STANDARD_TYPE_VARCHAR);
00685     params_2V_2N.push_back(STANDARD_TYPE_VARCHAR);
00686     params_2V_2N.push_back(STANDARD_TYPE_INT_32);
00687     params_2V_2N.push_back(STANDARD_TYPE_INT_32);
00688 
00689     eit->add(
00690         "strSubStringA4", params_1V_1F_2N,
00691         (ExtendedInstruction4<char*, char*, int32_t, int32_t>*) NULL,
00692         &strSubStringA4);
00693 
00694     eit->add(
00695         "strSubStringA4", params_2V_2N,
00696         (ExtendedInstruction4<char*, char*, int32_t, int32_t>*) NULL,
00697         &strSubStringA4);
00698 
00699 
00700     eit->add(
00701         "strToLowerA", params_2F,
00702         (ExtendedInstruction2<char*, char*>*) NULL,
00703         &strToLowerA);
00704 
00705     eit->add(
00706         "strToLowerA", params_2V,
00707         (ExtendedInstruction2<char*, char*>*) NULL,
00708         &strToLowerA);
00709 
00710     eit->add(
00711         "strToUpperA", params_2F,
00712         (ExtendedInstruction2<char*, char*>*) NULL,
00713         &strToUpperA);
00714 
00715     eit->add(
00716         "strToUpperA", params_2V,
00717         (ExtendedInstruction2<char*, char*>*) NULL,
00718         &strToUpperA);
00719 
00720 
00721     // Result of strTrimA is always VC. Other two arg strings can be VC or C
00722 
00723     vector<StandardTypeDescriptorOrdinal> params_1V_1F_1V_2I;
00724     params_1V_1F_1V_2I.push_back(STANDARD_TYPE_VARCHAR);
00725     params_1V_1F_1V_2I.push_back(STANDARD_TYPE_CHAR);
00726     params_1V_1F_1V_2I.push_back(STANDARD_TYPE_VARCHAR);
00727     params_1V_1F_1V_2I.push_back(STANDARD_TYPE_INT_32);
00728     params_1V_1F_1V_2I.push_back(STANDARD_TYPE_INT_32);
00729 
00730     vector<StandardTypeDescriptorOrdinal> params_2V_1F_2I;
00731     params_2V_1F_2I.push_back(STANDARD_TYPE_VARCHAR);
00732     params_2V_1F_2I.push_back(STANDARD_TYPE_VARCHAR);
00733     params_2V_1F_2I.push_back(STANDARD_TYPE_CHAR);
00734     params_2V_1F_2I.push_back(STANDARD_TYPE_INT_32);
00735     params_2V_1F_2I.push_back(STANDARD_TYPE_INT_32);
00736 
00737     // VC, VC, VC
00738     eit->add(
00739         "strTrimA", params_3V_2I,
00740         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00741         &strTrimA);
00742     // VC, VC, C
00743     eit->add(
00744         "strTrimA", params_2V_1F_2I,
00745         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00746         &strTrimA);
00747     // VC, C, C
00748     eit->add(
00749         "strTrimA", params_1V_2F_2I,
00750         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00751         &strTrimA);
00752     // VC, C, VC
00753     eit->add(
00754         "strTrimA", params_1V_1F_1V_2I,
00755         (ExtendedInstruction5<char*, char*, char*, int32_t, int32_t>*) NULL,
00756         &strTrimA);
00757 }
00758 
00759 
00760 FENNEL_END_NAMESPACE
00761 
00762 // End ExtString.cpp

Generated on Mon Jun 22 04:00:17 2009 for Fennel by  doxygen 1.5.1