Skip to content

Commit

Permalink
add api to get insert id
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacyking committed Aug 7, 2023
1 parent 2a78b02 commit e7bb8fd
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 24 deletions.
9 changes: 5 additions & 4 deletions include/dbng.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,14 @@ class dbng {
}

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

template <typename T, typename... Args>
int insert(const std::vector<T> &t, Args &&...args) {
return db_.insert(t, std::forward<Args>(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)...);
}

template <typename T, typename... Args>
Expand Down
29 changes: 19 additions & 10 deletions include/mysql.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,41 +94,42 @@ class mysql {
}

template <typename T, typename... Args>
int insert(const std::vector<T> &t, Args &&...args) {
int insert(const std::vector<T> &t, bool get_insert_id = false,
Args &&...args) {
reset_error();
auto name = get_name<T>();
std::string sql = auto_key_map_[name].empty()
? generate_insert_sql<T>(false)
: generate_auto_insert_sql<T>(auto_key_map_, false);

return insert_impl(sql, t, std::forward<Args>(args)...);
return insert_impl(sql, t, get_insert_id, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int update(const std::vector<T> &t, Args &&...args) {
reset_error();
std::string sql = generate_insert_sql<T>(true);

return insert_impl(sql, t, std::forward<Args>(args)...);
return insert_impl(sql, t, false, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int insert(const T &t, Args &&...args) {
int insert(const T &t, bool get_insert_id = false, Args &&...args) {
reset_error();
// insert into person values(?, ?, ?);
auto name = get_name<T>();
std::string sql = auto_key_map_[name].empty()
? generate_insert_sql<T>(false)
: generate_auto_insert_sql<T>(auto_key_map_, false);

return insert_impl(sql, t, std::forward<Args>(args)...);
return insert_impl(sql, t, get_insert_id, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int update(const T &t, Args &&...args) {
reset_error();
std::string sql = generate_insert_sql<T>(true);
return insert_impl(sql, t, std::forward<Args>(args)...);
return insert_impl(sql, t, false, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
Expand Down Expand Up @@ -460,10 +461,14 @@ class mysql {
return {};
}

auto vv1 = mysql_stmt_affected_rows(stmt_);
auto vv2 = stmt_->affected_rows;

while (mysql_stmt_fetch(stmt_) == 0) {
iguana::for_each(t, [&mp, &param_binds, &t, this](auto item, auto i) {
constexpr auto Idx = decltype(i)::value;
set_value(param_binds.at(Idx), t.*item, Idx, mp);
auto res = mysql_stmt_result_metadata(stmt_);
});

for (auto &p : mp) {
Expand All @@ -479,6 +484,9 @@ class mysql {
});
}

auto vv3 = mysql_stmt_affected_rows(stmt_);
auto vv4 = stmt_->affected_rows;

return v;
}

Expand Down Expand Up @@ -722,7 +730,8 @@ class mysql {
};

template <typename T, typename... Args>
int insert_impl(const std::string &sql, const T &t, Args &&...args) {
int insert_impl(const std::string &sql, const T &t,
bool get_insert_id = false, Args &&...args) {
#if ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
#endif
Expand All @@ -739,12 +748,12 @@ class mysql {
if (stmt_execute(t) < 0)
return INT_MIN;

return 1;
return get_insert_id ? stmt_->insert_id : 1;
}

template <typename T, typename... Args>
int insert_impl(const std::string &sql, const std::vector<T> &t,
Args &&...args) {
bool get_insert_id = false, Args &&...args) {
#if ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
#endif
Expand Down Expand Up @@ -772,7 +781,7 @@ class mysql {
}
b = commit();

return b ? (int)t.size() : INT_MIN;
return b ? (get_insert_id ? stmt_->insert_id : (int)t.size()) : INT_MIN;
}

template <typename... Args>
Expand Down
26 changes: 16 additions & 10 deletions include/sqlite.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,35 +71,38 @@ class sqlite {
}

template <typename T, typename... Args>
int insert(const T &t, Args &&...args) {
int insert(const T &t, bool get_insert_id = false, Args &&...args) {
std::string sql = auto_key_map_.empty()
? generate_insert_sql<T>(false)
: generate_auto_insert_sql0<T>(auto_key_map_, false);

return insert_impl(false, sql, t, std::forward<Args>(args)...);
return insert_impl(false, sql, t, get_insert_id,
std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int insert(const std::vector<T> &t, Args &&...args) {
int insert(const std::vector<T> &t, bool get_insert_id = false,
Args &&...args) {
std::string sql = auto_key_map_.empty()
? generate_insert_sql<T>(false)
: generate_auto_insert_sql0<T>(auto_key_map_, false);

return insert_impl(false, sql, t, std::forward<Args>(args)...);
return insert_impl(false, sql, t, get_insert_id,
std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int update(const T &t, Args &&...args) {
std::string sql = generate_insert_sql<T>(true);

return insert_impl(true, sql, t, std::forward<Args>(args)...);
return insert_impl(true, sql, t, false, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
int update(const std::vector<T> &t, Args &&...args) {
std::string sql = generate_insert_sql<T>(true);

return insert_impl(true, sql, t, std::forward<Args>(args)...);
return insert_impl(true, sql, t, false, std::forward<Args>(args)...);
}

template <typename T, typename... Args>
Expand Down Expand Up @@ -437,7 +440,7 @@ class sqlite {

template <typename T, typename... Args>
int insert_impl(bool is_update, const std::string &sql, const T &t,
Args &&...args) {
bool get_insert_id = false, Args &&...args) {
#if ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
#endif
Expand Down Expand Up @@ -480,12 +483,13 @@ class sqlite {
return INT_MIN;
}

return 1;
return get_insert_id ? sqlite3_last_insert_rowid(handle_) : 1;
}

template <typename T, typename... Args>
int insert_impl(bool is_update, const std::string &sql,
const std::vector<T> &v, Args &&...args) {
const std::vector<T> &v, bool get_insert_id = false,
Args &&...args) {
#if ORMPP_ENABLE_LOG
std::cout << sql << std::endl;
#endif
Expand Down Expand Up @@ -548,7 +552,9 @@ class sqlite {

b = commit();

return b ? (int)v.size() : INT_MIN;
return b ? (get_insert_id ? sqlite3_last_insert_rowid(handle_)
: (int)v.size())
: INT_MIN;
}

template <typename T>
Expand Down
25 changes: 25 additions & 0 deletions tests/test_ormpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -979,4 +979,29 @@ TEST_CASE("test create table with unique and test query") {
CHECK(v2.size() == 1);
}
#endif
}

TEST_CASE("get_insert_id") {
#ifdef ORMPP_ENABLE_MYSQL
dbng<mysql> mysql;
if (mysql.connect(ip, "root", password, db)) {
mysql.execute("drop table if exists person");
mysql.create_datatable<person>(ormpp_auto_key{"id"});
mysql.insert<person>({0, "purecpp", 200});
mysql.insert<person>({0, "purecpp", 200});
int id = mysql.insert<person>({0, "purecpp", 200}, true);
CHECK(id == 3);
}
#endif
#ifdef ORMPP_ENABLE_SQLITE3
dbng<sqlite> sqlite;
if (sqlite.connect(db)) {
sqlite.execute("drop table if exists person");
sqlite.create_datatable<person>(ormpp_auto_key{"id"});
sqlite.insert<person>({0, "purecpp", 200});
sqlite.insert<person>({0, "purecpp", 200});
int id = sqlite.insert<person>({0, "purecpp", 200}, true);
CHECK(id == 3);
}
#endif
}

0 comments on commit e7bb8fd

Please sign in to comment.