[C++ / Python / DB] ProcedureGenerator
·
Study/C++ & C#
이전에 Protobuf를 사용한 패킷 핸들러를 자동화할 때와 동일하게, Python과 Jinja2를 활용할 것이다. 1. XML 파서 작성 서버 소스가 아니라 Python에서 사용할 XML 파서를 작성해야 한다. import xml.etree.ElementTree as ET class XmlDBParser: def __init__(self): self.tables = {} self.procedures = [] def parse_xml(self, path): tree = ET.parse(path) root = tree.getroot() for child in root: if child.tag == 'Table': self.tables[child.attrib['name']] = Table(child) for..
[C++ / DB] ORM
·
Study/C++ & C#
자체적인 ORM을 작성해 보기로 했었다. 이제 필요한 것은 실행 시 XML 파일과 실제 DB를 비교하고 동기화하는 것이다. 1. 클래스 작성 양이 많아서 일부만 옮긴다. A. ConsoleLog 먼저 콘솔에 로그를 더 효율적으로 찍기 위한 클래스를 작성한다. // ConsoleLog.h #pragma once enum class Color { BLACK, WHITE, RED, GREEN, BLUE, YELLOW, }; class ConsoleLog { enum { BUFFER_SIZE = 4096 }; public: ConsoleLog(); ~ConsoleLog(); public: voidWriteStdOut(Color color, const WCHAR* str, ...); voidWriteStdErr(..
[C++ / DB] DBBind
·
Study/C++ & C#
저번 시간의 불편함을 어느 정도 해소해 보자. 1. BindParam/Col 요주의 함수. 원래 있던건 private로 돌려서 내부에서 사용하기로 하고, public으로 새로 만들 어떤 자료형이든 받을 수 있게 함수를 쫙 작성하기로 하자. 새로 작성할 함수들은 얘네들이다. public: boolBindParam(int32 paramIndex, bool* value, SQLLEN* index); boolBindParam(int32 paramIndex, float* value, SQLLEN* index); boolBindParam(int32 paramIndex, double* value, SQLLEN* index); boolBindParam(int32 paramIndex, int8* value, SQLLEN..
[C++ / DB] DBConnection
·
Study/C++ & C#
올 것이 왔다는 느낌. 학교에서 서블릿으로 DB를 배울 때가 생각난다. 자바가 싫어서 그렇게 열심히는 안 했던 것 같지만, 이번엔 자바가 아니니까 좀 열심히 해보기로 했다. 1. 클래스 작성 역시 일꾼을 만드는 것부터 시작한다. A. DBConnectionPool 이름에서 느껴지는 이 녀석의 역할. 커넥션을 만들어 뒀다가 두고두고 쓰기 위한 저장용 풀이다. 아래와 같이 만들어 볼 수 있겠다. #pragma once #include "DBConnection.h" // 재사용 하기 위한 풀 class DBConnectionPool { public: DBConnectionPool(); ~DBConnectionPool(); boolConnect(int32 connectionCount, const WCHAR* c..
[C++] JobQueue (3 / 3)
·
Study/C++ & C#
지금까지의 코드에선 하나의 스레드에 일감이 몰리는 상황이 발생할 수 있었다. 목표는 이 일감을 최대한 분배해 한 스레드만 괴롭히는 현상을 해소하는 것이다. 여기선 JobQueue를 보관할 GlobalQueue를 만들어 이를 뿌리는 식으로 만들어 본다. 1. 클래스 작성 기본적인 기능만 수행할 것이기 때문에 복잡한 일은 없다. // GlobalQueue.cpp #pragma once class GlobalQueue { public: GlobalQueue(); ~GlobalQueue(); voidPush(JobQueueRef jobQueue); JobQueueRefPop(); private: LockQueue _jobQueues; }; // GlobalQueue.h #include "pch.h" #inclu..
[C++] Packet Session
·
Study/C++ & C#
지금까진 단순히 "Hello World"라는 문자열을 주고받기만 했다. 이대로라면 통신은 되지만 서로 원하는 데이터를 확실하게 주고 받지는 못할 것이다. 클라이언트에서 특정 처리에 대한 요청을 보내는데 TCP 특성 상, 그 내용이 완전한 형태로 한 번에 서버에 도착한다는 보장이 없다. 따로 와버린 데이터에 대해 서버가 그 요청에 맞는 처리를 할 수 없는 것은 당연하다. 따라서 헤더를 가지는 「패킷」을 활용하여 통신되는 데이터를 구분할 수 있게 할 것이다. 1. 클래스 작성 패킷을 사용한다고 해서 기존의 통신 방식과 완전히 다른 것을 사용하는 것은 아니다. 「Hello Wolrd」라는 데이터 앞에 이 데이터의 크기는 얼마고, 이 패킷은 뭘 하는 패킷이다라는 것을 알려주는 부분을 추가할 뿐이다. 웹 통신에서..
[C++] SendBuffer
·
Study/C++ & C#
SendBuffer는 내용이 많아서 과정을 분할해 올린다. 먼저 이번엔 SendBuffer 자체의 구현에 대해 다룬다. 1. SendBuffer 클래스 작성 RecvBuffer처럼 클래스를 만들어서 관리한다. #pragma once // 송신 버퍼도 WSASend 중에 없어지거나 하면 안되기 때문에 // 레퍼런스 카운팅이 이루어져야 한다 class SendBuffer : enable_shared_from_this { public: SendBuffer(int32 bufferSize); ~SendBuffer(); BYTE* Buffer() { return _buffer.data(); } int32 WriteSize() { return _writeSize; } int32 Capacity() { return s..
[C++] Session
·
Study/C++ & C#
이제 세션이 본격적으로 역할을 할 수 있도록 고쳐나간다. 세션 클래스에 필요한 것들을 만들어 두고, 세션에서 많은 일들을 할 수 있게 할 것이다. 단계를 나눠서 진행한다. 1. 연결 및 수신 1-1. 클래스 내용 추가 추가된 부분에 대해서만 표시한다. #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" class Service; class Session : public IocpObject { // 자유롭게 꺼내쓸 수 있도록 허락 friend class Listener; friend class IocpCore; friend class Service; public: // 생/소멸자 // 외부에서 사용할 함수들 pu..