xref: /AOO41X/main/connectivity/source/drivers/ado/adoimp.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
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 
GetKeyStr()76 OLEString& ADOS::GetKeyStr()
77 {
78     static OLEString sKeyStr(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz")));
79     return sKeyStr;
80 }
81 
82 // -------------------------------------------------------------------------
MapADOType2Jdbc(DataTypeEnum eType)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 // -------------------------------------------------------------------------
MapJdbc2ADOType(sal_Int32 _nType,sal_Int32 _nJetEngine)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 
isJetEngine(sal_Int32 _nEngineType)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 // -----------------------------------------------------------------------------
mapObjectType2Ado(sal_Int32 objType)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 // -----------------------------------------------------------------------------
mapAdoType2Object(ObjectTypeEnum objType)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 // -----------------------------------------------------------------------------
mapAdoRights2Sdbc(RightsEnum eRights)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 // -----------------------------------------------------------------------------
mapRights2Ado(sal_Int32 nRights)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 // -----------------------------------------------------------------------------
getField(ADORecordset * _pRecordSet,sal_Int32 _nColumnIndex)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