1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_connectivity.hxx" 30 #include <com/sun/star/sdbcx/Privilege.hpp> 31 #include <com/sun/star/sdbcx/PrivilegeObject.hpp> 32 #include "connectivity/dbexception.hxx" 33 #include "ado/Awrapado.hxx" 34 #include "ado/adoimp.hxx" 35 #include <osl/diagnose.h> 36 #include <com/sun/star/sdbc/DataType.hpp> 37 38 39 using namespace connectivity::ado; 40 using namespace com::sun::star::uno; 41 using namespace com::sun::star::sdbc; 42 using namespace com::sun::star::sdbcx; 43 44 45 #define MYADOID(l) {l, 0,0x10,0x80,0,0,0xAA,0,0x6D,0x2E,0xA4}; 46 47 const CLSID ADOS::CLSID_ADOCONNECTION_21 = MYADOID(0x00000514); 48 const IID ADOS::IID_ADOCONNECTION_21 = MYADOID(0x00000550); 49 50 const CLSID ADOS::CLSID_ADOCOMMAND_21 = MYADOID(0x00000507); 51 const IID ADOS::IID_ADOCOMMAND_21 = MYADOID(0x0000054E); 52 53 const CLSID ADOS::CLSID_ADORECORDSET_21 = MYADOID(0x00000535); 54 const IID ADOS::IID_ADORECORDSET_21 = MYADOID(0x0000054F); 55 56 const CLSID ADOS::CLSID_ADOCATALOG_25 = MYADOID(0x00000602); 57 const IID ADOS::IID_ADOCATALOG_25 = MYADOID(0x00000603); 58 59 const CLSID ADOS::CLSID_ADOINDEX_25 = MYADOID(0x0000061E); 60 const IID ADOS::IID_ADOINDEX_25 = MYADOID(0x0000061F); 61 62 const CLSID ADOS::CLSID_ADOTABLE_25 = MYADOID(0x00000609); 63 const IID ADOS::IID_ADOTABLE_25 = MYADOID(0x00000610); 64 65 const CLSID ADOS::CLSID_ADOKEY_25 = MYADOID(0x00000621); 66 const IID ADOS::IID_ADOKEY_25 = MYADOID(0x00000622); 67 68 const CLSID ADOS::CLSID_ADOCOLUMN_25 = MYADOID(0x0000061B); 69 const IID ADOS::IID_ADOCOLUMN_25 = MYADOID(0x0000061C); 70 71 const CLSID ADOS::CLSID_ADOGROUP_25 = MYADOID(0x00000615); 72 const IID ADOS::IID_ADOGROUP_25 = MYADOID(0x00000616); 73 74 const CLSID ADOS::CLSID_ADOUSER_25 = MYADOID(0x00000618); 75 const IID ADOS::IID_ADOUSER_25 = MYADOID(0x00000619); 76 77 const CLSID ADOS::CLSID_ADOVIEW_25 = MYADOID(0x00000612); 78 const IID ADOS::IID_ADOVIEW_25 = MYADOID(0x00000613); 79 80 OLEString& ADOS::GetKeyStr() 81 { 82 static OLEString sKeyStr(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz"))); 83 return sKeyStr; 84 } 85 86 // ------------------------------------------------------------------------- 87 sal_Int32 ADOS::MapADOType2Jdbc(DataTypeEnum eType) 88 { 89 sal_Int32 nType = DataType::VARCHAR;; 90 switch (eType) 91 { 92 case adUnsignedSmallInt: 93 case adSmallInt: nType = DataType::SMALLINT; break; 94 case adUnsignedInt: 95 case adInteger: nType = DataType::INTEGER; break; 96 case adUnsignedBigInt: 97 case adBigInt: nType = DataType::BIGINT; break; 98 case adSingle: nType = DataType::FLOAT; break; 99 case adDouble: nType = DataType::DOUBLE; break; 100 case adCurrency: nType = DataType::DOUBLE; break; 101 case adVarNumeric: 102 case adNumeric: nType = DataType::NUMERIC; break; 103 case adDecimal: nType = DataType::DECIMAL; break; 104 case adDBDate: nType = DataType::DATE; break; 105 case adDBTime: nType = DataType::TIME; break; 106 case adDate: 107 case adDBTimeStamp: nType = DataType::TIMESTAMP; break; 108 case adBoolean: nType = DataType::BOOLEAN; break; 109 // case adArray: nType = DataType::ARRAY; break; 110 case adBinary: nType = DataType::BINARY; break; 111 case adGUID: nType = DataType::OBJECT; break; 112 case adBSTR: 113 case adVarWChar: 114 case adWChar: 115 case adVarChar: nType = DataType::VARCHAR; break; 116 case adLongVarWChar: 117 case adLongVarChar: nType = DataType::LONGVARCHAR; break; 118 case adVarBinary: nType = DataType::VARBINARY; break; 119 case adLongVarBinary: nType = DataType::LONGVARBINARY;break; 120 case adChar: nType = DataType::CHAR; break; 121 case adUnsignedTinyInt: 122 case adTinyInt: nType = DataType::TINYINT; break; 123 case adEmpty: nType = DataType::SQLNULL; break; 124 case adUserDefined: 125 case adPropVariant: 126 case adFileTime: 127 case adChapter: 128 case adIDispatch: 129 case adIUnknown: 130 case adError: 131 case adVariant: 132 nType = DataType::OTHER; break; 133 default: 134 OSL_ENSURE(0,"MapADOType2Jdbc: Unknown Type!"); 135 ; 136 } 137 return nType; 138 } 139 // ------------------------------------------------------------------------- 140 DataTypeEnum ADOS::MapJdbc2ADOType(sal_Int32 _nType,sal_Int32 _nJetEngine) 141 { 142 switch (_nType) 143 { 144 case DataType::SMALLINT: return adSmallInt; break; 145 case DataType::INTEGER: return adInteger; break; 146 case DataType::BIGINT: return adBigInt; break; 147 case DataType::FLOAT: return adSingle; break; 148 case DataType::DOUBLE: return adDouble; break; 149 case DataType::NUMERIC: return adNumeric; break; 150 case DataType::DECIMAL: return adDecimal; break; 151 case DataType::DATE: return isJetEngine(_nJetEngine) ? adDate : adDBDate; break; 152 case DataType::TIME: return adDBTime; break; 153 case DataType::TIMESTAMP: return isJetEngine(_nJetEngine) ? adDate : adDBTimeStamp; break; 154 case DataType::BOOLEAN: 155 case DataType::BIT: return adBoolean; break; 156 case DataType::BINARY: return adBinary; break; 157 case DataType::VARCHAR: return adVarWChar; break; 158 case DataType::CLOB: 159 case DataType::LONGVARCHAR: return adLongVarWChar; break; 160 case DataType::VARBINARY: return adVarBinary; break; 161 case DataType::BLOB: 162 case DataType::LONGVARBINARY: return adLongVarBinary; break; 163 case DataType::CHAR: return adWChar; break; 164 case DataType::TINYINT: return isJetEngine(_nJetEngine) ? adUnsignedTinyInt : adTinyInt;break; 165 case DataType::OBJECT: return adGUID; break; 166 default: 167 OSL_ENSURE(0,"MapJdbc2ADOType: Unknown Type!"); 168 ; 169 } 170 return adEmpty; 171 } 172 // ----------------------------------------------------------------------------- 173 const int JET_ENGINETYPE_UNKNOWN = 0; 174 const int JET_ENGINETYPE_JET10 = 1; 175 const int JET_ENGINETYPE_JET11 = 2; 176 const int JET_ENGINETYPE_JET20 = 3; 177 const int JET_ENGINETYPE_JET3X = 4; 178 const int JET_ENGINETYPE_JET4X = 5; 179 const int JET_ENGINETYPE_DBASE3 = 10; 180 const int JET_ENGINETYPE_DBASE4 = 11; 181 const int JET_ENGINETYPE_DBASE5 = 12; 182 const int JET_ENGINETYPE_EXCEL30 = 20; 183 const int JET_ENGINETYPE_EXCEL40 = 21; 184 const int JET_ENGINETYPE_EXCEL50 = 22; 185 const int JET_ENGINETYPE_EXCEL80 = 23; 186 const int JET_ENGINETYPE_EXCEL90 = 24; 187 const int JET_ENGINETYPE_EXCHANGE4 = 30; 188 const int JET_ENGINETYPE_LOTUSWK1 = 40; 189 const int JET_ENGINETYPE_LOTUSWK3 = 41; 190 const int JET_ENGINETYPE_LOTUSWK4 = 42; 191 const int JET_ENGINETYPE_PARADOX3X = 50; 192 const int JET_ENGINETYPE_PARADOX4X = 51; 193 const int JET_ENGINETYPE_PARADOX5X = 52; 194 const int JET_ENGINETYPE_PARADOX7X = 53; 195 const int JET_ENGINETYPE_TEXT1X = 60; 196 const int JET_ENGINETYPE_HTML1X = 70; 197 198 sal_Bool ADOS::isJetEngine(sal_Int32 _nEngineType) 199 { 200 sal_Bool bRet = sal_False; 201 switch(_nEngineType) 202 { 203 case JET_ENGINETYPE_UNKNOWN: 204 case JET_ENGINETYPE_JET10: 205 case JET_ENGINETYPE_JET11: 206 case JET_ENGINETYPE_JET20: 207 case JET_ENGINETYPE_JET3X: 208 case JET_ENGINETYPE_JET4X: 209 case JET_ENGINETYPE_DBASE3: 210 case JET_ENGINETYPE_DBASE4: 211 case JET_ENGINETYPE_DBASE5: 212 case JET_ENGINETYPE_EXCEL30: 213 case JET_ENGINETYPE_EXCEL40: 214 case JET_ENGINETYPE_EXCEL50: 215 case JET_ENGINETYPE_EXCEL80: 216 case JET_ENGINETYPE_EXCEL90: 217 case JET_ENGINETYPE_EXCHANGE4: 218 case JET_ENGINETYPE_LOTUSWK1: 219 case JET_ENGINETYPE_LOTUSWK3: 220 case JET_ENGINETYPE_LOTUSWK4: 221 case JET_ENGINETYPE_PARADOX3X: 222 case JET_ENGINETYPE_PARADOX4X: 223 case JET_ENGINETYPE_PARADOX5X: 224 case JET_ENGINETYPE_PARADOX7X: 225 case JET_ENGINETYPE_TEXT1X: 226 case JET_ENGINETYPE_HTML1X: 227 bRet = sal_True; 228 break; 229 } 230 return bRet; 231 } 232 // ----------------------------------------------------------------------------- 233 ObjectTypeEnum ADOS::mapObjectType2Ado(sal_Int32 objType) 234 { 235 ObjectTypeEnum eType = adPermObjTable; 236 switch(objType) 237 { 238 case PrivilegeObject::TABLE: 239 eType = adPermObjTable; 240 break; 241 case PrivilegeObject::VIEW: 242 eType = adPermObjView; 243 break; 244 case PrivilegeObject::COLUMN: 245 eType = adPermObjColumn; 246 break; 247 } 248 return eType; 249 } 250 // ----------------------------------------------------------------------------- 251 sal_Int32 ADOS::mapAdoType2Object(ObjectTypeEnum objType) 252 { 253 sal_Int32 nType = PrivilegeObject::TABLE; 254 switch(objType) 255 { 256 case adPermObjTable: 257 nType = PrivilegeObject::TABLE; 258 break; 259 case adPermObjView: 260 nType = PrivilegeObject::VIEW; 261 break; 262 case adPermObjColumn: 263 nType = PrivilegeObject::COLUMN; 264 break; 265 default: 266 OSL_ENSURE( false, "ADOS::mapAdoType2Object: privilege type cannot be translated!" ); 267 break; 268 } 269 return nType; 270 } 271 #ifdef DELETE 272 #undef DELETE 273 #endif 274 // ----------------------------------------------------------------------------- 275 sal_Int32 ADOS::mapAdoRights2Sdbc(RightsEnum eRights) 276 { 277 sal_Int32 nRights = 0; 278 if((eRights & adRightInsert) == adRightInsert) 279 nRights |= Privilege::INSERT; 280 if((eRights & adRightDelete) == adRightDelete) 281 nRights |= ::com::sun::star::sdbcx::Privilege::DELETE; 282 if((eRights & adRightUpdate) == adRightUpdate) 283 nRights |= Privilege::UPDATE; 284 if((eRights & adRightWriteDesign) == adRightWriteDesign) 285 nRights |= Privilege::ALTER; 286 if((eRights & adRightRead) == adRightRead) 287 nRights |= Privilege::SELECT; 288 if((eRights & adRightReference) == adRightReference) 289 nRights |= Privilege::REFERENCE; 290 if((eRights & adRightDrop) == adRightDrop) 291 nRights |= Privilege::DROP; 292 293 return nRights; 294 } 295 // ----------------------------------------------------------------------------- 296 sal_Int32 ADOS::mapRights2Ado(sal_Int32 nRights) 297 { 298 sal_Int32 eRights = adRightNone; 299 300 if((nRights & Privilege::INSERT) == Privilege::INSERT) 301 eRights |= adRightInsert; 302 if((nRights & Privilege::DELETE) == Privilege::DELETE) 303 eRights |= adRightDelete; 304 if((nRights & Privilege::UPDATE) == Privilege::UPDATE) 305 eRights |= adRightUpdate; 306 if((nRights & Privilege::ALTER) == Privilege::ALTER) 307 eRights |= adRightWriteDesign; 308 if((nRights & Privilege::SELECT) == Privilege::SELECT) 309 eRights |= adRightRead; 310 if((nRights & Privilege::REFERENCE) == Privilege::REFERENCE) 311 eRights |= adRightReference; 312 if((nRights & Privilege::DROP) == Privilege::DROP) 313 eRights |= adRightDrop; 314 315 return eRights; 316 } 317 // ----------------------------------------------------------------------------- 318 WpADOField ADOS::getField(ADORecordset* _pRecordSet,sal_Int32 _nColumnIndex) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 319 { 320 if ( !_pRecordSet ) 321 return WpADOField(); 322 323 ADOFields* pFields = NULL; 324 _pRecordSet->get_Fields(&pFields); 325 WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(pFields); 326 if(_nColumnIndex <= 0 || _nColumnIndex > aFields.GetItemCount()) 327 ::dbtools::throwInvalidIndexException(NULL); 328 WpADOField aField(aFields.GetItem(_nColumnIndex-1)); 329 if(!aField.IsValid()) 330 ::dbtools::throwInvalidIndexException(NULL); 331 return aField; 332 } 333 // ----------------------------------------------------------------------------- 334 335 336 337 338