1. 개요

MySQL Version : 5.1.x

MySQL Server / Application Client 환경(C/S 환경)

 

MySQL 서버와 서버에 접속하는 클라이언트가 분리되어 있는 환경에서, 클라이언트 측에서 대용량의 쿼리 파일을 입력하기 위해 흔히 사용하는 쿼리가 LOAD DATA 쿼리이다.

 

해당 쿼리를 사용하다 발생하는 에러 중에 The used command is not allowed with this MySQL Version 이란 에러가 있다.

 

이 에러를 발생시키는 방법으론 클라이언트 동작 중에 서버의 MySQL 을 동작 중지 후, 재실행 시키면 클라이언트 프로그램에서 다시 서버에 연결하였을 때 LOAD DATA 쿼리에서 에러를 내뱉는다.

 

본 에러는 클라이언트가 서버에 접속할 때 local-infile 옵션이 해제가 되어 발생하는 문제로 흔히 mysql -u root -p --local-infile=1 database 와 같은 형태로 해결이 가능하다.

 

2. C/C++ 기반 Application 조치

개요에서 제시한 해결 방법은 mysql.exe 를 사용하여 접속할 때나 사용 할 수 있는 방법이지, Application 접속에서는 다른 방법을 사용하여야 한다.

mysql에서는 connection 전에 설정 값을 추가 할 수 있는 mysql_option 이란 함수가 존재한다.

 

본 함수는 mysql_init()와 mysql_real_connect() 사이에 호출하여야 한다.

// mysql_options
int mysql_options(MYSQL *mysql, enum mysql_option option, const void *argument)
/* 인수 */
// mysql : MYSQL 핸들
// option : 사용자가 설정하고자 하는 옵션
// argument: 옵션 값(정수 일 경우, 포인터로 가리킨다)

/* 리턴 */
// 성공 : 0
// 실패 : Non-zero

 

 

infile-local 옵션을 주기 위해서는 다음과 같이 설정하면 된다

 

int nOption = 1;
mysql_init( &Mysql );
mysql_options(&Mysql, MYSQL_OPT_LOCAL_INFILE, &nOption);
mysql_real_connect(...)

 

 

이 외의 다른 옵션들에 대해서는 http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html 를 참조한다.

 

 

 

'Database > Mysql' 카테고리의 다른 글

processlist unauthenticated user 해결 방법  (0) 2013.07.03

 

 

 

 

 

 

 

 

1. 개요

Web Server와 Database가 분리되어 있는 환경에서 발생하는 문제점으로 이 문제를 해결하지 않고 그대로 놔 두게 되면 max_connections 값만큼 프로세스를 차지하게 되어 다음 연결부터는 too many connections 라는 문구를 보게 될 것이다.

 

2. 원인

mysql 서버의 경우 ip주소로 클라이언트 접속이 들어오게 되면 해당 ip에 대한 resolving을 수행하게 된다. 즉, 접속한 네가 누구냐? 라고 묻게되는 건데 문제는 이 질의에 대해 정상적으로 대답을 하게 되면 show processlist 상에 ip 부분이 이름으로 나오게 되지만 네트워크 환경이 느려 dns server의 대답이 늦어지게 된다면 그만큼 connection을 유지하고 있는 문제가 발생하게 된다.

 

3. 해결

mysql 구동시 --skip-name-resolve

 

혹은 my.cfg 파일에서

[mysqld]

...

skip-name-resolve

skip-host-cache

 

두 줄을 추가해 주고 데몬을 재시작 하면 된다.

'Database > Mysql' 카테고리의 다른 글

LOAD DATA local 이슈  (1) 2013.07.17

1. 개요

Dialog 기반 소스 생성 시 Enter, ESC 키를 누르면 다이얼로그가 바로 종료 되는 문제점을 개선해 보도록 한다.

 

2. 소스코드

ResourceView의 다이얼로그를 하나 열고 Ctrl + w 키를 눌르 매니저를 호출한다.

Message Maps에서 Object ID를 다이얼로그 아이디로 선택하고 Messages에서 PreTranslateMessage를 더블클릭하여 함수를 생성한다.

 

BOOL CViewerDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
		return TRUE;
	return CDialog::PreTranslateMessage(pMsg);
}

 

 

다음의 소스 코드를 입력한다.

'프로그래밍 > C++' 카테고리의 다른 글

[C/C++ OLE DB] DB 연결 문자열 쉽게 만들기  (0) 2014.04.17
SNMP OID  (0) 2013.10.17
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
시간 구조체  (0) 2013.04.26
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24

 

 

 

 

 

 

 

 

1. 개요

MFC 프로그래밍을 하다 보면 많은 데이터를 화면에 표시하는데 있어 시간이 오래 걸릴 경우 프로그램이 죽지 않았다는 것을 표시하기 위해 많이 쓰는 것이 바로 마우스 커서 모양을 변경 시키는 부분일 것이다. MFC 에서는 아주 간단하게 커서 모양을 모래시계로 바꿀 수가 있다.

 

2. 소스코드

BeginWaitCursor();
Sleep(...)
EndWaitCursor();

위의 소스에서 Sleep 으로 표시 한 부분에 오래 걸리는 작업을 넣어 두면 된다.

단, 위의 소스로 안 되는 경우가 많은데(Thread로 분리해서 사용 하는 경우) 그럴 때는 직접 시작 전에 커서를 바꿔주고, 작업이 종료 되는 시점에서 다시 커서를 변경 해 주면 된다.

HCURSOR hCursor;     
hCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);     
SetClassLong(*AfxGetMainWnd(),GCL_HCURSOR,(LONG)hCursor);

작업영역

hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);     
SetClassLong(*AfxGetMainWnd(),GCL_HCURSOR,(LONG)hCursor);

이렇게 하면 커서를 직접적으로 변경하는 것이기 때문에 해당 영역 안에서 커서가 수정이 된다.

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
시간 구조체  (0) 2013.04.26
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24
헝가리안 표기법  (0) 2013.04.24

 

 

 

 

 

 

 

 

<ListView

android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000" />

 

 

 

 

 

 

 

 

1. 개요

WebDav(Web Distributed Authoring and Versioning, 웹 분산 저작 및 버전 관리)는 HTTP의 확장으로 WWW서버에서 저장 된 문서와 파일을 편집 관리하기 위한 도구이다.

(참조 : http://ko.wikipedia.org/wiki/WebDAV)

 

보통 자신의 컴퓨터를 웹 서버로 설정하여 스마트폰을 통해 웹서버에 접근해 문서, MP3, 이미지 등을 가져오는 형식으로 많이 사용하고 있다.

 

2. 설정 방법

[1]

[제어판 - 프로그램 및 기능 - Windows 기능 사용/사용 안함] 클릭하여 나타나는 창에 다음의 이미지에 표시 된 부분을 체크하여 준다.

 

[2]

[제어판 - 관리도구 - IIS(인터넷 정보 서비스) 관리자] 실행하여 나오는 창에서 다음의 이미지에 표시 된 곳으로 이동하여 인증을 더블 클릭 한다.

나타나는 인증 메뉴에서 다음 이미지와 같이 설정한다.

 

 

[3]

[2]의 처음 이미지의 목록 중에서 WebDAV 제작 규칙을 더블 클릭한다.

 

우측의 제작 규칙 추가를 클릭하여 나타나는 창을 다음의 이미지와 같이 설정한다. 

 

제작 규칙 목록에 규칙이 나타나면 우측의 WebDAV 사용을 클릭한다.

 

[4]

WebDAV 설정이 완료되고 나서, 실제 파일이 저장 될 폴더를 설정해 줘야한다.

Default Web Site 항목을 우클릭하여 나타나는 메뉴에서 가상디렉토리 추가를 클릭한다.

 

나타나는 창에서 실제 사용할 디렉토리 선택(이미지 하단의 경로)하고, 웹 상에서 접근 할 수 있는 이름(별칭)을 입력한다.

 

여기까지 수행하고 Default Web Site를 재시작 하면 WebDAV에 연결 할 수 있다.

 

3. 계정 권한

WebDAV에 접속하기 위해서는 계정과 비밀번호가 필요하다. 제어판에서 윈도우에서 사용하는 계정을 하나 만들어 비밀번호를 설정하도록 한다. [제어판 - 사용자 계정] 에서 임의의 계정을 발급한다.

 

4. 접속

내컴퓨터를 열어 상단의 [네트워크 드라이브 연결]을 클릭한다.

 

나타나는 창에서 접속 정보를 입력한다.

검게 칠해진 부분이 실제 WebDAV가 설정 된 서버 IP이고 따로 포트 번호를 변경하지 않았다면 웹의 Default 포트번호(80)가 자동으로 사용된다.

IP뒤에 입력 된 [/uploads]가 설정[4] 에서 입력한 별칭의 이름이다.

 

마침을 클릭하고 연결이 완료 되면 계정 정보를 묻는 창이 나타난다.

여기에 아까 제어판에서 등록 한 계정과 비밀번호를 입력한다.

 

다음과 같이 내컴퓨터에 드라이브가 등록 되면 연결이 완료 된 것이다.

 

5. 기타사항

WebDAV를 사용하다보면 가끔 파일을 받을 수 없는 경우가 나타나곤 한다.

이는 웹 서버에 있는 파일의 확장자가 WebDAV에서 지원하지 않는 확장자 일 때 발생하는 경우로, 이럴 땐 확장자의 MINE 형식을 등록하여 주면 된다.

 

설정의 [2] 이미지에 보면 MIME 형식이라는 것이 있다. 더블클릭 하자.

 

상속 된 유형은 흔히 사용되는 MIME 타입이다.

여기 사용하고자 하는 타입을 추가하면 된다. 우측 패널의 추가를 클릭한다.

 

 

나타나는 창에서 사용할 확장자와 해당 MIME 형식을 지정하여 주면 끝.

 

1. 개요
프로그래밍을 하다보면 날짜를 하루 씩 증가 시킬 필요가 발생한다
보통 단순히 날짜에 1씩 증가시키면 되지만.....
만일 한 달이 넘어 간다면?
일 년이 넘어간다면?
2월 윤달이 껴서 29일이 되어 버리면?

이럴 땐 단순하게 1씩 증가해서는 아무 소용이 없어진다.
그렇다고 그걸 예외 처리로 if .. else if 써 가면서 일일히 했다간 머리 깨질 지도....
그런 사람들을 위해 준비했다

 

2. 소스코드

time_t  	ct;			// 현재 시간 값을 저장할 변수
struct tm *tm;	// 현재 시간을 년월일시분 단위로 저장할 구조체(이건 vc에 기본으로 선언 되어 있으니 이대로 쓰면 된다)
CString  	currentTime;		// 현재 시간을 표시하기 위한 변수
TCHAR  week[7][3] = { "일", "월", "화", "수", "목", "금", "토"};	// 요일 표시를 위한 배열

ct = time(NULL);	// 시스템으로부터 현재 시간을 가져와 ct에 저장하는 함수
ct +=  24 * 3600;	// ct에서 하루를 증가 ( 한 시간은 3600 )
tm = localtime(&ct);	// ct 값을 사람들이 알 수 있도록 tm 배열에 저장

// 년도의 경우 1900년을 기준으로 몇 년 흘러 갔는지 저장되므로 1900을 더함
// 달의 경우 0부터 시작하기 때문에 1을 더함
currentTime.Format("%04d년 %02d월 %02d일 (%s요일)", tm->tm_year+1900 tm->tm_mon+1, tm->tm_mday, week[tm->tm_wday]);

3. 구조체 원형 및 저장 된 헤더

 

#include 

struct tm
{
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
};

 

 

 멤버  의미  값의 범위
 tm_sec  초

 0-61

 tm_min  분  0-59
 tm_hour  시  0-23
 tm_mday  일  1-31
 tm_mon  월  0-11
 tm_year  년(1900 이후)

 

 tm_wday  요일

 0-6

 tm_yday  1월 1일부터 경과 일 수  0-365
 tm_isdst  서머 타임제 실시 여부

 0 이상 : 실시, 0 : 미실시, 0 이하 : 알 수 없음

 

* tm_sec 은 보통의 경우 0 부터 59 까지의 값을 가지게 되겠지만 종종 지구 자전 속도의 차이로 인해서 몇 년 마다 한 번 씩 '윤초' 를 도입하여 시간을 보정하는 경우가 있는데 이 때문에 tm_sec 의 값이 60 혹은 61 이 될 수 있다.

 

 

 

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24
헝가리안 표기법  (0) 2013.04.24

 

 

 

 

 

 

 

 

1. 개요

프로그래밍 작업을 하다보면 대개 정보를 제공해 주는 서버를 통해 파일을 가져와 파싱해 사용하는 경우가 존재한다.(예를 들어 기상청의 기상정보 xml 파일을 가져온다는 등)

이를 위해 실제 파일을 가져 올 수 있는 함수가 존재하여 포스팅 해보도록 하겠다.

 

2. 소스

HINTERNET   m_hInternet, m_hURL;	// URL 파일 다운에 필요한 핸들
DWORD dwValue = 10000;
HANDLE hFile;	// 다운 받은 파일 저장 핸들
DWORD dwSize = 0, dwRead = 0, dwWritten = 0;

// Set Internet Open
m_hInternet = InternetOpen ("AZITROAPPDOWN", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

 
// Open Option
InternetSetOption (m_hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_SEND_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue));

// URL Open
m_hURL= InternetOpenUrl (m_hInternet, "파일을 다운 받을 URL 주소", NULL, 0, INTERNET_FLAG_RELOAD, 0);
 

// URL Open 실패를 방지 하기 위한 루틴
TCHAR *szStatusCode = (TCHAR*)malloc(10000);
DWORD dwInfoSize = sizeof(szStatusCode);
HttpQueryInfo(m_hURL, HTTP_QUERY_STATUS_CODE, szStatusCode, &dwInfoSize, NULL);
long nStatusCode = _ttol(szStatusCode);

if(nStatusCode == HTTP_STATUS_OK)
{
	// 다운 받은 파일을 저장할 파일 생성
	hFile = CreateFile (szAlertPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	InternetQueryDataAvailable (m_hURL, &dwSize, 0, 0);	// 파일로 저장할 버퍼 크기 알아냄
	InternetReadFile (m_hURL, pDownBuf, dwSize, &dwRead);	// 알아낸 크기 만큼 읽기(dwRead는 실제 읽은 크기)
	WriteFile (hFile, pDownBuf, dwRead, &dwWritten, NULL);	//  읽은 크기만큼 저장
}
	
// 사용이 끝난 핸들 비우기
InternetCloseHandle (m_hURL);
m_hURL = NULL;
InternetCloseHandle (m_hInternet);
m_hInternet = NULL; 

 

3. 이슈

한글 URL 인식 이슈 : http://blog.naver.com/sin_01/70147909216 참조

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
시간 구조체  (0) 2013.04.26
헝가리안 표기법  (0) 2013.04.24

 

 

 

 

 

 

 

1. 헝가리안 표기법이란?

헝가리안 표기법은 Microsoft의 Charles Simonyi 박사가 고안 한 것으로 표준 코딩 규칙을 정하기 위해 도입한 방법론

프로그래밍에서 사용하는 변수의 이름을 지정하는 규칙을 말함

 

2. 헝가리안 표기법 규칙

변수 타입

접두어
int n
long l
double d

bool

b
string str
char sz
pointer(*) p
함수 포인터 fn

핸들

h

맴버변수

m_
전역변후 g_
클래스 C

ex)

int nNumber;

bool bFlag;

CString strMessage;

 

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
시간 구조체  (0) 2013.04.26
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24

+ Recent posts