mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-22 21:40:05 +00:00
Merge pull request #141 from CakeLancelot/orm-update
Update sqlite_orm to 1.6
This commit is contained in:
commit
2302c28ac5
@ -236,8 +236,8 @@ namespace sqlite_orm {
|
|||||||
template<size_t N, size_t I, class L, class R>
|
template<size_t N, size_t I, class L, class R>
|
||||||
void move_tuple_impl(L &lhs, R &rhs) {
|
void move_tuple_impl(L &lhs, R &rhs) {
|
||||||
std::get<I>(lhs) = std::move(std::get<I>(rhs));
|
std::get<I>(lhs) = std::move(std::get<I>(rhs));
|
||||||
internal::static_if<std::integral_constant<bool, N != I + 1>{}>([](auto &lhs, auto &rhs) {
|
internal::static_if<std::integral_constant<bool, N != I + 1>{}>([](auto &l, auto &r) {
|
||||||
move_tuple_impl<N, I + 1>(lhs, rhs);
|
move_tuple_impl<N, I + 1>(l, r);
|
||||||
})(lhs, rhs);
|
})(lhs, rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,8 +247,8 @@ namespace sqlite_orm {
|
|||||||
template<size_t N, class L, class R>
|
template<size_t N, class L, class R>
|
||||||
void move_tuple(L &lhs, R &rhs) {
|
void move_tuple(L &lhs, R &rhs) {
|
||||||
using bool_type = std::integral_constant<bool, N != 0>;
|
using bool_type = std::integral_constant<bool, N != 0>;
|
||||||
static_if<bool_type{}>([](auto &lhs, auto &rhs) {
|
static_if<bool_type{}>([](auto &l, auto &r) {
|
||||||
tuple_helper::move_tuple_impl<N, 0>(lhs, rhs);
|
tuple_helper::move_tuple_impl<N, 0>(l, r);
|
||||||
})(lhs, rhs);
|
})(lhs, rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -577,8 +577,8 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
const foreign_key_type &fk;
|
const foreign_key_type &fk;
|
||||||
|
|
||||||
on_update_delete_t(decltype(fk) fk_, decltype(update) update, foreign_key_action action_) :
|
on_update_delete_t(decltype(fk) fk_, decltype(update) update_, foreign_key_action action_) :
|
||||||
on_update_delete_base{update}, fk(fk_), _action(action_) {}
|
on_update_delete_base{update_}, fk(fk_), _action(action_) {}
|
||||||
|
|
||||||
foreign_key_action _action = foreign_key_action::none;
|
foreign_key_action _action = foreign_key_action::none;
|
||||||
|
|
||||||
@ -691,8 +691,8 @@ namespace sqlite_orm {
|
|||||||
foreign_key_intermediate_t(tuple_type columns_) : columns(std::move(columns_)) {}
|
foreign_key_intermediate_t(tuple_type columns_) : columns(std::move(columns_)) {}
|
||||||
|
|
||||||
template<class... Rs>
|
template<class... Rs>
|
||||||
foreign_key_t<std::tuple<Cs...>, std::tuple<Rs...>> references(Rs... references) {
|
foreign_key_t<std::tuple<Cs...>, std::tuple<Rs...>> references(Rs... refs) {
|
||||||
return {std::move(this->columns), std::make_tuple(std::forward<Rs>(references)...)};
|
return {std::move(this->columns), std::make_tuple(std::forward<Rs>(refs)...)};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -1544,12 +1544,12 @@ namespace sqlite_orm {
|
|||||||
*/
|
*/
|
||||||
constraints_type constraints;
|
constraints_type constraints;
|
||||||
|
|
||||||
column_t(std::string name,
|
column_t(std::string name_,
|
||||||
member_pointer_t member_pointer_,
|
member_pointer_t member_pointer_,
|
||||||
getter_type getter_,
|
getter_type getter_,
|
||||||
setter_type setter_,
|
setter_type setter_,
|
||||||
constraints_type constraints_) :
|
constraints_type constraints_) :
|
||||||
column_base{std::move(name)},
|
column_base{std::move(name_)},
|
||||||
member_pointer(member_pointer_), getter(getter_), setter(setter_), constraints(move(constraints_)) {}
|
member_pointer(member_pointer_), getter(getter_), setter(setter_), constraints(move(constraints_)) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1922,7 +1922,7 @@ namespace sqlite_orm {
|
|||||||
T expr;
|
T expr;
|
||||||
internal::collate_argument argument;
|
internal::collate_argument argument;
|
||||||
|
|
||||||
collate_t(T expr_, internal::collate_argument argument_) : expr(expr_), argument(argument_) {}
|
collate_t(T expr_, internal::collate_argument argument_) : expr(std::move(expr_)), argument(argument_) {}
|
||||||
|
|
||||||
operator std::string() const {
|
operator std::string() const {
|
||||||
return constraints::collate_t{this->argument};
|
return constraints::collate_t{this->argument};
|
||||||
@ -2205,7 +2205,7 @@ namespace sqlite_orm {
|
|||||||
L l; // left expression
|
L l; // left expression
|
||||||
A arg; // in arg
|
A arg; // in arg
|
||||||
|
|
||||||
in_t(L l_, A arg_, bool negative) : in_base{negative}, l(l_), arg(std::move(arg_)) {}
|
in_t(L l_, A arg_, bool negative_) : in_base{negative_}, l(l_), arg(std::move(arg_)) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct is_null_string {
|
struct is_null_string {
|
||||||
@ -2344,8 +2344,8 @@ namespace sqlite_orm {
|
|||||||
struct dynamic_order_by_entry_t : order_by_base {
|
struct dynamic_order_by_entry_t : order_by_base {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
dynamic_order_by_entry_t(decltype(name) name_, int asc_desc, std::string collate_argument) :
|
dynamic_order_by_entry_t(decltype(name) name_, int asc_desc_, std::string collate_argument_) :
|
||||||
order_by_base{asc_desc, move(collate_argument)}, name(move(name_)) {}
|
order_by_base{asc_desc_, move(collate_argument_)}, name(move(name_)) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2463,8 +2463,8 @@ namespace sqlite_orm {
|
|||||||
sqlite_orm::internal::optional_container<escape_t>
|
sqlite_orm::internal::optional_container<escape_t>
|
||||||
arg3; // not escape cause escape exists as a function here
|
arg3; // not escape cause escape exists as a function here
|
||||||
|
|
||||||
like_t(arg_t arg_, pattern_t pattern_, sqlite_orm::internal::optional_container<escape_t> escape) :
|
like_t(arg_t arg_, pattern_t pattern_, sqlite_orm::internal::optional_container<escape_t> escape_) :
|
||||||
arg(std::move(arg_)), pattern(std::move(pattern_)), arg3(std::move(escape)) {}
|
arg(std::move(arg_)), pattern(std::move(pattern_)), arg3(std::move(escape_)) {}
|
||||||
|
|
||||||
template<class C>
|
template<class C>
|
||||||
like_t<A, T, C> escape(C c) const {
|
like_t<A, T, C> escape(C c) const {
|
||||||
@ -4332,8 +4332,8 @@ namespace sqlite_orm {
|
|||||||
using left_type = typename compound_operator<L, R>::left_type;
|
using left_type = typename compound_operator<L, R>::left_type;
|
||||||
using right_type = typename compound_operator<L, R>::right_type;
|
using right_type = typename compound_operator<L, R>::right_type;
|
||||||
|
|
||||||
union_t(left_type l, right_type r, decltype(all) all) :
|
union_t(left_type l, right_type r, decltype(all) all_) :
|
||||||
compound_operator<L, R>(std::move(l), std::move(r)), union_base{all} {}
|
compound_operator<L, R>(std::move(l), std::move(r)), union_base{all_} {}
|
||||||
|
|
||||||
union_t(left_type l, right_type r) : union_t(std::move(l), std::move(r), false) {}
|
union_t(left_type l, right_type r) : union_t(std::move(l), std::move(r), false) {}
|
||||||
};
|
};
|
||||||
@ -4979,14 +4979,14 @@ namespace sqlite_orm {
|
|||||||
std::transform(str.begin(), str.end(), std::back_inserter(upper_str), [](char c) {
|
std::transform(str.begin(), str.end(), std::back_inserter(upper_str), [](char c) {
|
||||||
return static_cast<char>(std::toupper(static_cast<int>(c)));
|
return static_cast<char>(std::toupper(static_cast<int>(c)));
|
||||||
});
|
});
|
||||||
static std::array<journal_mode, 6> all = {
|
static std::array<journal_mode, 6> all = {{
|
||||||
journal_mode::DELETE,
|
journal_mode::DELETE,
|
||||||
journal_mode::TRUNCATE,
|
journal_mode::TRUNCATE,
|
||||||
journal_mode::PERSIST,
|
journal_mode::PERSIST,
|
||||||
journal_mode::MEMORY,
|
journal_mode::MEMORY,
|
||||||
journal_mode::WAL,
|
journal_mode::WAL,
|
||||||
journal_mode::OFF,
|
journal_mode::OFF,
|
||||||
};
|
}};
|
||||||
for(auto j: all) {
|
for(auto j: all) {
|
||||||
if(to_string(j) == upper_str) {
|
if(to_string(j) == upper_str) {
|
||||||
return std::make_unique<journal_mode>(j);
|
return std::make_unique<journal_mode>(j);
|
||||||
@ -5400,8 +5400,8 @@ namespace sqlite_orm {
|
|||||||
using columns_type = std::tuple<Cols...>;
|
using columns_type = std::tuple<Cols...>;
|
||||||
using object_type = void;
|
using object_type = void;
|
||||||
|
|
||||||
index_t(std::string name, bool unique, columns_type columns_) :
|
index_t(std::string name_, bool unique_, columns_type columns_) :
|
||||||
index_base{move(name), unique}, columns(move(columns_)) {}
|
index_base{move(name_), unique_}, columns(move(columns_)) {}
|
||||||
|
|
||||||
columns_type columns;
|
columns_type columns;
|
||||||
};
|
};
|
||||||
@ -5990,22 +5990,22 @@ namespace sqlite_orm {
|
|||||||
// Make static_if have at least one input as a workaround for GCC bug:
|
// Make static_if have at least one input as a workaround for GCC bug:
|
||||||
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64095
|
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64095
|
||||||
if(!res) {
|
if(!res) {
|
||||||
static_if<std::is_same<C, member_pointer_t>{}>([&res, &obj, &col](const C &c) {
|
static_if<std::is_same<C, member_pointer_t>{}>([&res, &obj, &col](const C &c_) {
|
||||||
if(compare_any(col.member_pointer, c)) {
|
if(compare_any(col.member_pointer, c_)) {
|
||||||
res = &(obj.*col.member_pointer);
|
res = &(obj.*col.member_pointer);
|
||||||
}
|
}
|
||||||
})(c);
|
})(c);
|
||||||
}
|
}
|
||||||
if(!res) {
|
if(!res) {
|
||||||
static_if<std::is_same<C, getter_type>{}>([&res, &obj, &col](const C &c) {
|
static_if<std::is_same<C, getter_type>{}>([&res, &obj, &col](const C &c_) {
|
||||||
if(compare_any(col.getter, c)) {
|
if(compare_any(col.getter, c_)) {
|
||||||
res = &((obj).*(col.getter))();
|
res = &((obj).*(col.getter))();
|
||||||
}
|
}
|
||||||
})(c);
|
})(c);
|
||||||
}
|
}
|
||||||
if(!res) {
|
if(!res) {
|
||||||
static_if<std::is_same<C, setter_type>{}>([&res, &obj, &col](const C &c) {
|
static_if<std::is_same<C, setter_type>{}>([&res, &obj, &col](const C &c_) {
|
||||||
if(compare_any(col.setter, c)) {
|
if(compare_any(col.setter, c_)) {
|
||||||
res = &((obj).*(col.getter))();
|
res = &((obj).*(col.getter))();
|
||||||
}
|
}
|
||||||
})(c);
|
})(c);
|
||||||
@ -6271,7 +6271,7 @@ namespace sqlite_orm {
|
|||||||
struct storage_impl_base {
|
struct storage_impl_base {
|
||||||
|
|
||||||
bool table_exists(const std::string &tableName, sqlite3 *db) const {
|
bool table_exists(const std::string &tableName, sqlite3 *db) const {
|
||||||
auto res = false;
|
auto result = false;
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "SELECT COUNT(*) FROM sqlite_master WHERE type = '"
|
ss << "SELECT COUNT(*) FROM sqlite_master WHERE type = '"
|
||||||
<< "table"
|
<< "table"
|
||||||
@ -6287,13 +6287,13 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
&res,
|
&result,
|
||||||
nullptr);
|
nullptr);
|
||||||
if(rc != SQLITE_OK) {
|
if(rc != SQLITE_OK) {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
}
|
}
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rename_table(sqlite3 *db, const std::string &oldName, const std::string &newName) const {
|
void rename_table(sqlite3 *db, const std::string &oldName, const std::string &newName) const {
|
||||||
@ -6355,7 +6355,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<table_info> get_table_info(const std::string &tableName, sqlite3 *db) const {
|
std::vector<table_info> get_table_info(const std::string &tableName, sqlite3 *db) const {
|
||||||
std::vector<table_info> res;
|
std::vector<table_info> result;
|
||||||
auto query = "PRAGMA table_info('" + tableName + "')";
|
auto query = "PRAGMA table_info('" + tableName + "')";
|
||||||
auto rc = sqlite3_exec(
|
auto rc = sqlite3_exec(
|
||||||
db,
|
db,
|
||||||
@ -6375,13 +6375,13 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
&res,
|
&result,
|
||||||
nullptr);
|
nullptr);
|
||||||
if(rc != SQLITE_OK) {
|
if(rc != SQLITE_OK) {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
}
|
}
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -7184,8 +7184,8 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
expression_type t;
|
expression_type t;
|
||||||
|
|
||||||
prepared_statement_t(T t_, sqlite3_stmt *stmt, connection_ref con_) :
|
prepared_statement_t(T t_, sqlite3_stmt *stmt_, connection_ref con_) :
|
||||||
prepared_statement_base{stmt, std::move(con_)}, t(std::move(t_)) {}
|
prepared_statement_base{stmt_, std::move(con_)}, t(std::move(t_)) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -7973,8 +7973,8 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
template<class L>
|
template<class L>
|
||||||
void operator()(const node_type &c, const L &l) const {
|
void operator()(const node_type &c, const L &l) const {
|
||||||
c.case_expression.apply([&l](auto &c) {
|
c.case_expression.apply([&l](auto &c_) {
|
||||||
iterate_ast(c, l);
|
iterate_ast(c_, l);
|
||||||
});
|
});
|
||||||
iterate_tuple(c.args, [&l](auto &pair) {
|
iterate_tuple(c.args, [&l](auto &pair) {
|
||||||
iterate_ast(pair.first, l);
|
iterate_ast(pair.first, l);
|
||||||
@ -8082,6 +8082,16 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
struct ast_iterator<collate_t<T>, void> {
|
||||||
|
using node_type = collate_t<T>;
|
||||||
|
|
||||||
|
template<class L>
|
||||||
|
void operator()(const node_type &node, const L &l) const {
|
||||||
|
iterate_ast(node.expr, l);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8189,6 +8199,14 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
pragma_t(get_connection_t get_connection_) : get_connection(std::move(get_connection_)) {}
|
pragma_t(get_connection_t get_connection_) : get_connection(std::move(get_connection_)) {}
|
||||||
|
|
||||||
|
void busy_timeout(int value) {
|
||||||
|
this->set_pragma("busy_timeout", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int busy_timeout() {
|
||||||
|
return this->get_pragma<int>("busy_timeout");
|
||||||
|
}
|
||||||
|
|
||||||
sqlite_orm::journal_mode journal_mode() {
|
sqlite_orm::journal_mode journal_mode() {
|
||||||
return this->get_pragma<sqlite_orm::journal_mode>("journal_mode");
|
return this->get_pragma<sqlite_orm::journal_mode>("journal_mode");
|
||||||
}
|
}
|
||||||
@ -8237,7 +8255,7 @@ namespace sqlite_orm {
|
|||||||
T get_pragma(const std::string &name) {
|
T get_pragma(const std::string &name) {
|
||||||
auto connection = this->get_connection();
|
auto connection = this->get_connection();
|
||||||
auto query = "PRAGMA " + name;
|
auto query = "PRAGMA " + name;
|
||||||
T res;
|
T result;
|
||||||
auto db = connection.get();
|
auto db = connection.get();
|
||||||
auto rc = sqlite3_exec(
|
auto rc = sqlite3_exec(
|
||||||
db,
|
db,
|
||||||
@ -8249,10 +8267,10 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
&res,
|
&result,
|
||||||
nullptr);
|
nullptr);
|
||||||
if(rc == SQLITE_OK) {
|
if(rc == SQLITE_OK) {
|
||||||
return res;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -8700,13 +8718,11 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
bool transaction(const std::function<bool()> &f) {
|
bool transaction(const std::function<bool()> &f) {
|
||||||
this->begin_transaction();
|
this->begin_transaction();
|
||||||
auto con = this->get_connection();
|
|
||||||
auto db = con.get();
|
|
||||||
auto shouldCommit = f();
|
auto shouldCommit = f();
|
||||||
if(shouldCommit) {
|
if(shouldCommit) {
|
||||||
this->commit(db);
|
this->commit();
|
||||||
} else {
|
} else {
|
||||||
this->rollback(db);
|
this->rollback();
|
||||||
}
|
}
|
||||||
return shouldCommit;
|
return shouldCommit;
|
||||||
}
|
}
|
||||||
@ -8744,10 +8760,10 @@ namespace sqlite_orm {
|
|||||||
db,
|
db,
|
||||||
sql.c_str(),
|
sql.c_str(),
|
||||||
[](void *data, int argc, char **argv, char * * /*columnName*/) -> int {
|
[](void *data, int argc, char **argv, char * * /*columnName*/) -> int {
|
||||||
auto &tableNames = *(data_t *)data;
|
auto &tableNames_ = *(data_t *)data;
|
||||||
for(int i = 0; i < argc; i++) {
|
for(int i = 0; i < argc; i++) {
|
||||||
if(argv[i]) {
|
if(argv[i]) {
|
||||||
tableNames.push_back(argv[i]);
|
tableNames_.push_back(argv[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -8863,6 +8879,27 @@ namespace sqlite_orm {
|
|||||||
return this->connection->filename;
|
return this->connection->filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether connection to database is opened right now.
|
||||||
|
* Returns always `true` for in memory databases.
|
||||||
|
*/
|
||||||
|
bool is_opened() const {
|
||||||
|
return this->connection->retain_count() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int busy_handler(std::function<int(int)> handler) {
|
||||||
|
_busy_handler = move(handler);
|
||||||
|
if(this->is_opened()) {
|
||||||
|
if(_busy_handler) {
|
||||||
|
return sqlite3_busy_handler(this->connection->get(), busy_handler_callback, this);
|
||||||
|
} else {
|
||||||
|
return sqlite3_busy_handler(this->connection->get(), nullptr, nullptr);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
storage_base(const std::string &filename_, int foreignKeysCount) :
|
storage_base(const std::string &filename_, int foreignKeysCount) :
|
||||||
pragma(std::bind(&storage_base::get_connection, this)),
|
pragma(std::bind(&storage_base::get_connection, this)),
|
||||||
@ -8900,6 +8937,7 @@ namespace sqlite_orm {
|
|||||||
std::unique_ptr<connection_holder> connection;
|
std::unique_ptr<connection_holder> connection;
|
||||||
std::map<std::string, collating_function> collatingFunctions;
|
std::map<std::string, collating_function> collatingFunctions;
|
||||||
const int cachedForeignKeysCount;
|
const int cachedForeignKeysCount;
|
||||||
|
std::function<int(int)> _busy_handler;
|
||||||
|
|
||||||
connection_ref get_connection() {
|
connection_ref get_connection() {
|
||||||
connection_ref res{*this->connection};
|
connection_ref res{*this->connection};
|
||||||
@ -8924,7 +8962,7 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
bool foreign_keys(sqlite3 *db) {
|
bool foreign_keys(sqlite3 *db) {
|
||||||
std::string query = "PRAGMA foreign_keys";
|
std::string query = "PRAGMA foreign_keys";
|
||||||
auto res = false;
|
auto result = false;
|
||||||
auto rc = sqlite3_exec(
|
auto rc = sqlite3_exec(
|
||||||
db,
|
db,
|
||||||
query.c_str(),
|
query.c_str(),
|
||||||
@ -8935,13 +8973,13 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
&res,
|
&result,
|
||||||
nullptr);
|
nullptr);
|
||||||
if(rc != SQLITE_OK) {
|
if(rc != SQLITE_OK) {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
}
|
}
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -8972,6 +9010,10 @@ namespace sqlite_orm {
|
|||||||
sqlite3_limit(db, p.first, p.second);
|
sqlite3_limit(db, p.first, p.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_busy_handler) {
|
||||||
|
sqlite3_busy_handler(this->connection->get(), busy_handler_callback, this);
|
||||||
|
}
|
||||||
|
|
||||||
if(this->on_open) {
|
if(this->on_open) {
|
||||||
this->on_open(db);
|
this->on_open(db);
|
||||||
}
|
}
|
||||||
@ -9035,7 +9077,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string current_timestamp(sqlite3 *db) {
|
std::string current_timestamp(sqlite3 *db) {
|
||||||
std::string res;
|
std::string result;
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "SELECT CURRENT_TIMESTAMP";
|
ss << "SELECT CURRENT_TIMESTAMP";
|
||||||
auto query = ss.str();
|
auto query = ss.str();
|
||||||
@ -9051,13 +9093,13 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
&res,
|
&result,
|
||||||
nullptr);
|
nullptr);
|
||||||
if(rc != SQLITE_OK) {
|
if(rc != SQLITE_OK) {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
}
|
}
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void drop_table_internal(const std::string &tableName, sqlite3 *db) {
|
void drop_table_internal(const std::string &tableName, sqlite3 *db) {
|
||||||
@ -9087,6 +9129,15 @@ namespace sqlite_orm {
|
|||||||
return f(leftLen, lhs, rightLen, rhs);
|
return f(leftLen, lhs, rightLen, rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int busy_handler_callback(void *selfPointer, int triesCount) {
|
||||||
|
auto &storage = *static_cast<storage_base *>(selfPointer);
|
||||||
|
if(storage._busy_handler) {
|
||||||
|
return storage._busy_handler(triesCount);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// returns foreign keys count in storage definition
|
// returns foreign keys count in storage definition
|
||||||
template<class T>
|
template<class T>
|
||||||
static int foreign_keys_count(T &storageImpl) {
|
static int foreign_keys_count(T &storageImpl) {
|
||||||
@ -9859,8 +9910,8 @@ namespace sqlite_orm {
|
|||||||
std::string operator()(const statement_type &c, const C &context) const {
|
std::string operator()(const statement_type &c, const C &context) const {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "CASE ";
|
ss << "CASE ";
|
||||||
c.case_expression.apply([&ss, context](auto &c) {
|
c.case_expression.apply([&ss, context](auto &c_) {
|
||||||
ss << serialize(c, context) << " ";
|
ss << serialize(c_, context) << " ";
|
||||||
});
|
});
|
||||||
iterate_tuple(c.args, [&ss, context](auto &pair) {
|
iterate_tuple(c.args, [&ss, context](auto &pair) {
|
||||||
ss << "WHEN " << serialize(pair.first, context) << " ";
|
ss << "WHEN " << serialize(pair.first, context) << " ";
|
||||||
@ -10545,17 +10596,17 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
ss << "VALUES ";
|
ss << "VALUES ";
|
||||||
auto valuesString = [columnNamesCount] {
|
auto valuesString = [columnNamesCount] {
|
||||||
std::stringstream ss;
|
std::stringstream ss_;
|
||||||
ss << "(";
|
ss_ << "(";
|
||||||
for(size_t i = 0; i < columnNamesCount; ++i) {
|
for(size_t i = 0; i < columnNamesCount; ++i) {
|
||||||
ss << "?";
|
ss_ << "?";
|
||||||
if(i < columnNamesCount - 1) {
|
if(i < columnNamesCount - 1) {
|
||||||
ss << ", ";
|
ss_ << ", ";
|
||||||
} else {
|
} else {
|
||||||
ss << ")";
|
ss_ << ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ss.str();
|
return ss_.str();
|
||||||
}();
|
}();
|
||||||
auto valuesCount = static_cast<int>(std::distance(rep.range.first, rep.range.second));
|
auto valuesCount = static_cast<int>(std::distance(rep.range.first, rep.range.second));
|
||||||
for(auto i = 0; i < valuesCount; ++i) {
|
for(auto i = 0; i < valuesCount; ++i) {
|
||||||
@ -10600,17 +10651,17 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
ss << "VALUES ";
|
ss << "VALUES ";
|
||||||
auto valuesString = [columnNamesCount] {
|
auto valuesString = [columnNamesCount] {
|
||||||
std::stringstream ss;
|
std::stringstream ss_;
|
||||||
ss << "(";
|
ss_ << "(";
|
||||||
for(size_t i = 0; i < columnNamesCount; ++i) {
|
for(size_t i = 0; i < columnNamesCount; ++i) {
|
||||||
ss << "?";
|
ss_ << "?";
|
||||||
if(i < columnNamesCount - 1) {
|
if(i < columnNamesCount - 1) {
|
||||||
ss << ", ";
|
ss_ << ", ";
|
||||||
} else {
|
} else {
|
||||||
ss << ")";
|
ss_ << ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ss.str();
|
return ss_.str();
|
||||||
}();
|
}();
|
||||||
auto valuesCount = static_cast<int>(std::distance(statement.range.first, statement.range.second));
|
auto valuesCount = static_cast<int>(std::distance(statement.range.first, statement.range.second));
|
||||||
for(auto i = 0; i < valuesCount; ++i) {
|
for(auto i = 0; i < valuesCount; ++i) {
|
||||||
@ -11980,7 +12031,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class... Args>
|
template<class T, class... Args>
|
||||||
prepared_statement_t<get_all_t<T, Args...>> prepare(get_all_t<T, Args...> get) {
|
prepared_statement_t<get_all_t<T, Args...>> prepare(get_all_t<T, Args...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -11988,9 +12039,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -11998,7 +12049,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class... Args>
|
template<class T, class... Args>
|
||||||
prepared_statement_t<get_all_pointer_t<T, Args...>> prepare(get_all_pointer_t<T, Args...> get) {
|
prepared_statement_t<get_all_pointer_t<T, Args...>> prepare(get_all_pointer_t<T, Args...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -12006,9 +12057,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -12017,7 +12068,7 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
#ifdef SQLITE_ORM_OPTIONAL_SUPPORTED
|
#ifdef SQLITE_ORM_OPTIONAL_SUPPORTED
|
||||||
template<class T, class R, class... Args>
|
template<class T, class R, class... Args>
|
||||||
prepared_statement_t<get_all_optional_t<T, R, Args...>> prepare(get_all_optional_t<T, R, Args...> get) {
|
prepared_statement_t<get_all_optional_t<T, R, Args...>> prepare(get_all_optional_t<T, R, Args...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -12025,9 +12076,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -12073,7 +12124,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class... Ids>
|
template<class T, class... Ids>
|
||||||
prepared_statement_t<get_t<T, Ids...>> prepare(get_t<T, Ids...> get) {
|
prepared_statement_t<get_t<T, Ids...>> prepare(get_t<T, Ids...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -12081,9 +12132,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -12091,7 +12142,7 @@ namespace sqlite_orm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class... Ids>
|
template<class T, class... Ids>
|
||||||
prepared_statement_t<get_pointer_t<T, Ids...>> prepare(get_pointer_t<T, Ids...> get) {
|
prepared_statement_t<get_pointer_t<T, Ids...>> prepare(get_pointer_t<T, Ids...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -12099,9 +12150,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -12110,7 +12161,7 @@ namespace sqlite_orm {
|
|||||||
|
|
||||||
#ifdef SQLITE_ORM_OPTIONAL_SUPPORTED
|
#ifdef SQLITE_ORM_OPTIONAL_SUPPORTED
|
||||||
template<class T, class... Ids>
|
template<class T, class... Ids>
|
||||||
prepared_statement_t<get_optional_t<T, Ids...>> prepare(get_optional_t<T, Ids...> get) {
|
prepared_statement_t<get_optional_t<T, Ids...>> prepare(get_optional_t<T, Ids...> get_) {
|
||||||
auto con = this->get_connection();
|
auto con = this->get_connection();
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto db = con.get();
|
auto db = con.get();
|
||||||
@ -12118,9 +12169,9 @@ namespace sqlite_orm {
|
|||||||
context_t context{this->impl};
|
context_t context{this->impl};
|
||||||
context.skip_table_name = false;
|
context.skip_table_name = false;
|
||||||
context.replace_bindable_with_question = true;
|
context.replace_bindable_with_question = true;
|
||||||
auto query = serialize(get, context);
|
auto query = serialize(get_, context);
|
||||||
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
if(sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
|
||||||
return {std::move(get), stmt, con};
|
return {std::move(get_), stmt, con};
|
||||||
} else {
|
} else {
|
||||||
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
throw std::system_error(std::error_code(sqlite3_errcode(db), get_sqlite_error_category()),
|
||||||
sqlite3_errmsg(db));
|
sqlite3_errmsg(db));
|
||||||
@ -13315,8 +13366,8 @@ namespace sqlite_orm {
|
|||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
if(index == N) {
|
if(index == N) {
|
||||||
internal::static_if<std::is_same<result_tupe, node_type>{}>([](auto &result, auto &node) {
|
internal::static_if<std::is_same<result_tupe, node_type>{}>([](auto &r, auto &n) {
|
||||||
result = const_cast<typename std::remove_reference<decltype(result)>::type>(&node);
|
r = const_cast<typename std::remove_reference<decltype(r)>::type>(&n);
|
||||||
})(result, node);
|
})(result, node);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -13338,8 +13389,8 @@ namespace sqlite_orm {
|
|||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
if(index == N) {
|
if(index == N) {
|
||||||
internal::static_if<std::is_same<result_tupe, node_type>{}>([](auto &result, auto &node) {
|
internal::static_if<std::is_same<result_tupe, node_type>{}>([](auto &r, auto &n) {
|
||||||
result = const_cast<typename std::remove_reference<decltype(result)>::type>(&node);
|
r = const_cast<typename std::remove_reference<decltype(r)>::type>(&n);
|
||||||
})(result, node);
|
})(result, node);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user