@@ -441,14 +441,11 @@ TEST(SQLConnect, TestSQLConnect) {
441
441
// Connect string
442
442
ASSERT_OK_AND_ASSIGN (std::string connect_str,
443
443
arrow::internal::GetEnvVar (TEST_CONNECT_STR));
444
- ASSERT_OK_AND_ASSIGN (std::wstring wconnect_str,
445
- arrow::util::UTF8ToWideString (connect_str));
446
- std::vector<SQLWCHAR> connect_str0 (wconnect_str.begin (), wconnect_str.end ());
447
444
448
445
// Write connection string content into a DSN,
449
446
// must succeed before continuing
450
- std::string uid, pwd;
451
- ASSERT_TRUE (writeDSN (connect_str, uid, pwd ));
447
+ std::string uid ( " " ) , pwd ( " " ) ;
448
+ ASSERT_TRUE (writeDSN (connect_str));
452
449
453
450
std::string dsn (TEST_DSN);
454
451
ASSERT_OK_AND_ASSIGN (std::wstring wdsn, arrow::util::UTF8ToWideString (dsn));
@@ -492,7 +489,7 @@ TEST(SQLConnect, TestSQLConnect) {
492
489
EXPECT_TRUE (ret == SQL_SUCCESS);
493
490
}
494
491
495
- TEST (SQLConnect, TestSQLConnectWrongUid ) {
492
+ TEST (SQLConnect, TestSQLConnectInputUidPwd ) {
496
493
// ODBC Environment
497
494
SQLHENV env;
498
495
SQLHDBC conn;
@@ -514,17 +511,98 @@ TEST(SQLConnect, TestSQLConnectWrongUid) {
514
511
// Connect string
515
512
ASSERT_OK_AND_ASSIGN (std::string connect_str,
516
513
arrow::internal::GetEnvVar (TEST_CONNECT_STR));
517
- ASSERT_OK_AND_ASSIGN (std::wstring wconnect_str,
518
- arrow::util::UTF8ToWideString (connect_str));
519
- std::vector<SQLWCHAR> connect_str0 (wconnect_str.begin (), wconnect_str.end ());
520
514
521
- // Write connection string content into a DSN,
515
+ // Retrieve valid uid and pwd
516
+ Connection::ConnPropertyMap properties;
517
+ ODBC::ODBCConnection::getPropertiesFromConnString (connect_str, properties);
518
+ std::string uid_key (" uid" );
519
+ std::string pwd_key (" pwd" );
520
+ std::string uid = properties[uid_key];
521
+ std::string pwd = properties[pwd_key];
522
+
523
+ // Write connection string content without uid and pwd into a DSN,
522
524
// must succeed before continuing
523
- std::string uid, pwd;
524
- ASSERT_TRUE (writeDSN (connect_str, uid, pwd));
525
+ properties.erase (uid_key);
526
+ properties.erase (pwd_key);
527
+ ASSERT_TRUE (writeDSN (properties));
525
528
526
- // Make invalid uid
527
- uid += std::string (" _invalid" );
529
+ std::string dsn (TEST_DSN);
530
+ ASSERT_OK_AND_ASSIGN (std::wstring wdsn, arrow::util::UTF8ToWideString (dsn));
531
+ ASSERT_OK_AND_ASSIGN (std::wstring wuid, arrow::util::UTF8ToWideString (uid));
532
+ ASSERT_OK_AND_ASSIGN (std::wstring wpwd, arrow::util::UTF8ToWideString (pwd));
533
+ std::vector<SQLWCHAR> dsn0 (wdsn.begin (), wdsn.end ());
534
+ std::vector<SQLWCHAR> uid0 (wuid.begin (), wuid.end ());
535
+ std::vector<SQLWCHAR> pwd0 (wpwd.begin (), wpwd.end ());
536
+
537
+ // Connecting to ODBC server.
538
+ ret = SQLConnect (conn, dsn0.data (), static_cast <SQLSMALLINT>(dsn0.size ()), uid0.data (),
539
+ static_cast <SQLSMALLINT>(uid0.size ()), pwd0.data (),
540
+ static_cast <SQLSMALLINT>(pwd0.size ()));
541
+
542
+ if (ret != SQL_SUCCESS) {
543
+ std::cerr << GetOdbcErrorMessage (SQL_HANDLE_DBC, conn) << std::endl;
544
+ }
545
+
546
+ EXPECT_TRUE (ret == SQL_SUCCESS);
547
+
548
+ // Remove DSN
549
+ EXPECT_TRUE (UnregisterDsn (dsn));
550
+
551
+ // Disconnect from ODBC
552
+ ret = SQLDisconnect (conn);
553
+
554
+ if (ret != SQL_SUCCESS) {
555
+ std::cerr << GetOdbcErrorMessage (SQL_HANDLE_DBC, conn) << std::endl;
556
+ }
557
+
558
+ EXPECT_TRUE (ret == SQL_SUCCESS);
559
+
560
+ // Free connection handle
561
+ ret = SQLFreeHandle (SQL_HANDLE_DBC, conn);
562
+
563
+ EXPECT_TRUE (ret == SQL_SUCCESS);
564
+
565
+ // Free environment handle
566
+ ret = SQLFreeHandle (SQL_HANDLE_ENV, env);
567
+
568
+ EXPECT_TRUE (ret == SQL_SUCCESS);
569
+ }
570
+
571
+ TEST (SQLConnect, TestSQLConnectInvalidUid) {
572
+ // ODBC Environment
573
+ SQLHENV env;
574
+ SQLHDBC conn;
575
+
576
+ // Allocate an environment handle
577
+ SQLRETURN ret = SQLAllocEnv (&env);
578
+
579
+ EXPECT_TRUE (ret == SQL_SUCCESS);
580
+
581
+ ret = SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0 );
582
+
583
+ EXPECT_TRUE (ret == SQL_SUCCESS);
584
+
585
+ // Allocate a connection using alloc handle
586
+ ret = SQLAllocHandle (SQL_HANDLE_DBC, env, &conn);
587
+
588
+ EXPECT_TRUE (ret == SQL_SUCCESS);
589
+
590
+ // Connect string
591
+ ASSERT_OK_AND_ASSIGN (std::string connect_str,
592
+ arrow::internal::GetEnvVar (TEST_CONNECT_STR));
593
+
594
+ // Retrieve valid uid and pwd
595
+ Connection::ConnPropertyMap properties;
596
+ ODBC::ODBCConnection::getPropertiesFromConnString (connect_str, properties);
597
+ std::string uid = properties[std::string (" uid" )];
598
+ std::string pwd = properties[std::string (" pwd" )];
599
+
600
+ // Append invalid uid to connection string
601
+ connect_str += std::string (" uid=non_existent_id;" );
602
+
603
+ // Write connection string content into a DSN,
604
+ // must succeed before continuing
605
+ ASSERT_TRUE (writeDSN (connect_str));
528
606
529
607
std::string dsn (TEST_DSN);
530
608
ASSERT_OK_AND_ASSIGN (std::wstring wdsn, arrow::util::UTF8ToWideString (dsn));
@@ -539,6 +617,8 @@ TEST(SQLConnect, TestSQLConnectWrongUid) {
539
617
static_cast <SQLSMALLINT>(uid0.size ()), pwd0.data (),
540
618
static_cast <SQLSMALLINT>(pwd0.size ()));
541
619
620
+ // UID specified in DSN will take precedence,
621
+ // so connection still fails despite passing valid uid in SQLConnect call
542
622
EXPECT_TRUE (ret == SQL_ERROR);
543
623
544
624
// TODO uncomment this check when SQLGetDiagRec is implemented
@@ -558,6 +638,77 @@ TEST(SQLConnect, TestSQLConnectWrongUid) {
558
638
EXPECT_TRUE (ret == SQL_SUCCESS);
559
639
}
560
640
641
+ TEST (SQLConnect, TestSQLConnectDSNPrecedence) {
642
+ // ODBC Environment
643
+ SQLHENV env;
644
+ SQLHDBC conn;
645
+
646
+ // Allocate an environment handle
647
+ SQLRETURN ret = SQLAllocEnv (&env);
648
+
649
+ EXPECT_TRUE (ret == SQL_SUCCESS);
650
+
651
+ ret = SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0 );
652
+
653
+ EXPECT_TRUE (ret == SQL_SUCCESS);
654
+
655
+ // Allocate a connection using alloc handle
656
+ ret = SQLAllocHandle (SQL_HANDLE_DBC, env, &conn);
657
+
658
+ EXPECT_TRUE (ret == SQL_SUCCESS);
659
+
660
+ // Connect string
661
+ ASSERT_OK_AND_ASSIGN (std::string connect_str,
662
+ arrow::internal::GetEnvVar (TEST_CONNECT_STR));
663
+
664
+ // Write connection string content into a DSN,
665
+ // must succeed before continuing
666
+
667
+ // Pass incorrect uid and password to SQLConnect, they will be ignored
668
+ std::string uid (" non_existent_id" ), pwd (" non_existent_password" );
669
+ ASSERT_TRUE (writeDSN (connect_str));
670
+
671
+ std::string dsn (TEST_DSN);
672
+ ASSERT_OK_AND_ASSIGN (std::wstring wdsn, arrow::util::UTF8ToWideString (dsn));
673
+ ASSERT_OK_AND_ASSIGN (std::wstring wuid, arrow::util::UTF8ToWideString (uid));
674
+ ASSERT_OK_AND_ASSIGN (std::wstring wpwd, arrow::util::UTF8ToWideString (pwd));
675
+ std::vector<SQLWCHAR> dsn0 (wdsn.begin (), wdsn.end ());
676
+ std::vector<SQLWCHAR> uid0 (wuid.begin (), wuid.end ());
677
+ std::vector<SQLWCHAR> pwd0 (wpwd.begin (), wpwd.end ());
678
+
679
+ // Connecting to ODBC server.
680
+ ret = SQLConnect (conn, dsn0.data (), static_cast <SQLSMALLINT>(dsn0.size ()), uid0.data (),
681
+ static_cast <SQLSMALLINT>(uid0.size ()), pwd0.data (),
682
+ static_cast <SQLSMALLINT>(pwd0.size ()));
683
+
684
+ if (ret != SQL_SUCCESS) {
685
+ std::cerr << GetOdbcErrorMessage (SQL_HANDLE_DBC, conn) << std::endl;
686
+ }
687
+
688
+ EXPECT_TRUE (ret == SQL_SUCCESS);
689
+
690
+ // Remove DSN
691
+ EXPECT_TRUE (UnregisterDsn (dsn));
692
+
693
+ // Disconnect from ODBC
694
+ ret = SQLDisconnect (conn);
695
+
696
+ if (ret != SQL_SUCCESS) {
697
+ std::cerr << GetOdbcErrorMessage (SQL_HANDLE_DBC, conn) << std::endl;
698
+ }
699
+
700
+ EXPECT_TRUE (ret == SQL_SUCCESS);
701
+
702
+ // Free connection handle
703
+ ret = SQLFreeHandle (SQL_HANDLE_DBC, conn);
704
+
705
+ EXPECT_TRUE (ret == SQL_SUCCESS);
706
+
707
+ // Free environment handle
708
+ ret = SQLFreeHandle (SQL_HANDLE_ENV, env);
709
+
710
+ EXPECT_TRUE (ret == SQL_SUCCESS);
711
+ }
561
712
} // namespace integration_tests
562
713
} // namespace odbc
563
714
} // namespace flight
0 commit comments