xml로 만들어준 테이블 설계를 긁어서 분석할 수 있는 토대를 만들어봤다.

이번엔 진짜 이거에 맞게 데이터베이스를 업데이트하는 부분까지 만들어보자. 일종의 ORM을 만들어 보는 것.

 

현재 db상태를 가져와서 xml의 형태와 일치하는지 확인하고 일치하지 않는다면 바뀌어야 하는 부분만 업데이트 하도록 하면 효율적일 것 같다. 당연히 코드 량이 많다.

이번에도 복붙 위주로 한다고 한다. (새로운 배울 지식은 딱히 없다는 뜻으로 보임)

 

ConsoleLog 클래스 추가 - 색상을 선택해서 로그를 띄울 수 있도록 하는 클래스 coreglobal에 추가한다.

로그 찍는걸 단일 스레드가 담당해서 나머지 스레드들은 그 스레드에 일감을 던져주는 식으로 만드는 경우도 있는데 로그를 그렇게 자주 찍을 건 아니라서 그렇게까지는 하지 않는다. 일단은 모두가 lock 걸지 않고 사용할 수 있게끔 한다.

 

강의자가 sql server로 만든지라 postgres를 쓰는 나와 매우 많이 다르다. 나중에 이 부분을 postgres에 맞춰 싹 바꿀 것.

 

DBModel 클래스와 DBSynchronizer 클래스 추가 이 역시 복붙

 

어쨋든 지금 하려는건 이렇다.

XML에서 정보를 싹 긁어서 DB에 쿼리를 날려서 테이블, 컬럼, 인덱스, 프로시저 등등의 정보를 다 긁어올것이다. 그래서 둘둘(?) 비교를 해줄것인데 그 메모리 구조를 DBModel.h 안에 적어놓은 구조로 갖고있는 것. 그래서 컬럼을 정의하기 위한 모든 것들을 갖고있음.

DBModel

Column

class Column
{
public:
	String				CreateText();

public:
	String				_name;
	int32				_columnId = 0; // DB
	DataType			_type = DataType::None;
	String				_typeText;
	int32				_maxLength = 0;
	bool				_nullable = false;
	bool				_identity = false;
	int64				_seedValue = 0;
	int64				_incrementValue = 0;
	String				_default;
	String				_defaultConstraintName; // DB
};

- CreateText 함수 :  나중에 우리가 테이블을 만들 때 테이블, 컬럼등을 만드는 문법을 텍스트로 생성해주는 함수. (이 컬럼을 생성하기위한 sql문을 만들어주는 듯)

 

 - Format 함수 : Log에서 사용한 것 처럼 가변인자를 받아서 만들어주는 함수. (뭘?) c의 printf 같은것

 

Index

enum class IndexType
{
	Clustered = 1,
	NonClustered = 2
};

class Index
{
public:
	String				GetUniqueName();
	String				CreateName(const String& tableName);
	String				GetTypeText();
	String				GetKeyText();
	String				CreateColumnsText();
	bool				DependsOn(const String& columnName);

public:
	String				_name; // DB
	int32				_indexId = 0; // DB
	IndexType			_type = IndexType::NonClustered;
	bool				_primaryKey = false;
	bool				_uniqueConstraint = false;
	Vector<ColumnRef>	_columns;
};

컬럼과 마찬가지로 index를 구성하는 내용물들을 모두 갖고있음. 함수 이름대로 역할이 있고 별거 없다.

 

Table

class Table
{
public:
	ColumnRef			FindColumn(const String& columnName);

public:
	int32				_objectId = 0; // DB
	String				_name;
	Vector<ColumnRef>	_columns;
	Vector<IndexRef>	_indexes;
};

테이블도 마찬가지

 

Procedure

struct Param
{
	String				_name;
	String				_type;
};

class Procedure
{
public:
	String				GenerateCreateQuery();
	String				GenerateAlterQuery();
	String				GenerateParamString();

public:
	String				_name;
	String				_fullBody; // DB
	String				_body; // XML
	Vector<Param>		_parameters;  // XML
};

어떤 쿼리로 되어있는지 어떤 인자들을 받고있는지 등

 

DBSynchronizer

내용은 많은데 사용방법은 단순하다.

그냥 DBSynchronizer를 호출하고 Synchronizer 함수를 호출하면 끝

코드 흐름

xml을 파싱 해서 메모리 상에서 들고있음 -> gather함수들이 실제db 정보 긁어옴 -> 둘을 비교해서 일치하지 않으면 업데이트를 하던 create를 하던 XML형식에 맞게끔 db를 업데이트 해준다. -> 예약만 해주고 실제 실행은 ExecuteUpdateQueries에서 한다.

 

테이블, 컬럼 데이터를 가져오는 컬럼이 있는데, 이 부분이 db서버마다 다르므로 주의해야한다.

만들어 둔 DBBind을 상속받아서 쓰기 쉽게 만든 클래스가 GetDBTables

비슷한 방식으로 StoredProcedures도 가져와서 객체의 멤버변수에 저장해둔다.

 

아무튼 주석대로 로직이 실행된다. 직접 확인해보는걸 추천한다 함.

 

업데이트 해야할 애들을 업데이트 스탭 순서대로 기입만 해뒀다가 안전하게 순서를 지켜서 한번에 해준다.

 

쿼리부분이나 sql server와 다른 부분이 너무 많아서 일단 여기까지.

 

'강의 수강 > 게임서버(1)' 카테고리의 다른 글

78. XML Parser  (0) 2025.09.06
77. DB Bind  (0) 2025.09.05
76. DB Connection  (0) 2025.09.01
75. JobTimer  (0) 2025.08.25
74. JobQueue #5  (0) 2025.08.25

+ Recent posts