LibreOffice Module connectivity (master) 1
NDatabaseMetaData.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include "NDatabaseMetaData.hxx"
21#include <com/sun/star/sdbc/DataType.hpp>
22#include <com/sun/star/sdbc/TransactionIsolation.hpp>
25#include <com/sun/star/sdbc/ColumnSearch.hpp>
26#include <rtl/ref.hxx>
27
28#include <cstddef>
29#include <string.h>
30#include <string_view>
31
32#include "EApi.h"
33
34using namespace connectivity::evoab;
35using namespace connectivity;
36using namespace com::sun::star::uno;
37using namespace com::sun::star::lang;
38using namespace com::sun::star::beans;
39using namespace com::sun::star::sdbc;
40using namespace com::sun::star::sdbcx;
41
42namespace
43{
44 bool equal(const char *str1, const char *str2)
45 {
46 return str1 == nullptr || str2 == nullptr ? str1 == str2 : strcmp(str1, str2) == 0;
47 }
48}
49
50namespace connectivity::evoab
51{
52 sal_Int32 const s_nCOLUMN_SIZE = 256;
53 sal_Int32 const s_nDECIMAL_DIGITS = 0;
54 sal_Int32 const s_nNULLABLE = 1;
55 sal_Int32 const s_nCHAR_OCTET_LENGTH = 65535;
56
57 static ColumnProperty **pFields=nullptr;
58 static guint nFields = 0;
59
60 static const char *pDenyList[] =
61 {
62 "id",
63 "list-show-addresses",
64 "address-label-home",
65 "address-label-work",
66 "address-label-other"
67 };
68
70 {
71 static const SplitEvoColumns evo_addr[] = {
72 {"addr-line1",DEFAULT_ADDR_LINE1},{"addr-line2",DEFAULT_ADDR_LINE2},{"city",DEFAULT_CITY},{"state",DEFAULT_STATE},{"country",DEFAULT_COUNTRY},{"zip",DEFAULT_ZIP},
73 {"work-addr-line1",WORK_ADDR_LINE1},{"work-addr-line2",WORK_ADDR_LINE2},{"work-city",WORK_CITY},{"work-state",WORK_STATE},{"work-country",WORK_COUNTRY},{"work-zip",WORK_ZIP},
74 {"home-addr-line1",HOME_ADDR_LINE1},{"home-addr-line2",HOME_ADDR_LINE2},{"home-addr-City",HOME_CITY},{"home-state",HOME_STATE},{"home-country",HOME_COUNTRY},{"home-zip",HOME_ZIP},
75 {"other-addr-line1",OTHER_ADDR_LINE1},{"other-addr-line2",OTHER_ADDR_LINE2},{"other-addr-city",OTHER_CITY},{"other-addr-state",OTHER_STATE},{"other-addr-country",OTHER_COUNTRY},{"other-addr-zip",OTHER_ZIP}
76 };
77 return evo_addr;
78 }
79
80 static void
82 {
83 const SplitEvoColumns* evo_addr( get_evo_addr() );
84 for (int i = 0; i < OTHER_ZIP; i++)
85 {
86 pToBeFields[nFields] = g_new0(ColumnProperty,1);
87 pToBeFields[nFields]->bIsSplittedValue = true;
88 pToBeFields[nFields]->pField = g_param_spec_ref(g_param_spec_string (evo_addr[i].pColumnName,evo_addr[i].pColumnName,"",nullptr,G_PARAM_WRITABLE));
89 nFields++;
90 }
91 }
92
93 static void
95 {
96 if( pFields )
97 return;
98
99 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
100 if( pFields )
101 return;
102
103 guint nProps;
104 ColumnProperty **pToBeFields;
105 GParamSpec **pProps;
106 nFields = 0;
107 pProps = g_object_class_list_properties
108 ( static_cast<GObjectClass *>(g_type_class_ref( E_TYPE_CONTACT )),
109 &nProps );
110 pToBeFields = g_new0(ColumnProperty *, (nProps + OTHER_ZIP)/* new column(s)*/ );
111 for ( guint i = 0; i < nProps; i++ )
112 {
113 switch (pProps[i]->value_type)
114 {
115 case G_TYPE_STRING:
116 case G_TYPE_BOOLEAN:
117 {
118 bool bAdd = true;
119 const char *pName = g_param_spec_get_name( pProps[i] );
120 for (unsigned int j = 0; j < G_N_ELEMENTS( pDenyList ); j++ )
121 {
122 if( !strcmp( pDenyList[j], pName ) )
123 {
124 bAdd = false;
125 break;
126 }
127 }
128 if( bAdd )
129 {
130 pToBeFields[nFields]= g_new0(ColumnProperty,1);
131 pToBeFields[nFields]->bIsSplittedValue=false;
132 pToBeFields[ nFields++ ]->pField = g_param_spec_ref( pProps[i] );
133 }
134 break;
135 }
136 default:
137 break;
138 }
139 }
140
141 splitColumn(pToBeFields);
142 pFields = pToBeFields;
143 }
144
145
146 const ColumnProperty *
147 getField(guint n)
148 {
149 initFields();
150 if( n < nFields )
151 return pFields[n];
152 else
153 return nullptr;
154 }
155
156 GType
157 getGFieldType( guint nCol )
158 {
159 initFields();
160
161 if ( nCol < nFields )
162 return pFields[nCol]->pField->value_type;
163 return G_TYPE_STRING;
164 }
165
166 sal_Int32
167 getFieldType( guint nCol )
168 {
169 sal_Int32 nType = getGFieldType( nCol );
170 return nType == G_TYPE_STRING ? DataType::VARCHAR : DataType::BIT;
171 }
172
173 guint findEvoabField(std::u16string_view aColName)
174 {
175 guint nRet = guint(-1);
176 bool bFound = false;
177 initFields();
178 for (guint i=0;(i < nFields) && !bFound;i++)
179 {
180 OUString aName = getFieldName(i);
181 if (aName == aColName)
182 {
183 nRet = i;
184 bFound = true;
185 }
186 }
187 return nRet;
188 }
189
190 OUString
191 getFieldTypeName( guint nCol )
192 {
193 switch( getFieldType( nCol ) )
194 {
195 case DataType::BIT:
196 return "BIT";
197 case DataType::VARCHAR:
198 return "VARCHAR";
199 default:
200 break;
201 }
202 return OUString();
203 }
204
205 OUString
206 getFieldName( guint nCol )
207 {
208 const GParamSpec *pSpec = getField( nCol )->pField;
209 OUString aName;
210 initFields();
211
212 if( pSpec )
213 {
214 aName = OStringToOUString( g_param_spec_get_name( const_cast<GParamSpec *>(pSpec) ),
215 RTL_TEXTENCODING_UTF8 );
216 aName = aName.replace( '-', '_' );
217 }
218 return aName;
219 }
220
221 void
223 {
224 for (int i=nFields-1;i > 0;i--)
225 {
226 if (pFields && pFields[i] )
227 {
228 if (pFields[i]->pField)
229 g_param_spec_unref(pFields[i]->pField);
230 g_free(pFields[i]);
231 }
232 }
233 if(pFields)
234 {
235 g_free(pFields);
236 pFields=nullptr;
237 }
238
239 }
240
241
242}
243
244
245OEvoabDatabaseMetaData::OEvoabDatabaseMetaData(OEvoabConnection* _pCon)
246 : ::connectivity::ODatabaseMetaDataBase(_pCon, _pCon->getConnectionInfo())
247 ,m_pConnection(_pCon)
248{
249 OSL_ENSURE(m_pConnection,"OEvoabDatabaseMetaData::OEvoabDatabaseMetaData: No connection set!");
250}
252{
253}
254
255
257 const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/,
258 const OUString& columnNamePattern )
259{
260 // this returns an empty resultset where the column-names are already set
261 // in special the metadata of the resultset already returns the right columns
263
266
267 // ****************************************************
268 // Some entries in a row never change, so set them now
269 // ****************************************************
270
271 // Catalog
272 aRow[1] = new ORowSetValueDecorator(OUString());
273 // Schema
274 aRow[2] = new ORowSetValueDecorator(OUString());
275 // COLUMN_SIZE
277 // BUFFER_LENGTH, not used
279 // DECIMAL_DIGITS.
281 // NUM_PREC_RADIX
282 aRow[10] = new ORowSetValueDecorator(sal_Int32(10));
283 // NULLABLE
284 aRow[11] = new ORowSetValueDecorator(s_nNULLABLE);
285 // REMARKS
287 // COLUMN_DEF, not used
289 // SQL_DATA_TYPE, not used
291 // SQL_DATETIME_SUB, not used
293 // CHAR_OCTET_LENGTH, refer to [5]
295 // IS_NULLABLE
296 aRow[18] = new ORowSetValueDecorator(OUString("YES"));
297
298
299 aRow[3] = new ORowSetValueDecorator(OUString("TABLE"));
300 ::osl::MutexGuard aGuard( m_aMutex );
301
302 initFields();
303 for (guint i = 0; i < nFields; i++)
304 {
305 if( match( columnNamePattern, getFieldName( i ), '\0' ) )
306 {
307 aRow[5] = new ORowSetValueDecorator( static_cast<sal_Int16>( getFieldType( i ) ) );
308 aRow[6] = new ORowSetValueDecorator( getFieldTypeName( i ) );
309
310 // COLUMN_NAME
311 aRow[4] = new ORowSetValueDecorator( getFieldName( i ) );
312 // ORDINAL_POSITION
313 aRow[17] = new ORowSetValueDecorator( sal_Int32(i) );
314 aRows.push_back( aRow );
315 }
316 }
317
318 pResultSet->setRows(std::move(aRows));
319
320 return pResultSet;
321}
322
324{
325 return OUString();
326}
327
329{
330 return 0;// 0 means no limit
331}
332
334{
335 return 0;// 0 means no limit
336}
337
339{
340 return 0;// 0 means no limit
341}
342
344{
345 return 0;// 0 means no limit
346}
347
349{
350 return 0;// 0 means no limit
351}
352
354{
355 return 0;// 0 means no limit
356}
357
359{
360 return 0;// 0 means no limit
361}
362
364{
365 return 0;// 0 means no limit
366}
367
369{
370 return 0;// 0 means no limit
371}
372
374{
375 return 0;// 0 means no limit
376}
377
379{
380 return 0;// 0 means no limit
381}
382
384{
385 // We only support a single table
386 return 1;
387}
388
389
391{
392 return false;
393}
394
396{
397 return false;
398}
399
401{
402 return false;
403}
404
406{
407 return false;
408}
409
411{
412 return false;
413}
414
416{
417 return false;
418}
419
421{
422 return false;
423}
424
426{
427 return false;
428}
429
431{
432 return false;
433}
434
436{
437 return 0;// 0 means no limit
438}
439
441{
442 return false;
443}
444
446{
447 return OUString();
448}
449
451{
452 // normally this is "
453 return "\"";
454}
455
457{
458 return OUString();
459}
460
462{
463 return false;
464}
465
467{
468 return false;
469}
470
472{
473 return true;
474}
475
477{
478 return true;
479}
480
482{
483 return true;
484}
485
487{
488 return true;
489}
490
492{
493 return false;
494}
495
497{
498 return false;
499}
500
502{
503 return false;
504}
505
507{
508 return false;
509}
510
512{
513 return false;
514}
515
517{
518 return false;
519}
520
522{
523 return false;
524}
525
527{
528 return false;
529}
530
532{
533 return false;
534}
535
537{
538 return true; // should be supported at least
539}
540
542{
543 return false;
544}
545
547{
548 return false;
549}
550
552{
553 return false;
554}
555
557{
558 return false;
559}
560
562{
563 return false;
564}
565
567{
568 return false;
569}
570
572{
573 return false;
574}
575
577{
578 return 0;// 0 means no limit
579}
580
582{
583 return 0;// 0 means no limit
584}
585
587{
588 return 0;// 0 means no limit
589}
590
592{
593 return false;
594}
595
597{
598 return false;
599}
600
602{
603 return false;
604}
605
607{
608 return false;
609}
610
612{
613 // We allow you to select from any table.
614 return true;
615}
616
618{
619 // For now definitely read-only, no support for update/delete
620 return true;
621}
622
624{
625 return false;
626}
627
629{
630 return false;
631}
632
634{
635 return false;
636}
637
639{
640 return false;
641}
642
644{
645 // todo add Support for this.
646 return false;
647}
648
650{
651 return false;
652}
653
654sal_Bool SAL_CALL OEvoabDatabaseMetaData::supportsConvert( sal_Int32 /*fromType*/, sal_Int32 /*toType*/ )
655{
656 return false;
657}
658
660{
661 return false;
662}
663
665{
666 return false;
667}
668
670{
671 return false;
672}
673
675{
676 return false;
677}
678
680{
681 return false;
682}
683
685{
686 return false;
687}
688
690{
691 return false;
692}
693
695{
696 return false;
697}
698
700{
701 return false;
702}
703
705{
706 return false;
707}
708
710{
711 return false;
712}
713
715{
716 // Any case may be used
717 return true;
718}
719
721{
722 return false;
723}
724
726{
727 return true;
728}
729
731{
732 return false;
733}
734
736{
737 return true;
738}
739
741{
742 return false;
743}
744
746{
747 return false;
748}
749
751{
752 return false;
753}
754
756{
757 return false;
758}
759
761{
762 return false;
763}
764
766{
767 return false;
768}
769
771{
772 return false;
773}
774
776{
777 return false;
778}
779
781{
782 return false;
783}
784
786{
787 return false;
788}
789
791{
792 ::osl::MutexGuard aGuard( m_aMutex );
793
794 return m_pConnection->getURL();
795}
796
798{
799 return OUString();
800}
801
803{
804 return OUString();
805}
806
808{
809 return "1";
810}
811
813{
814 return "0";
815}
816
818{
819 return OUString();
820}
821
823{
824 return OUString();
825}
826
828{
829 return OUString();
830}
831
833{
834 return 1;
835}
836
838{
839 return TransactionIsolation::NONE;
840}
841
843{
844 return 0;
845}
846
848{
849 return OUString();
850}
851
853{
854 return OUString();
855}
856
858{
859 return OUString();
860}
861
863{
864 return OUString();
865}
866
868{
869 return OUString();
870}
871
873{
874 return OUString();
875}
876
878{
879 return false;
880}
881
883{
884 return false;
885}
886
888{
889 return true;
890}
891
893{
894 return false;
895}
896
898{
899 return false;
900}
901
903{
904 return 0;// 0 means no limit
905}
906
908{
909 return 0;// 0 means no limit
910}
911
913{
914 return 0;// 0 means no limit
915}
916
918{
919 return 0;// 0 means no limit
920}
921
923{
924 return false;
925}
926
927sal_Bool SAL_CALL OEvoabDatabaseMetaData::supportsResultSetConcurrency( sal_Int32 /*setType*/, sal_Int32 /*concurrency*/ )
928{
929 return false;
930}
931
933{
934 return false;
935}
936
938{
939 return false;
940}
941
943{
944 return false;
945}
946
948{
949 return false;
950}
951
953{
954 return false;
955}
956
958{
959 return false;
960}
961
963{
964 return false;
965}
966
968{
969 return false;
970}
971
973{
974 return false;
975}
976
978{
979 return false;
980}
981
982// here follow all methods which return a resultset
983// the first methods is an example implementation how to use this resultset
984// of course you could implement it on your and you should do this because
985// the general way is more memory expensive
986
988{
989 /* Don't need to change as evoab driver supports only table */
990
991 // there exists no possibility to get table types so we have to check
992 static const std::u16string_view sTableTypes[] =
993 {
994 u"TABLE" // Currently we only support a 'TABLE' nothing more complex
995 };
997
998 // here we fill the rows which should be visible when ask for data from the resultset returned here
999 auto nNbTypes = std::size(sTableTypes);
1001 for(std::size_t i=0;i < nNbTypes;++i)
1002 {
1003 // bound row
1004 aRows.push_back( { ODatabaseMetaDataResultSet::getEmptyValue(), new ORowSetValueDecorator(OUString(sTableTypes[i])) });
1005 }
1006 // here we set the rows at the resultset
1007 pResult->setRows(std::move(aRows));
1008 return pResult;
1009}
1010
1012{
1013 /*
1014 * Return the proper type information required by evo driver
1015 */
1016
1018
1019 static ODatabaseMetaDataResultSet::ORows aRows = []()
1020 {
1023 {
1025 new ORowSetValueDecorator(OUString("VARCHAR")) ,
1026 new ORowSetValueDecorator(DataType::VARCHAR) ,
1033 new ORowSetValueDecorator(sal_Int32(ColumnSearch::FULL)) ,
1042 new ORowSetValueDecorator(sal_Int32(10))
1043 };
1044
1045 tmp.push_back(aRow);
1046
1047 aRow[1] = new ORowSetValueDecorator(OUString("VARCHAR"));
1048 aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR);
1049 aRow[3] = new ORowSetValueDecorator(sal_Int32(65535));
1050 tmp.push_back(aRow);
1051 return tmp;
1052 }();
1053 pResultSet->setRows(std::move(aRows));
1054 return pResultSet;
1055}
1056
1057bool isSourceBackend(ESource *pSource, const char *backendname)
1058{
1059 if (!pSource || !e_source_has_extension (pSource, E_SOURCE_EXTENSION_ADDRESS_BOOK))
1060 return false;
1061
1062 gpointer extension = e_source_get_extension (pSource, E_SOURCE_EXTENSION_ADDRESS_BOOK);
1063 return extension && equal(e_source_backend_get_backend_name (extension), backendname);
1064}
1065
1067 const Any& /*catalog*/, const OUString& /*schemaPattern*/,
1068 const OUString& /*tableNamePattern*/, const Sequence< OUString >& types )
1069{
1070 ::osl::MutexGuard aGuard( m_aMutex );
1071
1073
1074 // check if any type is given
1075 // when no types are given then we have to return all tables e.g. TABLE
1076
1077 static constexpr OUStringLiteral aTable(u"TABLE");
1078
1079 bool bTableFound = true;
1080 sal_Int32 nLength = types.getLength();
1081 if(nLength)
1082 {
1083 bTableFound = false;
1084
1085 const OUString* pBegin = types.getConstArray();
1086 const OUString* pEnd = pBegin + nLength;
1087 for(;pBegin != pEnd;++pBegin)
1088 {
1089 if(*pBegin == aTable)
1090 {
1091 bTableFound = true;
1092 break;
1093 }
1094 }
1095 }
1096 if(!bTableFound)
1097 return pResult;
1098
1100
1102
1103 for (GList* liter = pSources; liter; liter = liter->next)
1104 {
1105 ESource *pSource = E_SOURCE (liter->data);
1106 bool can = false;
1108 {
1110 can = isSourceBackend( pSource, "groupwise"); // not supported in evo/eds 3.6.x+, somehow
1111 break;
1113 can = isSourceBackend( pSource, "local");
1114 break;
1116 can = isSourceBackend( pSource, "ldap");
1117 break;
1119 can = true;
1120 break;
1121 }
1122 if (!can)
1123 continue;
1124
1125 OUString aHumanName = OStringToOUString( e_source_get_display_name( pSource ),
1126 RTL_TEXTENCODING_UTF8 );
1127 OUString aUID = OStringToOUString( e_source_get_uid( pSource ),
1128 RTL_TEXTENCODING_UTF8 );
1133 new ORowSetValueDecorator(aHumanName), //tablename
1135 new ORowSetValueDecorator(aUID)}; //comment
1136 //I'd prefer to swap the comment and the human name and
1137 //just use e_source_registry_ref_source(get_e_source_registry(), aUID);
1138 //in open book rather than search for the name again
1139 aRows.push_back(aRow);
1140 }
1141
1142 g_list_foreach (pSources, reinterpret_cast<GFunc>(g_object_unref), nullptr);
1143 g_list_free (pSources);
1144
1145 pResult->setRows(std::move(aRows));
1146
1147 return pResult;
1148}
1149
1150Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getUDTs( const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*typeNamePattern*/, const Sequence< sal_Int32 >& /*types*/ )
1151{
1152 ::dbtools::throwFeatureNotImplementedSQLException( "XDatabaseMetaDaza::getUDTs", *this );
1153 return nullptr;
1154}
1155
1156
1157/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
ESourceRegistry * get_e_source_registry()
Definition: EApi.cxx:129
EAPI_EXTERN gpointer(* e_source_get_extension)(ESource *source, const gchar *extension_name)
Definition: EApi.h:142
#define E_TYPE_CONTACT
Definition: EApi.h:46
EAPI_EXTERN const gchar *(* e_source_backend_get_backend_name)(ESourceBackend *extension)
Definition: EApi.h:143
EAPI_EXTERN const gchar *(* e_source_get_display_name)(ESource *source)
Definition: EApi.h:144
void ESource
Definition: EApi.h:53
EAPI_EXTERN gboolean(* e_source_has_extension)(ESource *source, const gchar *extension_name)
Definition: EApi.h:141
#define E_SOURCE(a)
Definition: EApi.h:54
EAPI_EXTERN const gchar *(* e_source_get_uid)(ESource *source)
Definition: EApi.h:146
EAPI_EXTERN GList *(* e_source_registry_list_sources)(ESourceRegistry *registry, const gchar *extension_name)
Definition: EApi.h:140
#define E_SOURCE_EXTENSION_ADDRESS_BOOK
Definition: EApi.h:133
bool isSourceBackend(ESource *pSource, const char *backendname)
const char * pName
static ORowSetValueDecoratorRef const & getEmptyValue()
return an empty ORowSetValueDecorator
std::vector< ORowSetValueDecoratorRef > ORow
@ eTableTypes
describes a result set as expected by XDatabaseMetaData::getTableTypes
@ eTypeInfo
describes a result set as expected by XDatabaseMetaData::getTypeInfo
@ eTables
describes a result set as expected by XDatabaseMetaData::getTables
@ eColumns
describes a result set as expected by XDatabaseMetaData::getColumns
static ORowSetValueDecoratorRef const & get1Value()
return an ORowSetValueDecorator with 1 as value
static ORowSetValueDecoratorRef const & get0Value()
return an ORowSetValueDecorator with 0 as value
static ORowSetValueDecoratorRef const & getQuoteValue()
return an ORowSetValueDecorator with string ' as value
const OUString & getURL() const
Definition: TConnection.hxx:62
ORowSetValueDecorator decorates an ORowSetValue so the value is "refcounted".
Definition: FValue.hxx:402
SDBCAddress::sdbc_address_type getSDBCAddressType() const
Definition: NConnection.hxx:67
virtual sal_Int32 SAL_CALL getMaxColumnsInSelect() override
virtual sal_Bool SAL_CALL supportsGroupBy() override
virtual sal_Bool SAL_CALL ownInsertsAreVisible(sal_Int32 setType) override
virtual OUString SAL_CALL getDatabaseProductName() override
virtual sal_Bool SAL_CALL supportsConvert(sal_Int32 fromType, sal_Int32 toType) override
virtual OUString impl_getCatalogSeparator_throw() override
virtual sal_Bool SAL_CALL supportsPositionedDelete() override
virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers() override
virtual bool impl_supportsCatalogsInTableDefinitions_throw() override
virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables(const css::uno::Any &catalog, const OUString &schemaPattern, const OUString &tableNamePattern, const css::uno::Sequence< OUString > &types) override
virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls() override
virtual sal_Bool SAL_CALL nullsAreSortedHigh() override
virtual sal_Bool SAL_CALL supportsBatchUpdates() override
virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers() override
virtual sal_Bool SAL_CALL usesLocalFilePerTable() override
virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy() override
virtual sal_Bool SAL_CALL supportsTypeConversion() override
virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly() override
virtual OUString SAL_CALL getDatabaseProductVersion() override
virtual sal_Bool SAL_CALL supportsStoredProcedures() override
virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers() override
virtual bool impl_supportsSchemasInDataManipulation_throw() override
virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy() override
virtual sal_Int32 SAL_CALL getMaxColumnsInIndex() override
virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL() override
virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions() override
virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds() override
virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls() override
virtual sal_Bool SAL_CALL nullsAreSortedLow() override
virtual sal_Bool SAL_CALL supportsCoreSQLGrammar() override
virtual sal_Int32 SAL_CALL getMaxUserNameLength() override
virtual sal_Bool SAL_CALL supportsResultSetConcurrency(sal_Int32 setType, sal_Int32 concurrency) override
virtual sal_Int32 SAL_CALL getDriverMajorVersion() override
virtual sal_Bool SAL_CALL supportsLikeEscapeClause() override
virtual sal_Int32 SAL_CALL getMaxStatementLength() override
virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit() override
virtual OUString SAL_CALL getSystemFunctions() override
virtual bool impl_supportsAlterTableWithAddColumn_throw() override
virtual OUString SAL_CALL getStringFunctions() override
virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers() override
virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength() override
virtual sal_Bool SAL_CALL supportsLimitedOuterJoins() override
virtual sal_Int32 SAL_CALL getMaxCursorNameLength() override
virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar() override
virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility() override
virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback() override
virtual sal_Bool SAL_CALL insertsAreDetected(sal_Int32 setType) override
virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit() override
virtual sal_Bool SAL_CALL supportsGroupByUnrelated() override
virtual sal_Int32 SAL_CALL getMaxCharLiteralLength() override
virtual OUString impl_getIdentifierQuoteString_throw() override
virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions() override
virtual sal_Int32 SAL_CALL getMaxColumnNameLength() override
virtual sal_Bool SAL_CALL supportsOuterJoins() override
virtual bool impl_supportsAlterTableWithDropColumn_throw() override
virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries() override
virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs(const css::uno::Any &catalog, const OUString &schemaPattern, const OUString &typeNamePattern, const css::uno::Sequence< sal_Int32 > &types) override
virtual sal_Int32 SAL_CALL getMaxSchemaNameLength() override
virtual css::uno::Reference< css::sdbc::XResultSet > impl_getTypeInfo_throw() override
virtual OUString SAL_CALL getTimeDateFunctions() override
virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons() override
virtual sal_Bool SAL_CALL deletesAreDetected(sal_Int32 setType) override
virtual sal_Bool SAL_CALL allTablesAreSelectable() override
virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL() override
virtual sal_Int32 SAL_CALL getMaxConnections() override
virtual sal_Bool SAL_CALL supportsSubqueriesInIns() override
virtual OUString SAL_CALL getNumericFunctions() override
virtual sal_Bool SAL_CALL usesLocalFiles() override
virtual sal_Bool SAL_CALL supportsSubqueriesInExists() override
virtual sal_Int32 SAL_CALL getMaxCatalogNameLength() override
virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel(sal_Int32 level) override
virtual OUString SAL_CALL getDriverName() override
virtual sal_Bool SAL_CALL supportsPositionedUpdate() override
virtual sal_Bool SAL_CALL supportsFullOuterJoins() override
virtual sal_Bool SAL_CALL supportsTransactions() override
virtual sal_Bool SAL_CALL supportsTableCorrelationNames() override
virtual OUString SAL_CALL getProcedureTerm() override
virtual sal_Bool SAL_CALL supportsMultipleResultSets() override
virtual sal_Int32 SAL_CALL getMaxProcedureNameLength() override
virtual bool impl_supportsMixedCaseQuotedIdentifiers_throw() override
virtual bool impl_supportsSchemasInTableDefinitions_throw() override
virtual sal_Int32 SAL_CALL getMaxTableNameLength() override
virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes() override
virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback() override
virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions() override
virtual sal_Bool SAL_CALL updatesAreDetected(sal_Int32 setType) override
virtual sal_Int32 SAL_CALL getMaxIndexLength() override
virtual sal_Bool SAL_CALL supportsANSI92FullSQL() override
virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames() override
virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions() override
virtual sal_Bool SAL_CALL supportsSelectForUpdate() override
virtual OUString SAL_CALL getSearchStringEscape() override
virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation() override
virtual sal_Int32 SAL_CALL getMaxColumnsInTable() override
virtual sal_Bool SAL_CALL supportsNonNullableColumns() override
virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers() override
virtual bool impl_supportsCatalogsInDataManipulation_throw() override
virtual sal_Int32 SAL_CALL getDriverMinorVersion() override
virtual sal_Int32 impl_getMaxStatements_throw() override
virtual sal_Bool SAL_CALL othersUpdatesAreVisible(sal_Int32 setType) override
virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit() override
virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy() override
virtual bool impl_storesMixedCaseQuotedIdentifiers_throw() override
virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect() override
virtual sal_Bool SAL_CALL isReadOnly() override
virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs() override
virtual sal_Bool SAL_CALL nullsAreSortedAtStart() override
virtual sal_Bool SAL_CALL supportsOrderByUnrelated() override
virtual OUString SAL_CALL getSQLKeywords() override
virtual sal_Bool SAL_CALL othersInsertsAreVisible(sal_Int32 setType) override
virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions() override
virtual OUString SAL_CALL getCatalogTerm() override
virtual sal_Bool SAL_CALL supportsUnion() override
virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns(const css::uno::Any &catalog, const OUString &schemaPattern, const OUString &tableNamePattern, const OUString &columnNamePattern) override
virtual sal_Bool SAL_CALL nullPlusNonNullIsNull() override
virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions() override
virtual sal_Int32 impl_getMaxTablesInSelect_throw() override
virtual OUString SAL_CALL getURL() override
virtual sal_Bool SAL_CALL supportsUnionAll() override
virtual OUString SAL_CALL getDriverVersion() override
virtual sal_Bool SAL_CALL supportsMultipleTransactions() override
virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar() override
virtual sal_Bool SAL_CALL supportsResultSetType(sal_Int32 setType) override
virtual sal_Bool SAL_CALL nullsAreSortedAtEnd() override
virtual sal_Bool SAL_CALL othersDeletesAreVisible(sal_Int32 setType) override
virtual sal_Int32 SAL_CALL getMaxRowSize() override
virtual sal_Bool SAL_CALL allProceduresAreCallable() override
virtual OUString SAL_CALL getSchemaTerm() override
virtual sal_Bool SAL_CALL ownUpdatesAreVisible(sal_Int32 setType) override
virtual OUString SAL_CALL getExtraNameCharacters() override
virtual sal_Bool SAL_CALL supportsColumnAliasing() override
virtual OUString SAL_CALL getUserName() override
virtual sal_Bool SAL_CALL ownDeletesAreVisible(sal_Int32 setType) override
virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers() override
mutable::osl::Mutex m_aMutex
float u
OUString aName
sal_Int64 n
bool equal(T const &rfValA, T const &rfValB)
const ColumnProperty * getField(guint n)
sal_Int32 getFieldType(guint nCol)
static ColumnProperty ** pFields
sal_Int32 const s_nNULLABLE
const SplitEvoColumns * get_evo_addr()
GType getGFieldType(guint nCol)
static void splitColumn(ColumnProperty **pToBeFields)
OUString getFieldName(guint nCol)
sal_Int32 const s_nDECIMAL_DIGITS
sal_Int32 const s_nCOLUMN_SIZE
guint findEvoabField(std::u16string_view aColName)
static const char * pDenyList[]
OUString getFieldTypeName(guint nCol)
sal_Int32 const s_nCHAR_OCTET_LENGTH
bool match(const sal_Unicode *pWild, const sal_Unicode *pStr, const sal_Unicode cEscape)
Definition: CommonTools.cxx:51
::rtl::Reference< ORowSetValueDecorator > ORowSetValueDecoratorRef
Definition: FValue.hxx:421
void throwFeatureNotImplementedSQLException(const OUString &_rFeatureName, const Reference< XInterface > &_rxContext, const Any &_rNextException)
int i
QPRO_FUNC_TYPE nType
unsigned char sal_Bool
sal_Int32 nLength