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