Commit 53a320c2 by NitefullWind

1. 修复重新构建出错问题。 2. 实现数据库连接管理类。3. 实现存储门店信息。

parent e56e4444
......@@ -38,7 +38,9 @@
namespace DB {
inline std::auto_ptr<odb::database>
using namespace odb::core;
inline std::shared_ptr<odb::database>
OpenDatabase (const char *dbName = "Test.db")
{
using namespace std;
......@@ -47,8 +49,10 @@ OpenDatabase (const char *dbName = "Test.db")
#if defined(DATABASE_MYSQL)
auto_ptr<database> db (new odb::mysql::database (dbName));
#elif defined(DATABASE_SQLITE)
auto_ptr<database> db (
new odb::sqlite::database (dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
// auto_ptr<database> db (
// new odb::sqlite::database (dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
std::shared_ptr<database> db(
new odb::sqlite::database (dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
fstream dbFile;
dbFile.open(dbName, ios::in);
......@@ -90,6 +94,72 @@ OpenDatabase (const char *dbName = "Test.db")
return db;
}
class DBConnect
{
public:
static DBConnect *Instance() {
static DBConnect dbConnect;
return &dbConnect;
}
void OpenDatabase()
{
std::fstream dbFile;
dbFile.open(_dbName.c_str(), std::ios::in);
if(!dbFile) {
// Create the database schema. Due to bugs in SQLite foreign key
// support for DDL statements, we need to temporarily disable
// foreign keys.
//
{
connection_ptr c (_db_pointer->connection ());
c->execute ("PRAGMA foreign_keys=OFF");
transaction t (c->begin ());
schema_catalog::create_schema (*_db_pointer, "", false);
t.commit ();
c->execute ("PRAGMA foreign_keys=ON");
}
} else if(_db_pointer->schema_version() < schema_catalog::current_version(*_db_pointer)) {
qDebug() << "Schema migrate. Schema version: " << _db_pointer->schema_version() << " Current version: " << schema_catalog::current_version(*_db_pointer) << " Base version: " << schema_catalog::base_version(*_db_pointer);
try {
transaction t(_db_pointer->begin ());
schema_catalog::migrate(*_db_pointer);
t.commit ();
} catch (const odb::exception &e) {
qDebug() << "Exception: schema migrate. " << e.what();
}
}
}
std::shared_ptr<odb::database> DBPointer() {
return _db_pointer;
}
private:
DBConnect() :
_dbName("Test.db")
{
_db_pointer = std::make_shared<odb::sqlite::database>(_dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
OpenDatabase();
}
std::shared_ptr<odb::database> _db_pointer;
std::string _dbName;
};
inline odb::database* DBP() {
return DBConnect::Instance()->DBPointer().get();
}
inline std::shared_ptr<odb::database> DBSP() {
return DBConnect::Instance()->DBPointer();
}
}
#endif // DATABASE_H
......@@ -182,12 +182,12 @@ odb.variable_out = SOURCES
odb.clean = ${QMAKE_FILE_BASE}-odb.cxx ${QMAKE_FILE_BASE}-odb.hxx ${QMAKE_FILE_BASE}-odb.ixx ${QMAKE_FILE_BASE}.sql
QMAKE_EXTRA_COMPILERS += odb
#odbh.name = odb ${QMAKE_FILE_IN}
#odbh.input = ODB_PWD_FILES
#odbh.output = ${QMAKE_FILE_BASE}-odb.hxx
#odbh.commands = @true
#odbh.CONFIG = no_link
#odbh.depends = ${QMAKE_FILE_BASE}-odb.cxx
#QMAKE_EXTRA_COMPILERS += odbh
odbh.name = odb ${QMAKE_FILE_IN}
odbh.input = ODB_PWD_FILES
odbh.output = ${QMAKE_FILE_BASE}-odb.hxx
odbh.commands = @
odbh.CONFIG = no_link
odbh.depends = ${QMAKE_FILE_BASE}-odb.cxx
QMAKE_EXTRA_COMPILERS += odbh
#include "tasksetstoreinfo.h"
//#include "items/storeinfo.h"
//#include "dbop.h"
#include "database.h"
using namespace DB;
using namespace odb;
TaskSetStoreInfo::TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent)
: FMTaskSimple(jsonObj, FM_Set_Store_Info, 0, parent)
......@@ -14,14 +16,24 @@ void TaskSetStoreInfo::packagePOSReq()
void TaskSetStoreInfo::packagePOSRsp()
{
// FMItem::StoreInfo storeInfo;
// storeInfo.SetPropertiesByJson(posReqJsonObj);
// bool isOk = DBOP::Save(&storeInfo);
// int statusCode = isOk ? FM_API_SUCCESS : FM_API_ERROR;
// QString msg("");
// if(!isOk) {
// msg = QString::fromLocal8Bit("保存门店信息失败");
// }
// posRspJsonObj[PosProps.StatusCode] = statusCode;
// posRspJsonObj[PosProps.Msg] = msg;
QSharedPointer<StoreInfo> storeInfo(new StoreInfo());
storeInfo->setStoreId(getPosJsonValue(PosProps.StoreId).toString());
storeInfo->setPosId(getPosJsonValue(PosProps.PosId).toString());
storeInfo->setBusinessDate(getPosJsonValue(PosProps.BussinessDate).toString());
storeInfo->setOperatorId(getPosJsonValue(PosProps.OperatorId).toString());
int statusCode = FM_API_SUCCESS;
QString msg("");
try {
transaction t(DBSP()->begin());
DBSP()->persist(storeInfo);
t.commit();
} catch (const exception &e) {
statusCode = FM_API_ERROR;
msg = QString::fromLocal8Bit("保存门店信息失败");
FMP_ERROR() << msg << e.what();
}
posRspJsonObj[PosProps.StatusCode] = statusCode;
posRspJsonObj[PosProps.Msg] = msg;
}
......@@ -25,8 +25,7 @@ protected:
}
try {
_db = OpenDatabase();
ASSERT_NE(_db.get(), nullptr);
ASSERT_NE(DBSP(), nullptr);
} catch (const odb::exception& e) {
FAIL() << "Exception: " << e.what() << std::endl;
}
......@@ -34,8 +33,6 @@ protected:
void TearDown()
{
}
std::auto_ptr<database> _db;
};
TEST_F(TestDBCreate, Insert)
......@@ -62,20 +59,20 @@ TEST_F(TestDBCreate, Insert)
// 插入数据
try {
transaction t(_db->begin());
transaction t(DBSP()->begin());
_db->persist(storeInfo);
DBSP()->persist(storeInfo);
t.commit();
EXPECT_NE(storeInfo->id(), 0);
t.reset(_db->begin());
_db->persist(order);
t.reset(DBSP()->begin());
DBSP()->persist(order);
t.commit();
EXPECT_NE(order->id(), 0);
EXPECT_EQ(order->storeInfo()->id(), storeInfo->id());
t.reset(_db->begin());
_db->persist(pay);
t.reset(DBSP()->begin());
DBSP()->persist(pay);
t.commit();
EXPECT_NE(pay->id(), 0);
......
......@@ -19,26 +19,24 @@ class TestDBQuery : public ::testing::Test
protected:
void SetUp()
{
_db = OpenDatabase();
ASSERT_NE(_db.get(), nullptr);
ASSERT_NE(DBSP(), nullptr);
}
void TearDown()
{
}
std::auto_ptr<database> _db;
};
TEST_F(TestDBQuery, Query)
{
try {
transaction t(_db->begin());
transaction t(DBSP()->begin());
QString orderId = "2018001";
query<Order> q(query<Order>::orderId == orderId);
result<Order> r1(_db->query<Order>(q));
result<Order> r1(DBSP()->query<Order>(q));
EXPECT_FALSE(r1.empty());
......@@ -52,13 +50,13 @@ TEST_F(TestDBQuery, Query)
TEST_F(TestDBQuery, QueryAnd)
{
try {
transaction t(_db->begin());
transaction t(DBSP()->begin());
QString orderId = "2018001";
query<Order> q((query<Order>::orderId == orderId) && (query<Order>::fmOrderId == orderId));
result<Order> r(_db->query<Order>(q));
result<Order> r(DBSP()->query<Order>(q));
EXPECT_TRUE(r.empty());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment