You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
8.0 KiB
C
229 lines
8.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkSQLQuery.h
|
||
|
|
||
|
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 2008 Sandia Corporation.
|
||
|
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||
|
the U.S. Government retains certain rights in this software.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
/**
|
||
|
* @class vtkSQLQuery
|
||
|
* @brief executes an sql query and retrieves results
|
||
|
*
|
||
|
*
|
||
|
* The abstract superclass of SQL query classes. Instances of subclasses
|
||
|
* of vtkSQLQuery are created using the GetQueryInstance() function in
|
||
|
* vtkSQLDatabase. To implement a query connection for a new database
|
||
|
* type, subclass both vtkSQLDatabase and vtkSQLQuery, and implement the
|
||
|
* required functions. For the query class, this involves the following:
|
||
|
*
|
||
|
* Execute() - Execute the query on the database. No results need to be
|
||
|
* retrieved at this point, unless you are performing caching.
|
||
|
*
|
||
|
* GetNumberOfFields() - After Execute() is performed, returns the number
|
||
|
* of fields in the query results.
|
||
|
*
|
||
|
* GetFieldName() - The name of the field at an index.
|
||
|
*
|
||
|
* GetFieldType() - The data type of the field at an index.
|
||
|
*
|
||
|
* NextRow() - Advances the query results by one row, and returns whether
|
||
|
* there are more rows left in the query.
|
||
|
*
|
||
|
* DataValue() - Extract a single data value from the current row.
|
||
|
*
|
||
|
* Begin/Rollback/CommitTransaction() - These methods are optional but
|
||
|
* recommended if the database supports transactions.
|
||
|
*
|
||
|
* @par Thanks:
|
||
|
* Thanks to Andrew Wilson from Sandia National Laboratories for his work
|
||
|
* on the database classes.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkSQLDatabase
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkSQLQuery_h
|
||
|
#define vtkSQLQuery_h
|
||
|
|
||
|
#include "vtkIOSQLModule.h" // For export macro
|
||
|
#include "vtkRowQuery.h"
|
||
|
#include "vtkStdString.h" // for EscapeString()
|
||
|
|
||
|
class vtkSQLDatabase;
|
||
|
class vtkVariant;
|
||
|
class vtkVariantArray;
|
||
|
|
||
|
class VTKIOSQL_EXPORT vtkSQLQuery : public vtkRowQuery
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkSQLQuery, vtkRowQuery);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The query string to be executed. Since some databases will
|
||
|
* process the query string as soon as it's set, this method returns
|
||
|
* a boolean to indicate success or failure.
|
||
|
*/
|
||
|
virtual bool SetQuery(const char* query);
|
||
|
virtual const char* GetQuery();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return true if the query is active (i.e. execution was successful
|
||
|
* and results are ready to be fetched). Returns false on error or
|
||
|
* inactive query.
|
||
|
*/
|
||
|
bool IsActive() override { return this->Active; }
|
||
|
|
||
|
/**
|
||
|
* Execute the query. This must be performed
|
||
|
* before any field name or data access functions
|
||
|
* are used.
|
||
|
*/
|
||
|
bool Execute() override = 0;
|
||
|
|
||
|
/**
|
||
|
* Begin, commit, or roll back a transaction. If the underlying
|
||
|
* database does not support transactions these calls will do
|
||
|
* nothing.
|
||
|
*/
|
||
|
virtual bool BeginTransaction() { return true; }
|
||
|
virtual bool CommitTransaction() { return true; }
|
||
|
virtual bool RollbackTransaction() { return true; }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Return the database associated with the query.
|
||
|
*/
|
||
|
vtkGetObjectMacro(Database, vtkSQLDatabase);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Bind a parameter to a placeholder in a query. A full discussion
|
||
|
* of this feature is beyond the scope of this header file, but in
|
||
|
* short, here's how it works:
|
||
|
|
||
|
* Instead of saying "SELECT foo FROM mytable WHERE myfield = 12345"
|
||
|
* you can say "SELECT foo FROM mytable WHERE myfield = ?". The ?
|
||
|
* character is a placeholder for a parameter that must then be
|
||
|
* bound. Call BindParameter(0, 12345) to bind the integer value
|
||
|
* 12345 to that field. Placeholders are indexed starting at 0.
|
||
|
|
||
|
* You are responsible for making sure that the types match when you
|
||
|
* call BindParameter. You don't have to get it precisely correct:
|
||
|
* in general, the SQL driver is smart enough to do things like cast
|
||
|
* a short to a long or a float to a double.
|
||
|
|
||
|
* Bound parameters were introduced in ANSI SQL 92. Please see that
|
||
|
* standard for more information.
|
||
|
|
||
|
* Most of these methods are excluded from wrapping because the Java
|
||
|
* wrapper treats all integer types from char up through 64-bit long
|
||
|
* as 'int'. This is incorrect behavior but what else am I going to
|
||
|
* do?
|
||
|
|
||
|
* Finally, the default implementation for BindParameter(int,
|
||
|
* vtkVariant) dispatches to one of the more type-specific versions. It
|
||
|
* should be OK to use in database drivers without modification.
|
||
|
*/
|
||
|
|
||
|
virtual bool BindParameter(int index, unsigned char value);
|
||
|
virtual bool BindParameter(int index, unsigned short value);
|
||
|
virtual bool BindParameter(int index, unsigned int value);
|
||
|
virtual bool BindParameter(int index, unsigned long value);
|
||
|
// The C and C++ standards leave it up to each compiler to decide
|
||
|
// whether chars are signed or unsigned by default. All the other
|
||
|
// types are signed unless otherwise specified.
|
||
|
virtual bool BindParameter(int index, signed char value);
|
||
|
virtual bool BindParameter(int index, short value);
|
||
|
|
||
|
virtual bool BindParameter(int index, int value);
|
||
|
|
||
|
virtual bool BindParameter(int index, long value);
|
||
|
virtual bool BindParameter(int index, unsigned long long value);
|
||
|
virtual bool BindParameter(int index, long long value);
|
||
|
|
||
|
virtual bool BindParameter(int index, float value);
|
||
|
virtual bool BindParameter(int index, double value);
|
||
|
/**
|
||
|
* Bind a string value -- string must be null-terminated
|
||
|
*/
|
||
|
virtual bool BindParameter(int index, const char* stringValue);
|
||
|
/**
|
||
|
* Bind a string value by specifying an array and a size
|
||
|
*/
|
||
|
virtual bool BindParameter(int index, const char* stringValue, size_t length);
|
||
|
|
||
|
virtual bool BindParameter(int index, const vtkStdString& string);
|
||
|
|
||
|
virtual bool BindParameter(int index, vtkVariant var);
|
||
|
/**
|
||
|
* Bind a blob value. Not all databases support blobs as a data
|
||
|
* type. Check vtkSQLDatabase::IsSupported(VTK_SQL_FEATURE_BLOB) to
|
||
|
* make sure.
|
||
|
*/
|
||
|
virtual bool BindParameter(int index, const void* data, size_t length);
|
||
|
/**
|
||
|
* Reset all parameter bindings to nullptr.
|
||
|
*/
|
||
|
virtual bool ClearParameterBindings();
|
||
|
|
||
|
/**
|
||
|
* Escape a string for inclusion into an SQL query.
|
||
|
* If \a addSurroundingQuotes is true, then quotation marks appropriate to the
|
||
|
* backend database will be added to enclose the escaped string. This argument
|
||
|
* defaults to true.
|
||
|
|
||
|
* A default, simple-minded implementation is provided for
|
||
|
* database backends that do not provde a way to escape
|
||
|
* strings for use inside queries.
|
||
|
*/
|
||
|
virtual vtkStdString EscapeString(vtkStdString s, bool addSurroundingQuotes = true);
|
||
|
|
||
|
/**
|
||
|
* Escape a string for inclusion into an SQL query.
|
||
|
* This method exists to provide a wrappable version of
|
||
|
* the method that takes and returns vtkStdString objects.
|
||
|
* You are responsible for calling delete [] on the
|
||
|
* character array returned by this method.
|
||
|
* This method simply calls the vtkStdString variant and thus
|
||
|
* need not be re-implemented by subclasses.
|
||
|
*/
|
||
|
char* EscapeString(const char* src, bool addSurroundingQuotes);
|
||
|
|
||
|
protected:
|
||
|
vtkSQLQuery();
|
||
|
~vtkSQLQuery() override;
|
||
|
|
||
|
/**
|
||
|
* Set the database associated with the query.
|
||
|
* This is only to be called by the corresponding
|
||
|
* database class on creation of the query in
|
||
|
* GetQueryInstance().
|
||
|
*/
|
||
|
void SetDatabase(vtkSQLDatabase* db);
|
||
|
|
||
|
char* Query;
|
||
|
vtkSQLDatabase* Database;
|
||
|
bool Active;
|
||
|
|
||
|
private:
|
||
|
vtkSQLQuery(const vtkSQLQuery&) = delete;
|
||
|
void operator=(const vtkSQLQuery&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif // vtkSQLQuery_h
|