/*========================================================================= Program: Visualization Toolkit Module: TestODBCDatabase.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /*---------------------------------------------------------------------------- Copyright (c) Sandia Corporation See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. ----------------------------------------------------------------------------*/ // .SECTION Thanks // Thanks to Andrew Wilson from Sandia National Laboratories for implementing // this test. #include "vtkODBCDatabase.h" #include "vtkSQLQuery.h" #include "vtkRowQueryToTable.h" #include "vtkStdString.h" #include "vtkTable.h" #include "vtkVariant.h" #include "vtkVariantArray.h" #include "vtkToolkits.h" #include "vtkIOODBCTestingCxxConfigure.h" #include #define LONGSTRING "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" int TestODBCDatabase( int, char ** const ) { vtkODBCDatabase* db = vtkODBCDatabase::New(); db->SetDataSourceName( VTK_ODBC_TEST_DSN ); bool status = db->Open(nullptr); if ( ! status ) { cerr << "Couldn't open database. Error message: " << db->GetLastErrorText() << "\n"; return 1; } vtkSQLQuery* query = db->GetQueryInstance(); vtkStdString createQuery( "CREATE TABLE people (name VARCHAR(1024), age INTEGER, weight FLOAT)" ); cout << createQuery << endl; query->SetQuery( createQuery.c_str() ); if ( !query->Execute() ) { cerr << "Create query failed. Error message: " << query->GetLastErrorText() << endl; return 1; } int i; for ( i = 0; i < 20; ++ i ) { std::ostringstream queryBuf; queryBuf << "INSERT INTO people VALUES('John Doe " << i << "', " << i << ", " << 10*i + 0.5 << ")"; cout << queryBuf.str() << endl; query->SetQuery( queryBuf.str().c_str() ); if ( !query->Execute() ) { cerr << "Insert query " << i << " failed. Error message: " << query->GetLastErrorText() << endl; return 1; } } const char *placeholders = "INSERT INTO people (name, age, weight) VALUES (?, ?, ?)"; query->SetQuery(placeholders); for ( i = 21; i < 40; i++ ) { char name[20]; snprintf(name, sizeof(name), "John Doe %d", i); bool bind1 = query->BindParameter(0, name); bool bind2 = query->BindParameter(1, i); bool bind3 = query->BindParameter(2, 10.1*i); if (!(bind1 && bind2 && bind3)) { cerr << "Parameter binding failed on query " << i << ": " << bind1 << " " << bind2 << " " << bind3 << endl; return 1; } cout << query->GetQuery() << endl; if (!query->Execute()) { cerr << "Insert query " << i << " failed" << endl; return 1; } } const char* queryText = "SELECT name, age, weight FROM people WHERE age <= 30"; query->SetQuery( queryText ); cerr << endl << "Running query: " << query->GetQuery() << endl; cerr << endl << "Using vtkSQLQuery directly to execute query:" << endl; if ( !query->Execute() ) { cerr << "Query failed with error message " << query->GetLastErrorText() << endl; return 1; } cerr << "Fields returned by query: "; for ( int col = 0; col < query->GetNumberOfFields(); ++ col ) { if ( col > 0 ) { cerr << ", "; } cerr << query->GetFieldName( col ); } cerr << endl; int thisRow = 0; while ( query->NextRow() ) { cerr << "Row " << thisRow << ": "; ++thisRow; for ( int field = 0; field < query->GetNumberOfFields(); ++ field ) { if ( field > 0 ) { cerr << ", "; } cerr << query->DataValue( field ).ToString().c_str(); } cerr << endl; } cerr << endl << "Using vtkSQLQuery to execute query and retrieve by row:" << endl; if ( !query->Execute() ) { cerr << "Query failed with error message " << query->GetLastErrorText() << endl; return 1; } for ( int col = 0; col < query->GetNumberOfFields(); ++ col ) { if ( col > 0 ) { cerr << ", "; } cerr << query->GetFieldName( col ); } cerr << endl; vtkVariantArray* va = vtkVariantArray::New(); while ( query->NextRow( va ) ) { for ( int field = 0; field < va->GetNumberOfValues(); ++ field ) { if ( field > 0 ) { cerr << ", "; } cerr << va->GetValue( field ).ToString().c_str(); } cerr << endl; } va->Delete(); cerr << endl << "Using vtkRowQueryToTable to execute query:" << endl; vtkRowQueryToTable* reader = vtkRowQueryToTable::New(); reader->SetQuery( query ); reader->Update(); vtkTable* table = reader->GetOutput(); for ( vtkIdType col = 0; col < table->GetNumberOfColumns(); ++ col ) { table->GetColumn( col )->Print( cerr ); } cerr << endl; #if defined(PRINT_TABLE_CONTENTS) for ( vtkIdType row = 0; row < table->GetNumberOfRows(); ++ row ) { for ( vtkIdType col = 0; col < table->GetNumberOfColumns(); ++ col ) { vtkVariant v = table->GetValue( row, col ); cerr << "row " << row << ", col " << col << " - " << v.ToString() << " ( " << vtkImageScalarTypeNameMacro( v.GetType()) << " )" << endl; } } #endif query->SetQuery( "DROP TABLE people" ); query->Execute(); reader->Delete(); query->Delete(); db->Delete(); return 0; }