xref: /AOO41X/main/ucbhelper/inc/ucbhelper/resultsetmetadata.hxx (revision b3b486c3fa1b38c2de306d076387b46c94e4246f)
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 #ifndef _UCBHELPER_RESULTSETMETADATA_HXX
25 #define _UCBHELPER_RESULTSETMETADATA_HXX
26 
27 #include <vector>
28 #include <com/sun/star/uno/Reference.hxx>
29 #include <com/sun/star/uno/Sequence.hxx>
30 #include <com/sun/star/lang/XTypeProvider.hpp>
31 #include <com/sun/star/sdbc/ColumnValue.hpp>
32 #include <com/sun/star/sdbc/XResultSetMetaData.hpp>
33 #include <cppuhelper/weak.hxx>
34 #include <ucbhelper/macros.hxx>
35 #include "ucbhelper/ucbhelperdllapi.h"
36 
37 namespace com { namespace sun { namespace star {
38     namespace lang  { class XMultiServiceFactory; }
39     namespace beans { struct Property; }
40 } } }
41 
42 namespace ucbhelper_impl {
43     struct ResultSetMetaData_Impl;
44 }
45 
46 namespace ucbhelper
47 {
48 
49 //=========================================================================
50 
51 /**
52  * This is a structure that holds additional meta data for one column
53  * of a resultset. The default values set in the constructor should be a
54  * good guess for many UCB use cases.
55  */
56 struct ResultSetColumnData
57 {
58     /** @see ResultSetMetaData::isAutoIncrement */
59     sal_Bool        isAutoIncrement;
60 
61     /** @see ResultSetMetaData::isCaseSensitive */
62     sal_Bool        isCaseSensitive;
63 
64     /** @see ResultSetMetaData::isSearchable */
65     sal_Bool        isSearchable;
66 
67     /** @see ResultSetMetaData::isCurrency */
68     sal_Bool        isCurrency;
69 
70     /** @see ResultSetMetaData::isNullable */
71     sal_Int32       isNullable;
72 
73     /** @see ResultSetMetaData::isSigned */
74     sal_Bool        isSigned;
75 
76     /** @see ResultSetMetaData::getColumnDisplaySize */
77     sal_Int32       columnDisplaySize;
78 
79     /** @see ResultSetMetaData::getColumnLabel */
80     ::rtl::OUString columnLabel;
81 
82     /** @see ResultSetMetaData::getSchemaName */
83     ::rtl::OUString schemaName;
84 
85     /** @see ResultSetMetaData::getPrecision */
86     sal_Int32       precision;
87 
88     /** @see ResultSetMetaData::getScale */
89     sal_Int32       scale;
90 
91     /** @see ResultSetMetaData::getTableName */
92     ::rtl::OUString tableName;
93 
94     /** @see ResultSetMetaData::getCatalogName */
95     ::rtl::OUString catalogName;
96 
97     /** @see ResultSetMetaData::getColumnTypeName */
98     ::rtl::OUString columnTypeName;
99 
100     /** @see ResultSetMetaData::isReadOnly */
101     sal_Bool        isReadOnly;
102 
103     /** @see ResultSetMetaData::isWritable */
104     sal_Bool        isWritable;
105 
106     /** @see ResultSetMetaData::isDefinitelyWritable */
107     sal_Bool        isDefinitelyWritable;
108 
109     /** @see ResultSetMetaData::getColumnServiceName */
110     ::rtl::OUString columnServiceName;
111 
112     inline ResultSetColumnData();
113 };
114 
115 // Note: Never change the initial values! Implementations using this struct
116 //       may havily depend on the behaviour of the default constructor.
117 
ResultSetColumnData()118 ResultSetColumnData::ResultSetColumnData()
119 : isAutoIncrement( sal_False ),
120   isCaseSensitive( sal_True ),
121   isSearchable( sal_False ),
122   isCurrency( sal_False ),
123   isNullable( ::com::sun::star::sdbc::ColumnValue::NULLABLE ),
124   isSigned( sal_False ),
125   columnDisplaySize( 16 ),
126   precision( -1 ),
127   scale( 0 ),
128   isReadOnly( sal_True ),
129   isWritable( sal_False ),
130   isDefinitelyWritable( sal_False )
131 {
132 }
133 
134 //=========================================================================
135 
136 /**
137  * This is an implementation of the interface XResultSetMetaData. It can be
138  * used to implement the interface
139  * com::sun::star::sdbc::XResultSetMetaDataSupplier, which is required for
140  * implementations of service com.sun.star.ucb.ContentResultSet.
141  */
142 class UCBHELPER_DLLPUBLIC ResultSetMetaData :
143                 public ::cppu::OWeakObject,
144                 public ::com::sun::star::lang::XTypeProvider,
145                 public ::com::sun::star::sdbc::XResultSetMetaData
146 {
147 private:
148     ucbhelper_impl::ResultSetMetaData_Impl* m_pImpl;
149 
150 protected:
151     ::com::sun::star::uno::Reference<
152         ::com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
153     ::com::sun::star::uno::Sequence<
154         ::com::sun::star::beans::Property >            m_aProps;
155     sal_Bool m_bReadOnly;
156 
157 public:
158 
159     /**
160       * Constructor.
161       *
162       * @param rxSMgr is a Servive Manager.
163       * @param rProps is a sequence of properties (partially) describing the
164       *        columns of a resultset.
165       * @param bReadOnly is used to specify whether the whole(!) resultset
166       *        is read-only.
167       */
168     ResultSetMetaData(
169             const ::com::sun::star::uno::Reference<
170                 ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
171             const ::com::sun::star::uno::Sequence<
172                 ::com::sun::star::beans::Property >& rProps,
173             sal_Bool bReadOnly = sal_True );
174 
175     /**
176       * Constructor.
177       *
178       * @param rxSMgr is a Servive Manager.
179       * @param rProps is a sequence of properties (partially) describing the
180       *        columns of a resultset.
181       * @param rColumnData contains additional meta data for the columns of
182       *        a resultset, which override the default values returned by the
183       *        appropriate methods of this class. The length of rColumnData
184       *        must be the same as length of rProps.
185       *        rColumnData[ 0 ] corresponds to data in rProps[ 0 ],
186       *        rColumnData[ 1 ] corresponds to data in rProps[ 1 ], ...
187       */
188     ResultSetMetaData(
189             const ::com::sun::star::uno::Reference<
190                 ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
191             const ::com::sun::star::uno::Sequence<
192                 ::com::sun::star::beans::Property >& rProps,
193             const std::vector< ResultSetColumnData >& rColumnData );
194 
195     /**
196       * Destructor.
197       */
198     virtual ~ResultSetMetaData();
199 
200     // XInterface
201     XINTERFACE_DECL()
202 
203     // XTypeProvider
204     XTYPEPROVIDER_DECL()
205 
206     // XResultSetMetaData
207 
208     /**
209       * Returns the number of columns of the resultset.
210       *
211       * @return the length of the property sequence.
212       */
213     virtual sal_Int32 SAL_CALL
214     getColumnCount()
215         throw( ::com::sun::star::sdbc::SQLException,
216                ::com::sun::star::uno::RuntimeException );
217     /**
218       * Checks whether column is automatically numbered, which makes it
219       * read-only.
220       *
221       * @param  column is the number of the column for that a value shall
222       *         be returned. The first column is 1, the second is 2, ...
223       * @return true, if column is automatically numbered.
224       */
225     virtual sal_Bool SAL_CALL
226     isAutoIncrement( sal_Int32 column )
227         throw( ::com::sun::star::sdbc::SQLException,
228                ::com::sun::star::uno::RuntimeException );
229     /**
230       * Checks whether column is case sensitive.
231       *
232       * @param  column is the number of the column for that a value shall
233       *         be returned. The first column is 1, the second is 2, ...
234       * @return true, if column is case sensitive.
235       */
236     virtual sal_Bool SAL_CALL
237     isCaseSensitive( sal_Int32 column )
238         throw( ::com::sun::star::sdbc::SQLException,
239                ::com::sun::star::uno::RuntimeException );
240     /**
241       * Checks whether the value stored in column can be used in a
242       * WHERE clause.
243       *
244       * @param  column is the number of the column for that a value shall
245       *         be returned. The first column is 1, the second is 2, ...
246       * @return true, if the column is searchable.
247       */
248     virtual sal_Bool SAL_CALL
249     isSearchable( sal_Int32 column )
250         throw( ::com::sun::star::sdbc::SQLException,
251                ::com::sun::star::uno::RuntimeException );
252     /**
253       * Checks whether column is a cash value.
254       *
255       * @param  column is the number of the column for that a value shall
256       *         be returned. The first column is 1, the second is 2, ...
257       * @return true, if the column is a cash value.
258       */
259     virtual sal_Bool SAL_CALL
260     isCurrency( sal_Int32 column )
261         throw( ::com::sun::star::sdbc::SQLException,
262                ::com::sun::star::uno::RuntimeException );
263     /**
264       * Checks whether a NULL can be stored in column.
265       *
266       * @see com::sun::star::sdbc::ColumnValue
267       *
268       * @param  column is the number of the column for that a value shall
269       *         be returned. The first column is 1, the second is 2, ...
270       * @return ::com::sun::star::sdbc::ColumnValue::NULLABLE, if a NULL
271       *         can be stored in the column.
272       */
273     virtual sal_Int32 SAL_CALL
274     isNullable( sal_Int32 column )
275         throw( ::com::sun::star::sdbc::SQLException,
276                ::com::sun::star::uno::RuntimeException );
277     /**
278       * Checks whether the value stored in column is a signed number.
279       *
280       * @param  column is the number of the column for that a value shall
281       *         be returned. The first column is 1, the second is 2, ...
282       * @return true, if the value stored in column is a signed number.
283       */
284     virtual sal_Bool SAL_CALL
285     isSigned( sal_Int32 column )
286         throw( ::com::sun::star::sdbc::SQLException,
287                ::com::sun::star::uno::RuntimeException );
288     /**
289       * Gets the normal maximum width in characters for column.
290       *
291       * @param  column is the number of the column for that a value shall
292       *         be returned. The first column is 1, the second is 2, ...
293       * @return the normal maximum width in characters for column.
294       */
295     virtual sal_Int32 SAL_CALL
296     getColumnDisplaySize( sal_Int32 column )
297         throw( ::com::sun::star::sdbc::SQLException,
298                ::com::sun::star::uno::RuntimeException );
299     /**
300       * Gets the suggested column title for column, to be used in print-
301       * outs and displays.
302       *
303       * @param  column is the number of the column for that a value shall
304       *         be returned. The first column is 1, the second is 2, ...
305       * @return the column label.
306       */
307     virtual ::rtl::OUString SAL_CALL
308     getColumnLabel( sal_Int32 column )
309         throw( ::com::sun::star::sdbc::SQLException,
310                ::com::sun::star::uno::RuntimeException );
311     /**
312       * Gets the name of column.
313       *
314       * @param  column is the number of the column for that a value shall
315       *         be returned. The first column is 1, the second is 2, ...
316       * @return the name of the property that corresponds to column.
317       */
318     virtual ::rtl::OUString SAL_CALL
319     getColumnName( sal_Int32 column )
320         throw( ::com::sun::star::sdbc::SQLException,
321                ::com::sun::star::uno::RuntimeException );
322     /**
323       * Gets the schema name for the table from which column of this
324       * result set was derived.
325       * Because this feature is not widely supported, the return value
326       * for many DBMSs will be an empty string.
327       *
328       * @param  column is the number of the column for that a value shall
329       *         be returned. The first column is 1, the second is 2, ...
330       * @return the schema name of column or an empty string.
331       */
332     virtual ::rtl::OUString SAL_CALL
333     getSchemaName( sal_Int32 column )
334         throw( ::com::sun::star::sdbc::SQLException,
335                ::com::sun::star::uno::RuntimeException );
336     /**
337       * For number types, getprecision gets the number of decimal digits
338       * in column.
339       * For character types, it gets the maximum length in characters for
340       * column.
341       * For binary types, it gets the maximum length in bytes for column.
342       *
343       * @param  column is the number of the column for that a value shall
344       *         be returned. The first column is 1, the second is 2, ...
345       * @return the precision for the column.
346       */
347     virtual sal_Int32 SAL_CALL
348     getPrecision( sal_Int32 column )
349         throw( ::com::sun::star::sdbc::SQLException,
350                ::com::sun::star::uno::RuntimeException );
351     /**
352       * Gets the number of digits to the right of the decimal point for
353       * values in column.
354       *
355       * @param  column is the number of the column for that a value shall
356       *         be returned. The first column is 1, the second is 2, ...
357       * @return the scale of the column.
358       */
359     virtual sal_Int32 SAL_CALL
360     getScale( sal_Int32 column )
361         throw( ::com::sun::star::sdbc::SQLException,
362                ::com::sun::star::uno::RuntimeException );
363     /**
364       * Gets the name of the table from which column of this result set
365       * was derived or "" if there is none (for example, for a join).
366       * Because this feature is not widely supported, the return value
367       * for many DBMSs will be an empty string.
368       *
369       * @param  column is the number of the column for that a value shall
370       *         be returned. The first column is 1, the second is 2, ...
371       * @return the table name for column or an empty string.
372       */
373     virtual ::rtl::OUString SAL_CALL
374     getTableName( sal_Int32 column )
375         throw( ::com::sun::star::sdbc::SQLException,
376                ::com::sun::star::uno::RuntimeException );
377     virtual ::rtl::OUString SAL_CALL
378     /**
379       * Gets the catalog name for the table from which column of this
380       * result set was derived.
381       * Because this feature is not widely supported, the return value
382       * for many DBMSs will be an empty string.
383       *
384       * @param  column is the number of the column for that a value shall
385       *         be returned. The first column is 1, the second is 2, ...
386       * @return the catalog name for column or an empty string.
387       */
388     getCatalogName( sal_Int32 column )
389         throw( ::com::sun::star::sdbc::SQLException,
390                ::com::sun::star::uno::RuntimeException );
391     /**
392       * Gets the JDBC type for the value stored in column. ... The STRUCT
393       * and DISTINCT type codes are always returned for structured and
394       * distinct types, regardless of whether the value will be mapped
395       * according to the standard mapping or be a custom mapping.
396       *
397       * @param  column is the number of the column for that a value shall
398       *         be returned. The first column is 1, the second is 2, ...
399       * @return the type of the property that corresponds to column - mapped
400       *         from UNO-Type to SQL-Type.
401       */
402     virtual sal_Int32 SAL_CALL
403     getColumnType( sal_Int32 column )
404         throw( ::com::sun::star::sdbc::SQLException,
405                ::com::sun::star::uno::RuntimeException );
406     /**
407       * Gets the type name used by this particular data source for the
408       * values stored in column. If the type code for the type of value
409       * stored in column is STRUCT, DISTINCT or JAVA_OBJECT, this method
410       * returns a fully-qualified SQL type name.
411       *
412       * @param  column is the number of the column for that a value shall
413       *         be returned. The first column is 1, the second is 2, ...
414       * @return the column type name.
415       */
416     virtual ::rtl::OUString SAL_CALL
417     getColumnTypeName( sal_Int32 column )
418         throw( ::com::sun::star::sdbc::SQLException,
419                ::com::sun::star::uno::RuntimeException );
420     /**
421       * Indicates whether a column is definitely not writable.
422       *
423       * @param  column is the number of the column for that a value shall
424       *         be returned. The first column is 1, the second is 2, ...
425       * @return true, if the column is definetely not writable.
426       */
427     virtual sal_Bool SAL_CALL
428     isReadOnly( sal_Int32 column )
429         throw( ::com::sun::star::sdbc::SQLException,
430                ::com::sun::star::uno::RuntimeException );
431     /**
432       * Indicates whether it is possible for a write on the column to succeed.
433       *
434       * @param  column is the number of the column for that a value shall
435       *         be returned. The first column is 1, the second is 2, ...
436       * @return true, if it is possible for a write to succeed.
437       */
438     virtual sal_Bool SAL_CALL
439     isWritable( sal_Int32 column )
440         throw( ::com::sun::star::sdbc::SQLException,
441                ::com::sun::star::uno::RuntimeException );
442     /**
443       * Indicates whether a write on the column will definitely succeed.
444       *
445       * @param  column is the number of the column for that a value shall
446       *         be returned. The first column is 1, the second is 2, ...
447       * @return true, if a write on the column will definetely succeed.
448       */
449     virtual sal_Bool SAL_CALL
450     isDefinitelyWritable( sal_Int32 column )
451         throw( ::com::sun::star::sdbc::SQLException,
452                ::com::sun::star::uno::RuntimeException );
453     /**
454       * Returns the fully-qualified name of the service whose instances
455       * are manufactured if the method
456       * com::sun::star::sdbc::ResultSet::getObject is called to retrieve a
457       * value from the column.
458       *
459       * @param  column is the number of the column for that a value shall
460       *         be returned. The first column is 1, the second is 2, ...
461       * @return the service name for column or an empty string, if no service
462       *         is applicable.
463       */
464     virtual ::rtl::OUString SAL_CALL
465     getColumnServiceName( sal_Int32 column )
466         throw( ::com::sun::star::sdbc::SQLException,
467                ::com::sun::star::uno::RuntimeException );
468 };
469 
470 } // namespace ucbhelper
471 
472 #endif /* !_UCBHELPER_RESULTSETMETADATA_HXX */
473