#include <gflags/gflags.h>
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>
#include "student_classes.hxx"
#include "student_classes-odb.hxx"
DEFINE_string(host, "127.0.0.1", "主机号");
DEFINE_uint32(port, 0, "端口号");
DEFINE_string(db, "qsy_test", "mysql 数据库名");
DEFINE_string(user, "root", "mysql 用户名");
DEFINE_string(pswd, "I5sLBKpqjGjPZi", "mysql 用户密码");
DEFINE_string(cset, "utf8", "mysql 客户端字符集");
DEFINE_int32(max_pool, 3, "最大的连接池数");
void insert_student(odb::mysql::database &db) {
try {
odb::transaction trans(db.begin());
Student s1(1, "张三", 18, 1);
Student s2(2, "李四", 19, 1);
Student s3(3, "王五", 17, 1);
Student s4(4, "赵六", 21, 2);
Student s5(5, "田七", 20, 2);
Student s6(6, "孙八", 16, 2);
Student s7(7, "罗九", 26, 2);
db.persist(s1);
db.persist(s2);
db.persist(s3);
db.persist(s4);
db.persist(s5);
db.persist(s6);
db.persist(s7);
trans.commit();
} catch (std::exception &e) {
std::cout << "数据插入失败:" << e.what() << std::endl;
}
}
void insert_classes(odb::mysql::database& db) {
try {
odb::transaction trans(db.begin());
Classes c1("1 班");
Classes c2("2 班");
db.persist(c1);
db.persist(c2);
trans.commit();
} catch (const std::exception& e) {
std::cout << "数据插入失败" << e.what() << '\n';
}
}
void remove_student(odb::mysql::database &db) {
try {
odb::transaction trans(db.begin());
typedef odb::query<Student> query;
db.erase_query<Student>(query::id == 4);
trans.commit();
} catch (const std::exception &e) {
std::cerr << "删除失败:" << e.what() << '\n';
}
}
Student select_student(odb::mysql::database &db) {
Student ret;
try {
odb::transaction trans(db.begin());
typedef odb::query<Student> query;
typedef odb::result<Student> result;
result r(db.query<Student>(query::name == "张三"));
if (r.size() != 1) {
std::cout << "查询失败" << std::endl;
return Student();
}
ret = *r.begin();
trans.commit();
} catch (const std::exception &e) {
std::cerr << "查询失败" << e.what() << '\n';
}
return ret;
}
void select_student_classes(odb::mysql::database& db) {
try {
odb::transaction trans(db.begin());
typedef odb::query<struct classes_student> query;
typedef odb::result<struct classes_student> result;
result r(db.query<struct classes_student>(query::classes::id == 1));
for (auto it = r.begin(); it != r.end(); it++) {
std::cout << it->name << " ";
std::cout << it->age << " ";
std::cout << it->sn << " ";
std::cout << it->classes_name << " ";
std::cout << std::endl;
}
trans.commit();
} catch (const std::exception &e) {
std::cout << "查询失败:" << e.what() << std::endl;
}
}
void updata_student(odb::mysql::database &db, Student &stu) {
try {
odb::transaction trans(db.begin());
db.update(stu);
trans.commit();
} catch (const std::exception &e) {
std::cerr << "更新失败:" << e.what() << '\n';
}
}
int main(int argc, char* argv[]) {
google::ParseCommandLineFlags(&argc, &argv, true);
std::unique_ptr<odb::mysql::connection_pool_factory> cpf(
new odb::mysql::connection_pool_factory(FLAGS_max_pool, 0));
odb::mysql::database db(FLAGS_user, FLAGS_pswd, FLAGS_db, FLAGS_host, FLAGS_port, "", FLAGS_cset, 0, std::move(cpf));
select_student_classes(db);
return 0;
}