190 lines
4.8 KiB
C++
190 lines
4.8 KiB
C++
// 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_
|
|
|