Mercurial > code
view C++/Driver.h @ 171:e47c4e9e3f9d
Add SQL drivers
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 10 Sep 2013 17:28:32 +0200 |
parents | |
children | a61cddaf7547 |
line wrap: on
line source
/* * Driver.h -- generic SQL driver access * * Copyright (c) 2013, David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef _DRIVER_H_ #define _DRIVER_H_ #include <iostream> #include <map> #include <memory> #include <string> class Query; class Date { private: time_t m_timestamp; public: Date() { } Date(time_t) { } ~Date() { } }; /** * @enum ColumnType * @brief The column type request * * Used for the drivers. */ enum class ColumnType { Boolean, //! bool or 0 / 1 Date, //! date see Common/Date.h Double, //! double Integer, //! 32 or 64 bit int String, //! varchar to std::string }; /** * @enum QueryCheck * @brief Result enumeration for check* functions * * This is used for the Query drivers check functions so we can now which * kind of error happened. */ enum class QueryCheck { NoError = 0, //! success InvalidColumn, //! non existent column InvalidRow, //! out of range row InvalidType, //! bad column type requested }; /** * @class QueryError * @brief Query exception on driver error * * Exception thrown usually when an error appeared in driver. */ class QueryError : public std::exception { private: std::string m_error; public: QueryError(); QueryError(const std::string &error); ~QueryError(); virtual const char *what() const throw(); }; /** * @class Query * @brief Class for querying the database */ class Query { private: /** * Check if the request is valid and throws an exception * on error. * * @param row the row number * @param column the column name * @param check the result * @throw Query::ErrorException on erro */ void checkValidRequest(int row, const std::string &column, QueryCheck check); protected: /** * Check if the request is correct, if the row is not out of range * if the column exist and if the type is correct. * * @param row the row number * @param column the column name * @param type the type requested * @return true if request is correct */ virtual QueryCheck checkRequest(int row, const std::string &column, ColumnType type) = 0; /** * Get a bool. * * @param row the row number * @param column the column * @return the value */ virtual bool checkBool(int row, const std::string &column) = 0; /** * Get a Date. * * @param row the row number * @param column the column * @return the value */ virtual Date checkDate(int row, const std::string &column) = 0; /** * Get a double. * * @param row the row number * @param column the column * @return the value */ virtual double checkDouble(int row, const std::string &column) = 0; /** * Get a integer. * * @param row the row number * @param column the column * @return the value */ virtual int checkInt(int row, const std::string &column) = 0; /** * Get a string. * * @param row the row number * @param column the column * @return the value */ virtual std::string checkString(int row, const std::string &column) = 0; public: Query(void); virtual ~Query(void); /** * Get bool at a specified row / column. * * @param row the row number * @param column the column * @return a boolean * @throw Query::ErrorException on error */ bool getBool(int row, const std::string &column); /** * Get a Date at a specified row / column. * * @param row the row number * @param column the column * @return a Date * @throw Query::ErrorException on error */ Date getDate(int row, const std::string &column); /** * Get a double at a specified row / column. * * @param row the row number * @param column the column * @return a double * @throw Query::ErrorException on error */ double getDouble(int row, const std::string &column); /** * Get an integer at a specified row / column. * * @param row the row number * @param column the column * @return an integer * @throw Query::ErrorException on error */ int getInt(int row, const std::string &column); /** * Get a string at a specified row / column. * * @param row the row number * @param column the column * @return a string * @throw Query::ErrorException on error */ std::string getString(int row, const std::string &column); /** * Tells how many rows has been fetched. * * @return the number of rows */ virtual int countRows(void) = 0; /** * Tells how many number of columns are present for each * row. * * @return the number of columns */ virtual int countColumns(void) = 0; /** * Tells if the column is null or not. * * @param row the row number * @param column the column * @return an true if null */ virtual bool isNull(int row, const std::string &column) = 0; /** * Dump all rows and columns. */ virtual void dump(void) = 0; }; class Driver { protected: std::string m_error; public: typedef std::map<std::string, std::string> Params; Driver(); virtual ~Driver(); /** * Get the error. * * @return the error */ const std::string & getError() const; /** * Create a synchronous connection, it waits and block until * the connection is made up to a specified timeout max. * * @param params a list of parameters. */ virtual bool connect(const Params ¶ms) = 0; /** * Execute a query. * * @param query the SQL command * @return a result * @throw Query::Exception on failure */ virtual std::unique_ptr<Query> query(const std::string &command) = 0; /** * Get the driver connection description. * * @return the description */ virtual std::string description() const = 0; }; #endif // !_DRIVER_H_