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
