dlib C++ Library - sqlite_tools.h

// Copyright (C) 2011 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_SQLiTE_TOOLS_H_
#define DLIB_SQLiTE_TOOLS_H_
#include "sqlite_tools_abstract.h"
#include "sqlite.h"
// ----------------------------------------------------------------------------------------
namespace dlib
{
 class transaction : noncopyable
 {
 public:
 transaction (
 database& db_
 ) :
 db(db_),
 committed(false)
 {
 db.exec("begin transaction");
 }
 void commit ()
 {
 if (!committed)
 {
 committed = true;
 db.exec("commit");
 }
 }
 ~transaction() noexcept(false)
 {
 if (!committed)
 db.exec("rollback");
 }
 private:
 database& db;
 bool committed;
 };
// ----------------------------------------------------------------------------------------
 template <
 typename T
 >
 void query_object (
 database& db,
 const std::string& query,
 T& item
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 st.get_column_as_object(0,item);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
 inline std::string query_text (
 database& db,
 const std::string& query
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 const std::string& temp = st.get_column_as_text(0);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 return temp;
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
 inline double query_double (
 database& db,
 const std::string& query
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 double temp = st.get_column_as_double(0);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 return temp;
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
 inline int query_int (
 database& db,
 const std::string& query
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 int temp = st.get_column_as_int(0);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 return temp;
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
 inline int64 query_int64 (
 database& db,
 const std::string& query
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 int64 temp = st.get_column_as_int64(0);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 return temp;
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
 inline const std::vector<char> query_blob (
 database& db,
 const std::string& query
 )
 {
 statement st(db, query);
 st.exec();
 if (st.move_next() && st.get_num_columns() == 1)
 {
 const std::vector<char>& temp = st.get_column_as_blob(0);
 if (st.move_next())
 throw sqlite_error("query doesn't result in exactly 1 element");
 return temp;
 }
 else
 {
 throw sqlite_error("query doesn't result in exactly 1 element");
 }
 }
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_SQLiTE_TOOLS_H_

AltStyle によって変換されたページ (->オリジナル) /