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