xref: /trunk/main/connectivity/source/drivers/ado/adoimp.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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