#pragma once

#include <QObject>
#include "QxOrm.h"
#include "charcode.h"

class ServiceBase : public QObject
{
	Q_OBJECT

public:
	ServiceBase(QObject *parent);
	~ServiceBase();

	//************************************
	// Method:    add
	// FullName:  ServiceBase::add
	// Returns:   void
	// Parameter: T & t 实体对象
	// Parameter: QSqlDatabase * database  默认为空，QxOrm内部自动开启事务，如果多条记录操作，则需传入有效的database，有调用者控制事务
	//************************************
	template<typename T>
	static void add(T &t, QSqlDatabase *database = nullptr)
	{
		QSqlError error = qx::dao::insert(t, database);
		if (error.isValid())
            throw MessageException("插入失败:" + error.text());
	}

	//************************************
	// Method:    updateById
	// FullName:  ServiceBase::updateById
	// Returns:   void
	// Parameter: T & t 实体对象
	// Parameter: QSqlDatabase * database 默认为空，QxOrm内部自动开启事务，如果多条记录操作，则需传入有效的database，有调用者控制事务
	//************************************
	template<typename T>
	static void updateById(T &t, QSqlDatabase *database = nullptr)
	{
		QSqlError error = qx::dao::update(t, database);
		if (error.isValid())
            throw MessageException("更新失败:" + error.text());
	}

	//************************************
	// Method:    deleteById
	// FullName:  ServiceBase::deleteById
	// Returns:   void
	// Parameter: T & t 实体对象
	// Parameter: QSqlDatabase * database 默认为空，QxOrm内部自动开启事务，如果多条记录操作，则需传入有效的database，有调用者控制事务
	//************************************
	template<typename T>
	static void deleteById(T &t, QSqlDatabase *database = nullptr)
	{
		QSqlError error = qx::dao::delete_by_id(t, database);
		if (error.isValid())
            throw MessageException("删除失败:" + error.text());
	}
};
