2017년 10월 18일 수요일

MySQL ODBC connection string

사용언어 : C++
컴파일 : Visual Studio 2015
DB : mysql-installer-community-5.7.19.0.msi

회사에서 MS SQL 대신에 MY SQL로 대체해서 사용해야 한다는 통지를 받아서 기존 코어 라이브러리에 MY SQL connection string를 추가하는 작업을 진행

atldbcli.h
OpenFromInitializationString 을 통해서 처리하는 구조라 connection string만 맞추면 금방 될것으로 예상했는데 연결이 되지 않아 애를 먹음


참고사이트)
https://dev.mysql.com/doc/index-connectors.html
https://www.connectionstrings.com/mysql/


기존 코어에 있던 스트링은
Provider=OleMySql.MySqlSource.1; Data Source=127.0.0.1,3306; Initial Catalog=world; User Id=root; Password=1234
결과) GetDataSource 에러값 REGDB_E_CLASSNOTREG Class not registered

검색해 보니 Provider를 MySQLProv로 설정하라고 나와서 해보니 동일하게
REGDB_E_CLASSNOTREG Class not registered 에러가 남

그래서 더 찾아보니
Provider 대신 Driver={MySQL ODBC 5.3 UNICODE Driver}; 를 사용하는 곳이 있어서 수정해봄
결과는 GetDataSource 는 S_OK 하지만 Initialize에서 E_FAIL

여기서 부터 삽질이 시작됨
Driver를 MySQL ODBC 5.3 Driver, MySQL ODBC 5.3 ANSI Driver, MySQL ODBC 5.3 Unicode Driver 3개 다 해보고
User Id를 User로 바꿔보고 UID, PWD 등등 수정해보지만 모두 실패

>> 실패케이스
DRIVER={MySQL ODBC 5.3 Driver}; Data Source=127.0.0.1,3306; Initial Catalog=world; User Id=root; Password=1234; OPTION=3
결과) Initialize 에러값  E_UNEXPECTED Catastrophic failure.

Driver = { MySQL ODBC 5.3 UNICODE Driver }; Data Source=127.0.0.1,3306; Database=world; User=root; Password=1234; OPTION=3
결과) Initialize 에러값 DB_SEC_E_AUTH_FAILED Authentication failed.

Provider=MSDASQL; Driver = { MySQL ODBC 5.3 UNICODE Driver }; Server=127.0.0.1; Port=3306; Database=world; User=root; Password=1234; OPTION=3
결과) Initialize 에러값 E_FAIL

그러다 바탕화면에 텍스트파일을 새로 만들고 확장자를 udl로 바꾸고 실행하니

공급자에 Microsoft OLE DB Provider for ODBC Drivers를 선택하고
연결 문자열에 MySQL ODBC 5.3 Unicode Driver을 넣고 저장시켜보니
Provider=MSDASQL.1; Extended Properties="Driver={MySQL ODBC 5.3 Unicode Driver};";
이런식으로 저장이됨

그래서 스트링을 바꿔서 접속해 보니 정상적으로 접속이 되는것을 확인하게 됨
아싸!

결국 최종 스트링은 아래와 같이 이루어짐
Provider=MSDASQL.1; Extended Properties="Driver={MySQL ODBC 5.3 Unicode Driver};"; Server=127.0.0.1; Port=3306; Initial Catalog=world; User Id=root; Password=1234

참고로 Data Source를 사용하면 실패함 ㅠㅠ
Provider=MSDASQL.1; Extended Properties="Driver={MySQL ODBC 5.3 Unicode Driver};"; Data Source=127.0.0.1,3306; Initial Catalog=world; User Id=gameserver; Password=!QAZwsx
결과) Initialize 에러값 E_FAIL


이상 삽질의 결과 공유 끝.

2017년 6월 27일 화요일

락 관련 속도 비교

1. atomic과 mutex 차이
#include <atomic>
#include <iostream>
#include <ppl.h>
#include <Windows.h>

#pragma comment(lib, "Winmm.lib")

    std::atomic<int> bIsWrite = 0;
    //int b = 1;
    //lock
    auto time = timeGetTime();
    Concurrency::parallel_for(0, 100000, [&](int i) {
        i;
        int a = 0;
        if (bIsWrite.compare_exchange_weak(a, 1))
        {
            std::cout << std::endl;
        }
    });
    std::cout << timeGetTime() - time << std::endl;
    //thread

    std::recursive_mutex m_kMutex;
    bool bRead = false;
    time = timeGetTime();
    Concurrency::parallel_for(0, 100000, [&](int i) {
        i;
        std::lock_guard<std::recursive_mutex>kLock(m_kMutex);
        if (bRead == false)
        {
            bRead = true;
            std::cout << std::endl;
        }
    });
    std::cout << timeGetTime() - time << std::endl;

결과
15
50

2017년 4월 26일 수요일

varbinary 뒤에 0 잘림 현상

이번에 작업하면서 이벤트 정보를 varbinary로 아래와 같이 저장하는데


declare @data varbinary(1024)

update event_binary
   set data = @data
 where id = @id


문제는 @data 값이 0x01020300d209000000  이런식인 경우
막상 저장되는 값은 0x01020300d209
이렇게 되는 것이다.

그래서 한동안 삽질하다가 커뮤니티에 물어보니


SET ANSI_PADDING ON 
https://msdn.microsoft.com/ko-kr/library/ms187403.aspx



답변을 받았다


테이블 생성할때 왜 아래와 같이 했는지 이해가 됐다


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'tbl_event]'))
BEGIN
CREATE TABLE [dbo].[tbl_event](
[IDX] [int] NOT NULL,
[Custom] [varbinary](15) NULL,
 CONSTRAINT [PK_tbl_event] PRIMARY KEY CLUSTERED 
(
[IDX] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO


IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[tbl_event]') AND [name] = N'Data')
BEGIN
ALTER TABLE [dbo].[tbl_event] ADD [Data] [varbinary](1024) NULL
END
GO

2016년 11월 29일 화요일

비주얼 스튜디오, 디버깅 브레이크 포인트 중단점이 적중되지 않습니다




디버깅 모드로 시작하면 되는데
실행파일을 직접 시작해서 프로세스에 연결하면 디버깅이 안되서 확인해 보니
연결 대상이 자동으로 결정되는 경우 형식이 네이티브가 아니여서 디버깅이 되지 않았음
그래서 코드 형식을 직접 선택해서 연결하니 디버깅이 됨

참고)
http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&no=241
http://www.soonsin.com/213

2015년 11월 2일 월요일

visual studio에서 "이 프로젝트는 만료되었습니다" 라고 나오는 경우


1. 프로젝트 속성창에서 링커-디버깅 으로 들어가셔서 "디버그 정보 생성" 옵션을 true 로 변경한 후 리빌드

2. 솔루션에 포함된 파일중에 존재하지 않는 파일이 있는 경우. 해당 파일 찾아서 삭제

3. 소스 저장 시간이 현재 윈도우 시간과 맞지 않는 경우. 소스 파일 저장을 다시 함.


참조) http://windows2k.tistory.com/27


2015년 10월 27일 화요일

Unity 네트워크 행걸리는 문제

Q) 처음 실행할때는 이상이 없다가, 정지 시키고 다시 실행할때 행이 걸려서 유니티가 멈추는 현상

A) 아래와 같이 OnApplicationQuit에서 Session을 종료 시키니 해결됨


참고) "유니티 개발자를 위한 c#으로 온라인 게임 서버 만들기" 책