1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <stdio.h> 32*cdf0e10cSrcweir #include "connectivity/CommonTools.hxx" 33*cdf0e10cSrcweir #include "connectivity/dbtools.hxx" 34*cdf0e10cSrcweir #include <com/sun/star/util/Date.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/util/Time.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 39*cdf0e10cSrcweir #include <comphelper/extract.hxx> 40*cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.h> 41*cdf0e10cSrcweir #include "TConnection.hxx" 42*cdf0e10cSrcweir #include <comphelper/types.hxx> 43*cdf0e10cSrcweir #include <com/sun/star/java/XJavaVM.hpp> 44*cdf0e10cSrcweir #include <rtl/process.h> 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir using namespace ::comphelper; 47*cdf0e10cSrcweir inline sal_Unicode rtl_ascii_toUpperCase( sal_Unicode ch ) 48*cdf0e10cSrcweir { 49*cdf0e10cSrcweir return ch >= 0x0061 && ch <= 0x007a ? ch + 0x20 : ch; 50*cdf0e10cSrcweir } 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir namespace connectivity 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 55*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 56*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 57*cdf0e10cSrcweir using namespace dbtools; 58*cdf0e10cSrcweir namespace starjava = com::sun::star::java; 59*cdf0e10cSrcweir //------------------------------------------------------------------------------ 60*cdf0e10cSrcweir const sal_Unicode CHAR_PLACE = '_'; 61*cdf0e10cSrcweir const sal_Unicode CHAR_WILD = '%'; 62*cdf0e10cSrcweir // ------------------------------------------------------------------------- 63*cdf0e10cSrcweir sal_Bool match(const sal_Unicode* pWild, const sal_Unicode* pStr, const sal_Unicode cEscape) 64*cdf0e10cSrcweir { 65*cdf0e10cSrcweir int pos=0; 66*cdf0e10cSrcweir int flag=0; 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir while ( *pWild || flag ) 69*cdf0e10cSrcweir { 70*cdf0e10cSrcweir switch (*pWild) 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir case CHAR_PLACE: 73*cdf0e10cSrcweir if ( *pStr == 0 ) 74*cdf0e10cSrcweir return sal_False; 75*cdf0e10cSrcweir break; 76*cdf0e10cSrcweir default: 77*cdf0e10cSrcweir if (*pWild && (*pWild == cEscape) && ((*(pWild+1)== CHAR_PLACE) || (*(pWild+1) == CHAR_WILD)) ) 78*cdf0e10cSrcweir pWild++; 79*cdf0e10cSrcweir if ( rtl_ascii_toUpperCase(*pWild) != rtl_ascii_toUpperCase(*pStr) ) 80*cdf0e10cSrcweir if ( !pos ) 81*cdf0e10cSrcweir return sal_False; 82*cdf0e10cSrcweir else 83*cdf0e10cSrcweir pWild += pos; 84*cdf0e10cSrcweir else 85*cdf0e10cSrcweir break; // ACHTUNG laeuft unter bestimmten 86*cdf0e10cSrcweir // Umstaenden in den nachsten case rein!! 87*cdf0e10cSrcweir case CHAR_WILD: 88*cdf0e10cSrcweir while ( *pWild == CHAR_WILD ) 89*cdf0e10cSrcweir pWild++; 90*cdf0e10cSrcweir if ( *pWild == 0 ) 91*cdf0e10cSrcweir return sal_True; 92*cdf0e10cSrcweir flag = 1; 93*cdf0e10cSrcweir pos = 0; 94*cdf0e10cSrcweir if ( *pStr == 0 ) 95*cdf0e10cSrcweir return ( *pWild == 0 ); 96*cdf0e10cSrcweir while ( *pStr && *pStr != *pWild ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir if ( *pWild == CHAR_PLACE ) { 99*cdf0e10cSrcweir pWild++; 100*cdf0e10cSrcweir while ( *pWild == CHAR_WILD ) 101*cdf0e10cSrcweir pWild++; 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir pStr++; 104*cdf0e10cSrcweir if ( *pStr == 0 ) 105*cdf0e10cSrcweir return ( *pWild == 0 ); 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir break; 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir if ( *pWild != 0 ) 110*cdf0e10cSrcweir pWild++; 111*cdf0e10cSrcweir if ( *pStr != 0 ) 112*cdf0e10cSrcweir pStr++; 113*cdf0e10cSrcweir else 114*cdf0e10cSrcweir flag = 0; 115*cdf0e10cSrcweir if ( flag ) 116*cdf0e10cSrcweir pos--; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir return ( *pStr == 0 ) && ( *pWild == 0 ); 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir //------------------------------------------------------------------ 121*cdf0e10cSrcweir rtl::OUString toDateString(const ::com::sun::star::util::Date& rDate) 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir sal_Char s[11]; 124*cdf0e10cSrcweir snprintf(s, 125*cdf0e10cSrcweir sizeof(s), 126*cdf0e10cSrcweir "%04d-%02d-%02d", 127*cdf0e10cSrcweir (int)rDate.Year, 128*cdf0e10cSrcweir (int)rDate.Month, 129*cdf0e10cSrcweir (int)rDate.Day); 130*cdf0e10cSrcweir s[10] = 0; 131*cdf0e10cSrcweir return rtl::OUString::createFromAscii(s); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir //------------------------------------------------------------------ 135*cdf0e10cSrcweir rtl::OUString toTimeString(const ::com::sun::star::util::Time& rTime) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir sal_Char s[9]; 138*cdf0e10cSrcweir snprintf(s, 139*cdf0e10cSrcweir sizeof(s), 140*cdf0e10cSrcweir "%02d:%02d:%02d", 141*cdf0e10cSrcweir (int)rTime.Hours, 142*cdf0e10cSrcweir (int)rTime.Minutes, 143*cdf0e10cSrcweir (int)rTime.Seconds); 144*cdf0e10cSrcweir s[8] = 0; 145*cdf0e10cSrcweir return rtl::OUString::createFromAscii(s); 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir //------------------------------------------------------------------ 149*cdf0e10cSrcweir rtl::OUString toDateTimeString(const ::com::sun::star::util::DateTime& rDateTime) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir sal_Char s[21]; 152*cdf0e10cSrcweir snprintf(s, 153*cdf0e10cSrcweir sizeof(s), 154*cdf0e10cSrcweir "%04d-%02d-%02d %02d:%02d:%02d", 155*cdf0e10cSrcweir (int)rDateTime.Year, 156*cdf0e10cSrcweir (int)rDateTime.Month, 157*cdf0e10cSrcweir (int)rDateTime.Day, 158*cdf0e10cSrcweir (int)rDateTime.Hours, 159*cdf0e10cSrcweir (int)rDateTime.Minutes, 160*cdf0e10cSrcweir (int)rDateTime.Seconds); 161*cdf0e10cSrcweir s[20] = 0; 162*cdf0e10cSrcweir return rtl::OUString::createFromAscii(s); 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 167*cdf0e10cSrcweir rtl::OUString toString(const Any& rValue) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir rtl::OUString aRes; 170*cdf0e10cSrcweir TypeClass aDestinationClass = rValue.getValueType().getTypeClass(); 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir switch (aDestinationClass) 173*cdf0e10cSrcweir { 174*cdf0e10cSrcweir case TypeClass_CHAR: 175*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf(*(sal_Unicode*)rValue.getValue()); 176*cdf0e10cSrcweir break; 177*cdf0e10cSrcweir case TypeClass_FLOAT: 178*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf(*(float*)rValue.getValue()); 179*cdf0e10cSrcweir break; 180*cdf0e10cSrcweir case TypeClass_DOUBLE: 181*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf(*(double*)rValue.getValue()); 182*cdf0e10cSrcweir break; 183*cdf0e10cSrcweir case TypeClass_BOOLEAN: 184*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf((sal_Int32)*(sal_Bool*)rValue.getValue()); 185*cdf0e10cSrcweir break; 186*cdf0e10cSrcweir case TypeClass_BYTE: 187*cdf0e10cSrcweir case TypeClass_SHORT: 188*cdf0e10cSrcweir case TypeClass_LONG: 189*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf(*(sal_Int32*)rValue.getValue()); 190*cdf0e10cSrcweir break; 191*cdf0e10cSrcweir case TypeClass_HYPER: 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir sal_Int64 nValue = 0; 194*cdf0e10cSrcweir OSL_VERIFY( rValue >>= nValue ); 195*cdf0e10cSrcweir aRes = ::rtl::OUString::valueOf(nValue); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir case TypeClass_STRING: 198*cdf0e10cSrcweir rValue >>= aRes; 199*cdf0e10cSrcweir break; 200*cdf0e10cSrcweir case TypeClass_STRUCT: 201*cdf0e10cSrcweir if (rValue.getValueType() == ::getCppuType((const ::com::sun::star::util::Date*)0)) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir ::com::sun::star::util::Date aDate; 204*cdf0e10cSrcweir rValue >>= aDate; 205*cdf0e10cSrcweir aRes = toDateString(aDate); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir else if (rValue.getValueType() == ::getCppuType((const ::com::sun::star::util::DateTime*)0)) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir ::com::sun::star::util::DateTime aDT; 210*cdf0e10cSrcweir rValue >>= aDT; 211*cdf0e10cSrcweir aRes = toDateTimeString(aDT); 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir else if (rValue.getValueType() == ::getCppuType((const ::com::sun::star::util::Time*)0)) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir ::com::sun::star::util::Time aTime; 216*cdf0e10cSrcweir rValue >>= aTime; 217*cdf0e10cSrcweir aRes = toTimeString(aTime); 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir break; 221*cdf0e10cSrcweir default: 222*cdf0e10cSrcweir ; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir return aRes; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 228*cdf0e10cSrcweir ::rtl::Reference< jvmaccess::VirtualMachine > getJavaVM(const Reference<XMultiServiceFactory >& _rxFactory) 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir ::rtl::Reference< jvmaccess::VirtualMachine > aRet; 231*cdf0e10cSrcweir OSL_ENSURE(_rxFactory.is(),"No XMultiServiceFactory a.v.!"); 232*cdf0e10cSrcweir if(!_rxFactory.is()) 233*cdf0e10cSrcweir return aRet; 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir try 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir Reference< starjava::XJavaVM > xVM(_rxFactory->createInstance( 238*cdf0e10cSrcweir rtl::OUString::createFromAscii("com.sun.star.java.JavaVirtualMachine")), UNO_QUERY); 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir OSL_ENSURE(_rxFactory.is(),"InitJava: I have no factory!"); 241*cdf0e10cSrcweir if (!xVM.is() || !_rxFactory.is()) 242*cdf0e10cSrcweir throw Exception(); // -2; 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir Sequence<sal_Int8> processID(16); 245*cdf0e10cSrcweir rtl_getGlobalProcessId( (sal_uInt8*) processID.getArray() ); 246*cdf0e10cSrcweir processID.realloc(17); 247*cdf0e10cSrcweir processID[16] = 0; 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir Any uaJVM = xVM->getJavaVM( processID ); 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir if (!uaJVM.hasValue()) 252*cdf0e10cSrcweir throw Exception(); // -5 253*cdf0e10cSrcweir else 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir sal_Int32 nValue = 0; 256*cdf0e10cSrcweir jvmaccess::VirtualMachine* pJVM = NULL; 257*cdf0e10cSrcweir if ( uaJVM >>= nValue ) 258*cdf0e10cSrcweir pJVM = reinterpret_cast< jvmaccess::VirtualMachine* > (nValue); 259*cdf0e10cSrcweir else 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir sal_Int64 nTemp = 0; 262*cdf0e10cSrcweir uaJVM >>= nTemp; 263*cdf0e10cSrcweir pJVM = reinterpret_cast< jvmaccess::VirtualMachine* > (nTemp); 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir aRet = pJVM; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir catch (Exception&) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir return aRet; 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir //------------------------------------------------------------------------------ 275*cdf0e10cSrcweir sal_Bool existsJavaClassByName( const ::rtl::Reference< jvmaccess::VirtualMachine >& _pJVM,const ::rtl::OUString& _sClassName ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir sal_Bool bRet = sal_False; 278*cdf0e10cSrcweir #ifdef SOLAR_JAVA 279*cdf0e10cSrcweir if ( _pJVM.is() ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir jvmaccess::VirtualMachine::AttachGuard aGuard(_pJVM); 282*cdf0e10cSrcweir JNIEnv* pEnv = aGuard.getEnvironment(); 283*cdf0e10cSrcweir if( pEnv ) 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir ::rtl::OString sClassName = ::rtl::OUStringToOString(_sClassName, RTL_TEXTENCODING_ASCII_US); 286*cdf0e10cSrcweir sClassName = sClassName.replace('.','/'); 287*cdf0e10cSrcweir jobject out = pEnv->FindClass(sClassName); 288*cdf0e10cSrcweir bRet = out != NULL; 289*cdf0e10cSrcweir pEnv->DeleteLocalRef( out ); 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir } 292*cdf0e10cSrcweir #endif 293*cdf0e10cSrcweir return bRet; 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir 298*cdf0e10cSrcweir #include <ctype.h> //isdigit 299*cdf0e10cSrcweir namespace dbtools 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir //------------------------------------------------------------------ 302*cdf0e10cSrcweir sal_Bool isCharOk(sal_Unicode c,const ::rtl::OUString& _rSpecials) 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir return ( ((c >= 97) && (c <= 122)) || ((c >= 65) && (c <= 90)) || ((c >= 48) && (c <= 57)) || 306*cdf0e10cSrcweir c == '_' || _rSpecials.indexOf(c) != -1); 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir //------------------------------------------------------------------------------ 310*cdf0e10cSrcweir sal_Bool isValidSQLName(const ::rtl::OUString& rName,const ::rtl::OUString& _rSpecials) 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir // Ueberpruefung auf korrekte Namensgebung im SQL Sinne 313*cdf0e10cSrcweir // Dieses ist wichtig fuer Tabellennamen beispielsweise 314*cdf0e10cSrcweir const sal_Unicode* pStr = rName.getStr(); 315*cdf0e10cSrcweir if (*pStr > 127 || isdigit(*pStr)) 316*cdf0e10cSrcweir return sal_False; 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir for (; *pStr; ++pStr ) 319*cdf0e10cSrcweir if(!isCharOk(*pStr,_rSpecials)) 320*cdf0e10cSrcweir return sal_False; 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir if ( rName.getLength() 323*cdf0e10cSrcweir && ( (rName.toChar() == '_') 324*cdf0e10cSrcweir || ( (rName.toChar() >= '0') 325*cdf0e10cSrcweir && (rName.toChar() <= '9') 326*cdf0e10cSrcweir ) 327*cdf0e10cSrcweir ) 328*cdf0e10cSrcweir ) 329*cdf0e10cSrcweir return sal_False; 330*cdf0e10cSrcweir // the SQL-Standard requires the first character to be an alphabetic character, which 331*cdf0e10cSrcweir // isn't easy to decide in UniCode ... 332*cdf0e10cSrcweir // So we just prohibit the characters which already lead to problems .... 333*cdf0e10cSrcweir // 11.04.00 - 74902 - FS 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir return sal_True; 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir //------------------------------------------------------------------ 338*cdf0e10cSrcweir // Erzeugt einen neuen Namen falls noetig 339*cdf0e10cSrcweir ::rtl::OUString convertName2SQLName(const ::rtl::OUString& rName,const ::rtl::OUString& _rSpecials) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir if(isValidSQLName(rName,_rSpecials)) 342*cdf0e10cSrcweir return rName; 343*cdf0e10cSrcweir ::rtl::OUString aNewName(rName); 344*cdf0e10cSrcweir const sal_Unicode* pStr = rName.getStr(); 345*cdf0e10cSrcweir sal_Int32 nLength = rName.getLength(); 346*cdf0e10cSrcweir sal_Bool bValid(*pStr < 128 && !isdigit(*pStr)); 347*cdf0e10cSrcweir for (sal_Int32 i=0; bValid && i < nLength; ++pStr,++i ) 348*cdf0e10cSrcweir if(!isCharOk(*pStr,_rSpecials)) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir aNewName = aNewName.replace(*pStr,'_'); 351*cdf0e10cSrcweir pStr = aNewName.getStr() + i; 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir if ( !bValid ) 355*cdf0e10cSrcweir aNewName = ::rtl::OUString(); 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir return aNewName; 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir //------------------------------------------------------------------------------ 360*cdf0e10cSrcweir ::rtl::OUString quoteName(const ::rtl::OUString& _rQuote, const ::rtl::OUString& _rName) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir ::rtl::OUString sName = _rName; 363*cdf0e10cSrcweir if(_rQuote.getLength() && _rQuote.toChar() != ' ') 364*cdf0e10cSrcweir sName = _rQuote + _rName + _rQuote; 365*cdf0e10cSrcweir return sName; 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir } 370