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 
21 #include "MacabDatabaseMetaData.hxx"
22 #include "MacabAddressBook.hxx"
23 #include "MacabHeader.hxx"
24 #include "MacabGroup.hxx"
25 #include "macabutilities.hxx"
26 
27 #include "MacabDriver.hxx"
28 #include <FDatabaseMetaDataResultSet.hxx>
29 #include <OTypeInfo.hxx>
30 #include <com/sun/star/sdbc/ColumnValue.hpp>
31 #include <com/sun/star/sdbc/ResultSetType.hpp>
32 #include <com/sun/star/sdbc/TransactionIsolation.hpp>
33 
34 #include <vector>
35 
36 using namespace connectivity::macab;
37 using namespace com::sun::star::uno;
38 using namespace com::sun::star::lang;
39 using namespace com::sun::star::beans;
40 using namespace com::sun::star::sdbc;
41 
42 MacabDatabaseMetaData::MacabDatabaseMetaData(MacabConnection* _pCon)
43         : m_xConnection(_pCon),
44           m_bUseCatalog(true)
45 {
46     OSL_ENSURE(_pCon,"MacabDatabaseMetaData::MacabDatabaseMetaData: No connection set!");
47 
48     osl_atomic_increment( &m_refCount );
49     m_bUseCatalog   = !(usesLocalFiles() || usesLocalFilePerTable());
50     osl_atomic_decrement( &m_refCount );
51 }
52 
53 MacabDatabaseMetaData::~MacabDatabaseMetaData()
54 {
55 }
56 
57 OUString SAL_CALL MacabDatabaseMetaData::getCatalogSeparator(  )
58 {
59     if (m_bUseCatalog)
60     { // do some special here for you database
61     }
62 
63     return OUString();
64 }
65 
66 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxBinaryLiteralLength(  )
67 {
68     return 0; // 0 means no limit
69 }
70 
71 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxRowSize(  )
72 {
73     return 0; // 0 means no limit
74 }
75 
76 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxCatalogNameLength(  )
77 {
78     return 0; // 0 means no limit
79 }
80 
81 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxCharLiteralLength(  )
82 {
83     return 0; // 0 means no limit
84 }
85 
86 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnNameLength(  )
87 {
88     return 0; // 0 means no limit
89 }
90 
91 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnsInIndex(  )
92 {
93     return 0; // 0 means no limit
94 }
95 
96 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxCursorNameLength(  )
97 {
98     return 0; // 0 means no limit
99 }
100 
101 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxConnections(  )
102 {
103     return 0; // 0 means no limit
104 }
105 
106 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnsInTable(  )
107 {
108     return 0; // 0 means no limit
109 }
110 
111 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxStatementLength(  )
112 {
113     return 0; // 0 means no limit
114 }
115 
116 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxTableNameLength(  )
117 {
118     return 0; // 0 means no limit
119 }
120 
121 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxTablesInSelect(  )
122 {
123     // MaxTablesInSelect describes how many tables can participate in the FROM part of a given SELECT statement,
124     // currently, the resultset/statement implementations can cope with one table only
125     return 1;
126 }
127 
128 sal_Bool SAL_CALL MacabDatabaseMetaData::doesMaxRowSizeIncludeBlobs(  )
129 {
130     return false;
131 }
132 
133 sal_Bool SAL_CALL MacabDatabaseMetaData::storesLowerCaseQuotedIdentifiers(  )
134 {
135     return false;
136 }
137 
138 sal_Bool SAL_CALL MacabDatabaseMetaData::storesLowerCaseIdentifiers(  )
139 {
140     return false;
141 }
142 
143 sal_Bool SAL_CALL MacabDatabaseMetaData::storesMixedCaseQuotedIdentifiers(  )
144 {
145     return false;
146 }
147 
148 sal_Bool SAL_CALL MacabDatabaseMetaData::storesMixedCaseIdentifiers(  )
149 {
150     return false;
151 }
152 
153 sal_Bool SAL_CALL MacabDatabaseMetaData::storesUpperCaseQuotedIdentifiers(  )
154 {
155     return false;
156 }
157 
158 sal_Bool SAL_CALL MacabDatabaseMetaData::storesUpperCaseIdentifiers(  )
159 {
160     return false;
161 }
162 
163 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsAlterTableWithAddColumn(  )
164 {
165     return false;
166 }
167 
168 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsAlterTableWithDropColumn(  )
169 {
170     return false;
171 }
172 
173 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxIndexLength(  )
174 {
175     return 0; // 0 means no limit
176 }
177 
178 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsNonNullableColumns(  )
179 {
180     return false;
181 }
182 
183 OUString SAL_CALL MacabDatabaseMetaData::getCatalogTerm(  )
184 {
185     return OUString();
186 }
187 
188 OUString SAL_CALL MacabDatabaseMetaData::getIdentifierQuoteString(  )
189 {
190     // normally this is "
191     return "\"";
192 }
193 
194 OUString SAL_CALL MacabDatabaseMetaData::getExtraNameCharacters(  )
195 {
196     return OUString();
197 }
198 
199 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsDifferentTableCorrelationNames(  )
200 {
201     return false;
202 }
203 
204 sal_Bool SAL_CALL MacabDatabaseMetaData::isCatalogAtStart(  )
205 {
206     return false;
207 }
208 
209 sal_Bool SAL_CALL MacabDatabaseMetaData::dataDefinitionIgnoredInTransactions(  )
210 {
211     return true;
212 }
213 
214 sal_Bool SAL_CALL MacabDatabaseMetaData::dataDefinitionCausesTransactionCommit(  )
215 {
216     return true;
217 }
218 
219 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsDataManipulationTransactionsOnly(  )
220 {
221     return true;
222 }
223 
224 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions(  )
225 {
226     return true;
227 }
228 
229 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsPositionedDelete(  )
230 {
231     return false;
232 }
233 
234 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsPositionedUpdate(  )
235 {
236     return false;
237 }
238 
239 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOpenStatementsAcrossRollback(  )
240 {
241     return false;
242 }
243 
244 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOpenStatementsAcrossCommit(  )
245 {
246     return false;
247 }
248 
249 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOpenCursorsAcrossCommit(  )
250 {
251     return false;
252 }
253 
254 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOpenCursorsAcrossRollback(  )
255 {
256     return false;
257 }
258 
259 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 )
260 {
261     return false;
262 }
263 
264 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSchemasInDataManipulation(  )
265 {
266     return false;
267 }
268 
269 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsANSI92FullSQL(  )
270 {
271     return false;
272 }
273 
274 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsANSI92EntryLevelSQL(  )
275 {
276     return true; // should be supported at least
277 }
278 
279 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsIntegrityEnhancementFacility(  )
280 {
281     return false;
282 }
283 
284 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSchemasInIndexDefinitions(  )
285 {
286     return false;
287 }
288 
289 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSchemasInTableDefinitions(  )
290 {
291     return false;
292 }
293 
294 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCatalogsInTableDefinitions(  )
295 {
296     return false;
297 }
298 
299 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCatalogsInIndexDefinitions(  )
300 {
301     return false;
302 }
303 
304 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCatalogsInDataManipulation(  )
305 {
306     return false;
307 }
308 
309 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOuterJoins(  )
310 {
311     return false;
312 }
313 
314 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxStatements(  )
315 {
316     return 0; // 0 means no limit
317 }
318 
319 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxProcedureNameLength(  )
320 {
321     return 0; // 0 means no limit
322 }
323 
324 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxSchemaNameLength(  )
325 {
326     return 0; // 0 means no limit
327 }
328 
329 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsTransactions(  )
330 {
331     return false;
332 }
333 
334 sal_Bool SAL_CALL MacabDatabaseMetaData::allProceduresAreCallable(  )
335 {
336     return false;
337 }
338 
339 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsStoredProcedures(  )
340 {
341     return false;
342 }
343 
344 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSelectForUpdate(  )
345 {
346     return false;
347 }
348 
349 sal_Bool SAL_CALL MacabDatabaseMetaData::allTablesAreSelectable(  )
350 {
351     return false;
352 }
353 
354 sal_Bool SAL_CALL MacabDatabaseMetaData::isReadOnly(  )
355 {
356     // for the moment, we have read-only addresses, but this might change in the future
357     return true;
358 }
359 
360 sal_Bool SAL_CALL MacabDatabaseMetaData::usesLocalFiles(  )
361 {
362     return false;
363 }
364 
365 sal_Bool SAL_CALL MacabDatabaseMetaData::usesLocalFilePerTable(  )
366 {
367     return false;
368 }
369 
370 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsTypeConversion(  )
371 {
372     return false;
373 }
374 
375 sal_Bool SAL_CALL MacabDatabaseMetaData::nullPlusNonNullIsNull(  )
376 {
377     return false;
378 }
379 
380 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsColumnAliasing(  )
381 {
382     return false;
383 }
384 
385 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsTableCorrelationNames(  )
386 {
387     return false;
388 }
389 
390 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsConvert( sal_Int32, sal_Int32 )
391 {
392     return false;
393 }
394 
395 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsExpressionsInOrderBy(  )
396 {
397     return false;
398 }
399 
400 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsGroupBy(  )
401 {
402     return false;
403 }
404 
405 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsGroupByBeyondSelect(  )
406 {
407     return false;
408 }
409 
410 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsGroupByUnrelated(  )
411 {
412     return false;
413 }
414 
415 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsMultipleTransactions(  )
416 {
417     return false;
418 }
419 
420 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsMultipleResultSets(  )
421 {
422     return false;
423 }
424 
425 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsLikeEscapeClause(  )
426 {
427     return false;
428 }
429 
430 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsOrderByUnrelated(  )
431 {
432     return false;
433 }
434 
435 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsUnion(  )
436 {
437     return false;
438 }
439 
440 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsUnionAll(  )
441 {
442     return false;
443 }
444 
445 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsMixedCaseIdentifiers(  )
446 {
447     return false;
448 }
449 
450 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsMixedCaseQuotedIdentifiers(  )
451 {
452     return false;
453 }
454 
455 sal_Bool SAL_CALL MacabDatabaseMetaData::nullsAreSortedAtEnd(  )
456 {
457     return false;
458 }
459 
460 sal_Bool SAL_CALL MacabDatabaseMetaData::nullsAreSortedAtStart(  )
461 {
462     return false;
463 }
464 
465 sal_Bool SAL_CALL MacabDatabaseMetaData::nullsAreSortedHigh(  )
466 {
467     return false;
468 }
469 
470 sal_Bool SAL_CALL MacabDatabaseMetaData::nullsAreSortedLow(  )
471 {
472     return false;
473 }
474 
475 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSchemasInProcedureCalls(  )
476 {
477     return false;
478 }
479 
480 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSchemasInPrivilegeDefinitions(  )
481 {
482     return false;
483 }
484 
485 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCatalogsInProcedureCalls(  )
486 {
487     return false;
488 }
489 
490 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions(  )
491 {
492     return false;
493 }
494 
495 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCorrelatedSubqueries(  )
496 {
497     return false;
498 }
499 
500 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSubqueriesInComparisons(  )
501 {
502     return false;
503 }
504 
505 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSubqueriesInExists(  )
506 {
507     return false;
508 }
509 
510 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSubqueriesInIns(  )
511 {
512     return false;
513 }
514 
515 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsSubqueriesInQuantifieds(  )
516 {
517     return false;
518 }
519 
520 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsANSI92IntermediateSQL(  )
521 {
522     return false;
523 }
524 
525 OUString SAL_CALL MacabDatabaseMetaData::getURL(  )
526 {
527     // if someday we support more than the default address book,
528     // this method should return the URL which was used to create it
529     return "sdbc:address:macab:";
530 }
531 
532 OUString SAL_CALL MacabDatabaseMetaData::getUserName(  )
533 {
534     return OUString();
535 }
536 
537 OUString SAL_CALL MacabDatabaseMetaData::getDriverName(  )
538 {
539     return "macab";
540 }
541 
542 OUString SAL_CALL MacabDatabaseMetaData::getDriverVersion()
543 {
544     return MACAB_DRIVER_VERSION;
545 }
546 
547 OUString SAL_CALL MacabDatabaseMetaData::getDatabaseProductVersion(  )
548 {
549     return OUString();
550 }
551 
552 OUString SAL_CALL MacabDatabaseMetaData::getDatabaseProductName(  )
553 {
554     return OUString();
555 }
556 
557 OUString SAL_CALL MacabDatabaseMetaData::getProcedureTerm(  )
558 {
559     return OUString();
560 }
561 
562 OUString SAL_CALL MacabDatabaseMetaData::getSchemaTerm(  )
563 {
564     return OUString();
565 }
566 
567 sal_Int32 SAL_CALL MacabDatabaseMetaData::getDriverMajorVersion(  )
568 {
569     return MACAB_DRIVER_VERSION_MAJOR;
570 }
571 
572 sal_Int32 SAL_CALL MacabDatabaseMetaData::getDefaultTransactionIsolation(  )
573 {
574     return TransactionIsolation::NONE;
575 }
576 
577 sal_Int32 SAL_CALL MacabDatabaseMetaData::getDriverMinorVersion(  )
578 {
579     return MACAB_DRIVER_VERSION_MINOR;
580 }
581 
582 OUString SAL_CALL MacabDatabaseMetaData::getSQLKeywords(  )
583 {
584     return OUString();
585 }
586 
587 OUString SAL_CALL MacabDatabaseMetaData::getSearchStringEscape(  )
588 {
589     return OUString();
590 }
591 
592 OUString SAL_CALL MacabDatabaseMetaData::getStringFunctions(  )
593 {
594     return OUString();
595 }
596 
597 OUString SAL_CALL MacabDatabaseMetaData::getTimeDateFunctions(  )
598 {
599     return OUString();
600 }
601 
602 OUString SAL_CALL MacabDatabaseMetaData::getSystemFunctions(  )
603 {
604     return OUString();
605 }
606 
607 OUString SAL_CALL MacabDatabaseMetaData::getNumericFunctions(  )
608 {
609     return OUString();
610 }
611 
612 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsExtendedSQLGrammar(  )
613 {
614     return false;
615 }
616 
617 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsCoreSQLGrammar(  )
618 {
619     return false;
620 }
621 
622 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsMinimumSQLGrammar(  )
623 {
624     return true;
625 }
626 
627 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsFullOuterJoins(  )
628 {
629     return false;
630 }
631 
632 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsLimitedOuterJoins(  )
633 {
634     return false;
635 }
636 
637 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnsInGroupBy(  )
638 {
639     return 0; // 0 means no limit
640 }
641 
642 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnsInOrderBy(  )
643 {
644     return 0; // 0 means no limit
645 }
646 
647 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxColumnsInSelect(  )
648 {
649     return 0; // 0 means no limit
650 }
651 
652 sal_Int32 SAL_CALL MacabDatabaseMetaData::getMaxUserNameLength(  )
653 {
654     return 0; // 0 means no limit
655 }
656 
657 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsResultSetType( sal_Int32 setType )
658 {
659     switch (setType)
660     {
661         case ResultSetType::FORWARD_ONLY:
662         case ResultSetType::SCROLL_INSENSITIVE:
663             return true;
664     }
665     return false;
666 }
667 
668 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 )
669 {
670     switch (setType)
671     {
672         case ResultSetType::FORWARD_ONLY:
673         case ResultSetType::SCROLL_INSENSITIVE:
674             return true;
675     }
676     return false;
677 }
678 
679 sal_Bool SAL_CALL MacabDatabaseMetaData::ownUpdatesAreVisible( sal_Int32 )
680 {
681     return false;
682 }
683 
684 sal_Bool SAL_CALL MacabDatabaseMetaData::ownDeletesAreVisible( sal_Int32 )
685 {
686     return false;
687 }
688 
689 sal_Bool SAL_CALL MacabDatabaseMetaData::ownInsertsAreVisible( sal_Int32 )
690 {
691     return false;
692 }
693 
694 sal_Bool SAL_CALL MacabDatabaseMetaData::othersUpdatesAreVisible( sal_Int32 )
695 {
696     return false;
697 }
698 
699 sal_Bool SAL_CALL MacabDatabaseMetaData::othersDeletesAreVisible( sal_Int32 )
700 {
701     return false;
702 }
703 
704 sal_Bool SAL_CALL MacabDatabaseMetaData::othersInsertsAreVisible( sal_Int32 )
705 {
706     return false;
707 }
708 
709 sal_Bool SAL_CALL MacabDatabaseMetaData::updatesAreDetected( sal_Int32 )
710 {
711     return false;
712 }
713 
714 sal_Bool SAL_CALL MacabDatabaseMetaData::deletesAreDetected( sal_Int32 )
715 {
716     return false;
717 }
718 
719 sal_Bool SAL_CALL MacabDatabaseMetaData::insertsAreDetected( sal_Int32 )
720 {
721     return false;
722 }
723 
724 sal_Bool SAL_CALL MacabDatabaseMetaData::supportsBatchUpdates(  )
725 {
726     return false;
727 }
728 
729 Reference< XConnection > SAL_CALL MacabDatabaseMetaData::getConnection(  )
730 {
731     return m_xConnection.get();
732 }
733 
734 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTableTypes(  )
735 {
736     ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTableTypes);
737     Reference< XResultSet > xRef = pResult;
738 
739     static ODatabaseMetaDataResultSet::ORows aRows = [&]
740     {
741         static const char aTable[] = "TABLE";
742         ODatabaseMetaDataResultSet::ORows tmp;
743         ODatabaseMetaDataResultSet::ORow aRow(2);
744         aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
745         aRow[1] = new ORowSetValueDecorator(OUString(aTable));
746         tmp.push_back(aRow);
747         return tmp;
748     }();
749     pResult->setRows(aRows);
750     return xRef;
751 }
752 
753 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTypeInfo(  )
754 {
755     ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTypeInfo);
756     Reference< XResultSet > xRef = pResult;
757 
758     static ODatabaseMetaDataResultSet::ORows aRows = [&]()
759     {
760         ODatabaseMetaDataResultSet::ORows tmp;
761         ODatabaseMetaDataResultSet::ORow aRow(19);
762 
763         // We support four types: char, timestamp, integer, float
764         aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
765         aRow[1] = new ORowSetValueDecorator(OUString("CHAR"));
766         aRow[2] = new ORowSetValueDecorator(DataType::CHAR);
767         aRow[3] = new ORowSetValueDecorator(sal_Int32(254));
768         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
769         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
770         aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue();
771         aRow[7] = new ORowSetValueDecorator(sal_Int32(ColumnValue::NULLABLE));
772         aRow[8] = ODatabaseMetaDataResultSet::get1Value();
773         aRow[9] = new ORowSetValueDecorator(sal_Int32(ColumnSearch::CHAR));
774         aRow[10] = ODatabaseMetaDataResultSet::get1Value();
775         aRow[11] = ODatabaseMetaDataResultSet::get0Value();
776         aRow[12] = ODatabaseMetaDataResultSet::get0Value();
777         aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue();
778         aRow[14] = ODatabaseMetaDataResultSet::get0Value();
779         aRow[15] = ODatabaseMetaDataResultSet::get0Value();
780         aRow[16] = ODatabaseMetaDataResultSet::getEmptyValue();
781         aRow[17] = ODatabaseMetaDataResultSet::getEmptyValue();
782         aRow[18] = new ORowSetValueDecorator(sal_Int32(10));
783 
784         tmp.push_back(aRow);
785 
786         aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP"));
787         aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP);
788         aRow[3] = new ORowSetValueDecorator(sal_Int32(19));
789         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
790         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
791         tmp.push_back(aRow);
792 
793         aRow[1] = new ORowSetValueDecorator(OUString("INTEGER"));
794         aRow[2] = new ORowSetValueDecorator(DataType::INTEGER);
795         aRow[3] = new ORowSetValueDecorator(sal_Int32(20));
796         aRow[15] = new ORowSetValueDecorator(sal_Int32(20));
797         tmp.push_back(aRow);
798 
799         aRow[1] = new ORowSetValueDecorator(OUString("FLOAT"));
800         aRow[2] = new ORowSetValueDecorator(DataType::FLOAT);
801         aRow[3] = new ORowSetValueDecorator(sal_Int32(20));
802         aRow[15] = new ORowSetValueDecorator(sal_Int32(15));
803         tmp.push_back(aRow);
804 
805         return tmp;
806     }();
807     pResult->setRows(aRows);
808     return xRef;
809 }
810 
811 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getCatalogs(  )
812 {
813     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCatalogs );
814 }
815 
816 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getSchemas(  )
817 {
818     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eSchemas );
819 }
820 
821 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getColumnPrivileges(
822     const Any&, const OUString&, const OUString&,
823     const OUString& )
824 {
825     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumnPrivileges );
826 }
827 
828 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getColumns(
829     const Any&,
830     const OUString&,
831     const OUString& tableNamePattern,
832     const OUString& columnNamePattern)
833 {
834     ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns);
835     Reference< XResultSet > xRef = pResult;
836     MacabRecords *aRecords;
837     OUString sTableName;
838 
839     aRecords = m_xConnection->getAddressBook()->getMacabRecordsMatch(tableNamePattern);
840 
841     ODatabaseMetaDataResultSet::ORows aRows;
842     if(aRecords != nullptr)
843     {
844         MacabHeader *aHeader = aRecords->getHeader();
845         sTableName = aRecords->getName();
846 
847         ODatabaseMetaDataResultSet::ORow aRow(19);
848 
849         aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
850         aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
851         aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue();
852         aRow[3] = new ORowSetValueDecorator(sTableName);
853         aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue();
854         aRow[9] = ODatabaseMetaDataResultSet::get0Value();
855         aRow[10] = new ORowSetValueDecorator(sal_Int32(10));
856         aRow[11] = ODatabaseMetaDataResultSet::get1Value();
857         aRow[12] = ODatabaseMetaDataResultSet::getEmptyValue();
858         aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue();
859         aRow[14] = ODatabaseMetaDataResultSet::getEmptyValue();
860         aRow[15] = ODatabaseMetaDataResultSet::getEmptyValue();
861         aRow[16] = new ORowSetValueDecorator(sal_Int32(254));
862         aRow[18] = new ORowSetValueDecorator(OUString("YES"));
863 
864         sal_Int32 nPosition = 1;
865         OUString sName;
866 
867         MacabHeader::iterator aField;
868 
869         for (   aField = aHeader->begin();
870                 aField != aHeader->end();
871                 ++aField, ++nPosition)
872         {
873 
874             sName = CFStringToOUString(static_cast<CFStringRef>((*aField)->value));
875             if (match(columnNamePattern, sName, '\0'))
876             {
877                 aRow[4] = new ORowSetValueDecorator(sName);
878                 aRow[17] = new ORowSetValueDecorator(nPosition);
879                 switch((*aField)->type)
880                 {
881                     case kABStringProperty:
882                         aRow[5] = new ORowSetValueDecorator(DataType::CHAR);
883                         aRow[6] = new ORowSetValueDecorator(OUString("CHAR"));
884                         aRow[7] = new ORowSetValueDecorator(sal_Int32(256));
885                         aRows.push_back(aRow);
886                         break;
887                     case kABDateProperty:
888                         aRow[5] = new ORowSetValueDecorator(DataType::TIMESTAMP);
889                         aRow[6] = new ORowSetValueDecorator(OUString("TIMESTAMP"));
890                         aRows.push_back(aRow);
891                         break;
892                     case kABIntegerProperty:
893                         aRow[5] = new ORowSetValueDecorator(DataType::INTEGER);
894                         aRow[6] = new ORowSetValueDecorator(OUString("INTEGER"));
895                         aRow[7] = new ORowSetValueDecorator(sal_Int32(20));
896                         aRows.push_back(aRow);
897                         break;
898                     case kABRealProperty:
899                         aRow[5] = new ORowSetValueDecorator(DataType::FLOAT);
900                         aRow[6] = new ORowSetValueDecorator(OUString("FLOAT"));
901                         aRow[7] = new ORowSetValueDecorator(sal_Int32(15));
902                         aRows.push_back(aRow);
903                         break;
904                     default:
905                         ;
906                         // shouldn't happen -- throw an error...?
907                 }
908             }
909         }
910     }
911     pResult->setRows(aRows);
912     return xRef;
913 }
914 
915 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTables(
916     const Any&,
917     const OUString&,
918     const OUString&,
919     const Sequence< OUString >& types)
920 {
921     ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables);
922     Reference< XResultSet > xRef = pResult;
923 
924     // check whether we have tables in the requested types
925     // for the moment, we answer only the "TABLE" table type
926     // when no types are given at all, we return all the tables
927     static const char aTable[] = "TABLE";
928     bool bTableFound = false;
929     const OUString* p = types.getConstArray(),
930                          * pEnd = p + types.getLength();
931 
932     if (p == pEnd)
933     {
934         bTableFound = true;
935     }
936     else while (p < pEnd)
937     {
938         if (match(*p, aTable, '\0'))
939         {
940             bTableFound = true;
941             break;
942         }
943         p++;
944     }
945     if (!bTableFound)
946         return xRef;
947 
948     static ODatabaseMetaDataResultSet::ORows aRows = [&]()
949     {
950         ODatabaseMetaDataResultSet::ORows tmp;
951         ODatabaseMetaDataResultSet::ORow aRow(6);
952 
953         MacabRecords *xRecords = m_xConnection->getAddressBook()->getMacabRecords();
954         std::vector<MacabGroup *> xGroups = m_xConnection->getAddressBook()->getMacabGroups();
955         sal_Int32 i, nGroups;
956         nGroups = xGroups.size();
957 
958         aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
959         aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
960         aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue();
961         aRow[3] = new ORowSetValueDecorator(xRecords->getName());
962         aRow[4] = new ORowSetValueDecorator(OUString(aTable));
963         aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
964         tmp.push_back(aRow);
965 
966         for(i = 0; i < nGroups; i++)
967         {
968             aRow[3] = new ORowSetValueDecorator(xGroups[i]->getName());
969             tmp.push_back(aRow);
970         }
971         return tmp;
972     }();
973     pResult->setRows(aRows);
974     return xRef;
975 }
976 
977 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getProcedureColumns(
978     const Any&, const OUString&,
979     const OUString&, const OUString& )
980 {
981     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedureColumns );
982 }
983 
984 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getProcedures(
985     const Any&, const OUString&,
986     const OUString& )
987 {
988     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedures );
989 }
990 
991 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getVersionColumns(
992     const Any&, const OUString&, const OUString& table )
993 {
994     ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns);
995     Reference< XResultSet > xRef = pResult;
996 
997     ODatabaseMetaDataResultSet::ORows aRows;
998 
999     if (m_xConnection->getAddressBook()->getMacabRecords(table) != nullptr)
1000     {
1001         ODatabaseMetaDataResultSet::ORow aRow( 9 );
1002 
1003         OUString sName = CFStringToOUString(kABModificationDateProperty);
1004 
1005         aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
1006         aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
1007         aRow[2] = new ORowSetValueDecorator(sName);
1008         aRow[3] = new ORowSetValueDecorator(DataType::TIMESTAMP);
1009         aRow[4] = new ORowSetValueDecorator(OUString("TIMESTAMP"));
1010 
1011         aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
1012         aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue();
1013         aRow[7] = ODatabaseMetaDataResultSet::getEmptyValue();
1014         aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue();
1015 
1016         aRows.push_back(aRow);
1017     }
1018     pResult->setRows(aRows);
1019     return xRef;
1020 }
1021 
1022 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getExportedKeys(
1023     const Any&, const OUString&, const OUString& )
1024 {
1025     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eExportedKeys );
1026 }
1027 
1028 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getImportedKeys(
1029     const Any&, const OUString&, const OUString& )
1030 {
1031     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eImportedKeys );
1032 }
1033 
1034 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getPrimaryKeys(
1035     const Any&, const OUString&, const OUString& )
1036 {
1037     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::ePrimaryKeys );
1038 }
1039 
1040 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getIndexInfo(
1041     const Any&, const OUString&, const OUString&,
1042     sal_Bool, sal_Bool )
1043 {
1044     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eIndexInfo );
1045 }
1046 
1047 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getBestRowIdentifier(
1048     const Any&, const OUString&, const OUString&, sal_Int32,
1049     sal_Bool )
1050 {
1051     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eBestRowIdentifier );
1052 }
1053 
1054 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTablePrivileges(
1055     const Any&, const OUString&, const OUString& )
1056 {
1057     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTablePrivileges );
1058 }
1059 
1060 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getCrossReference(
1061     const Any&, const OUString&,
1062     const OUString&, const Any&,
1063     const OUString&, const OUString& )
1064 {
1065     return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCrossReference );
1066 }
1067 
1068 Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getUDTs( const Any&, const OUString&, const OUString&, const Sequence< sal_Int32 >& )
1069 {
1070     OSL_FAIL("Not implemented yet!");
1071     throw SQLException();
1072 }
1073 
1074 
1075 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1076