// Copyright (C) 2011  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#undef DLIB_SQLiTE_TOOLS_ABSTRACT_H_
#ifdef DLIB_SQLiTE_TOOLS_ABSTRACT_H_


#include "sqlite_abstract.h"

// ----------------------------------------------------------------------------------------

namespace dlib
{

    class transaction : noncopyable
    {
        /*!
            WHAT THIS OBJECT REPRESENTS
                This object is a tool for creating exception safe
                database transactions.
        !*/

    public:
        transaction (
            database& db
        );
        /*!
            ensures
                - Begins a database transaction which will be rolled back
                  if commit() isn't called eventually.
                - In particular, performs: db.exec("begin transaction");
        !*/

        void commit (
        );
        /*!
            ensures
                - if (commit() hasn't already been called) then
                    - Commits all changes made during this database transaction.
                    - In particular, performs: db.exec("commit");
                - else
                    - does nothing
        !*/

        ~transaction(
        );
        /*!
            ensures
                - if (commit() was never called) then
                    - rolls back any changes made to the database during this transaction.
                    - In particular, performs: db.exec("rollback");
                - else
                    - does nothing
        !*/

    };

// ----------------------------------------------------------------------------------------

    template <
        typename T
        >
    void query_object (
        database& db,
        const std::string& query,
        T& item
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              interpreted as a binary BLOB and deserialized into item.
        throws
            - sqlite_error or serialization_error if an error occurs which prevents
              this operation from succeeding.

    !*/

// ----------------------------------------------------------------------------------------

    std::string query_text (
        database& db,
        const std::string& query
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              converted to text and returned.
        throws
            - sqlite_error if an error occurs which prevents this operation from 
              succeeding.
    !*/

// ----------------------------------------------------------------------------------------

    double query_double (
        database& db,
        const std::string& query
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              converted to a double and returned.
        throws
            - sqlite_error if an error occurs which prevents this operation from 
              succeeding.
    !*/

// ----------------------------------------------------------------------------------------

    int query_int (
        database& db,
        const std::string& query
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              converted to an int and returned.
        throws
            - sqlite_error if an error occurs which prevents this operation from 
              succeeding.
    !*/

// ----------------------------------------------------------------------------------------

    int64 query_int64 (
        database& db,
        const std::string& query
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              converted to an int64 and returned.
        throws
            - sqlite_error if an error occurs which prevents this operation from 
              succeeding.
    !*/

// ----------------------------------------------------------------------------------------

    const std::vector<char> query_blob (
        database& db,
        const std::string& query
    );
    /*!
        ensures
            - executes the given SQL query against db.  If the query results in a 
              single row and column being returned then the data in the column is 
              returned as a binary BLOB.
        throws
            - sqlite_error if an error occurs which prevents this operation from 
              succeeding.
    !*/

// ----------------------------------------------------------------------------------------

}

#endif // DLIB_SQLiTE_TOOLS_H_