Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add get insert id after insert #132

Merged
merged 6 commits into from
Dec 14, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions include/dbng.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,23 @@ class dbng {
}

template <typename T, typename... Args>
int insert(const T &t, bool get_insert_id = false, Args &&...args) {
return db_.insert(t, get_insert_id, std::forward<Args>(args)...);
int insert(const T &t, Args &&...args) {
return db_.insert(t, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int insert(const std::vector<T> &t, bool get_insert_id = false,
Args &&...args) {
return db_.insert(t, get_insert_id, std::forward<Args>(args)...);
int insert(const std::vector<T> &v, Args &&...args) {
return db_.insert(v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const T &t, Args &&...args) {
return db_.replace(t, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const std::vector<T> &v, Args &&...args) {
return db_.replace(v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
Expand All @@ -50,18 +59,18 @@ class dbng {
}

template <typename T, typename... Args>
int update(const std::vector<T> &t, Args &&...args) {
return db_.update(t, std::forward<Args>(args)...);
int update(const std::vector<T> &v, Args &&...args) {
return db_.update(v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const T &t, Args &&...args) {
return db_.replace(t, std::forward<Args>(args)...);
uint64_t get_insert_id_after_insert(const T &t, Args &&...args) {
return db_.get_insert_id_after_insert(t, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const std::vector<T> &t, Args &&...args) {
return db_.replace(t, std::forward<Args>(args)...);
uint64_t get_insert_id_after_insert(const std::vector<T> &v, Args &&...args) {
return db_.get_insert_id_after_insert(v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
Expand Down
86 changes: 54 additions & 32 deletions include/mysql.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,26 +99,23 @@ class mysql {
}

template <typename T, typename... Args>
int insert(const T &t, bool get_insert_id = false, Args &&...args) {
return insert_impl(OptType::insert, t, get_insert_id,
std::forward<Args>(args)...);
int insert(const T &t, Args &&...args) {
return insert_impl(OptType::insert, t, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int insert(const std::vector<T> &t, bool get_insert_id = false,
Args &&...args) {
return insert_impl(OptType::insert, t, get_insert_id,
std::forward<Args>(args)...);
int insert(const std::vector<T> &v, Args &&...args) {
return insert_impl(OptType::insert, v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const T &t, Args &&...args) {
return insert_impl(OptType::replace, t, false, std::forward<Args>(args)...);
return insert_impl(OptType::replace, t, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int replace(const std::vector<T> &t, Args &&...args) {
return insert_impl(OptType::replace, t, false, std::forward<Args>(args)...);
int replace(const std::vector<T> &v, Args &&...args) {
return insert_impl(OptType::replace, v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
Expand All @@ -127,8 +124,24 @@ class mysql {
}

template <typename T, typename... Args>
int update(const std::vector<T> &t, Args &&...args) {
return update_impl(t, std::forward<Args>(args)...);
int update(const std::vector<T> &v, Args &&...args) {
return update_impl(v, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
uint64_t get_insert_id_after_insert(const T &t, Args &&...args) {
std::optional<uint64_t> insert_id = {0};
insert_or_update_impl(t, generate_insert_sql<T>(true), OptType::insert,
std::move(insert_id));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改成

insert_or_update_impl(t, generate_insert_sql<T>(true), OptType::insert, 0);

数字可以直接赋值给optional的

return insert_id.value();
}

template <typename T, typename... Args>
uint64_t get_insert_id_after_insert(const std::vector<T> &v, Args &&...args) {
std::optional<uint64_t> insert_id = {0};
insert_or_update_impl(v, generate_insert_sql<T>(true), OptType::insert,
std::move(insert_id));
return insert_id.value();
}

template <typename T, typename... Args>
Expand Down Expand Up @@ -669,38 +682,37 @@ class mysql {
}

template <typename T, typename... Args>
int insert_impl(OptType type, const T &t, bool get_insert_id,
Args &&...args) {
std::string sql = generate_insert_sql<T>(type == OptType::insert);
return insert_or_update_impl(t, sql, type, get_insert_id);
int insert_impl(OptType type, const T &t, Args &&...args) {
return insert_or_update_impl(
t, generate_insert_sql<T>(type == OptType::insert), type, std::nullopt);
}

template <typename T, typename... Args>
int insert_impl(OptType type, const std::vector<T> &v, bool get_insert_id,
Args &&...args) {
std::string sql = generate_insert_sql<T>(type == OptType::insert);
return insert_or_update_impl(v, sql, type, get_insert_id);
int insert_impl(OptType type, const std::vector<T> &v, Args &&...args) {
return insert_or_update_impl(
v, generate_insert_sql<T>(type == OptType::insert), type, std::nullopt);
}

template <typename T, typename... Args>
int update_impl(const T &t, Args &&...args) {
bool condition = true;
std::string sql =
generate_update_sql<T>(condition, std::forward<Args>(args)...);
return insert_or_update_impl(t, sql, OptType::update, false, condition);
auto sql = generate_update_sql<T>(condition, std::forward<Args>(args)...);
return insert_or_update_impl(t, sql, OptType::update, std::nullopt,
condition);
}

template <typename T, typename... Args>
int update_impl(const std::vector<T> &v, Args &&...args) {
bool condition = true;
std::string sql =
generate_update_sql<T>(condition, std::forward<Args>(args)...);
return insert_or_update_impl(v, sql, OptType::update, false, condition);
auto sql = generate_update_sql<T>(condition, std::forward<Args>(args)...);
return insert_or_update_impl(v, sql, OptType::update, std::nullopt,
condition);
}

template <typename T>
int insert_or_update_impl(const T &t, const std::string &sql, OptType type,
bool get_insert_id = false, bool condition = true) {
std::optional<uint64_t> &&insert_id,
bool condition = true) {
#ifdef ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
#endif
Expand All @@ -718,16 +730,19 @@ class mysql {
auto guard = guard_statment(stmt_);

if (stmt_execute(t, type, condition) == INT_MIN) {
set_last_error(mysql_stmt_error(stmt_));
return INT_MIN;
}

return get_insert_id ? stmt_->mysql->insert_id : 1;
if (insert_id.has_value()) {
insert_id = {stmt_->mysql->insert_id};
}

return 1;
}

template <typename T>
int insert_or_update_impl(const std::vector<T> &v, const std::string &sql,
OptType type, bool get_insert_id = false,
OptType type, std::optional<uint64_t> &&insert_id,
bool condition = true) {
#ifdef ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
Expand Down Expand Up @@ -756,8 +771,15 @@ class mysql {
}
}

return commit() ? get_insert_id ? stmt_->mysql->insert_id : (int)v.size()
: INT_MIN;
if (!commit()) {
return INT_MIN;
}

if (insert_id.has_value()) {
insert_id = {stmt_->mysql->insert_id};
}

return (int)v.size();
}

template <typename... Args>
Expand Down
Loading
Loading