큐브리드2010/03/08 01:26
databases 디렉토리에 이미 생성하고자 하는 데이터베이스명으로 된 디렉토리가 존재할 경우 오류처리가 되지 않고 데이터베이스 생성 프로세스로 넘어가서 CM Server로부터도 정상적인 오류 메시지를 받지 못하는 문제로
서버에 연결할 수 없습니다. CUBRID 매니저 서버의 구동 상태와 연결 설정(Port,IP등)을 점검하십시오.
와 같은 오류 메시지가 출력되어 왔습니다. 데이터베이스 생성전 디렉토리 검사 프로세스에서 존재시 오류 메시지를 출력하는 것이 더 좋은 방법이라 생각되어 오류 메시지를 추가하였습니다.

-- 목적 데이터베이스명(디렉토리명)으로 된 디렉토리가 존재하지 않을 경우
task:checkdir
status:success
note:none
noexist:C:\CUBRID\databases\testdb

-- 이미 존재할 경우
task:checkdir
status:success
note:none


// if a directory is not exists, display a alert window.
if (dirs == null || dirs.length == 0) {
    Display.getDefault().syncExec(new Runnable() {
        public void run() {
            CommonTool.openErrorBox(getShell(),
                    Messages.bind(Messages.msgExistDbFound, databaseName));
            isCanFinished = false;
            getShell().setVisible(true);
        }
    });
}

저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2010/03/04 01:17
한줄로 자랑하는 큐브리드 적용 스토리! 여러분도 함께 참여해 보세요. 

저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2010/01/29 22:01
2008년 NHN DeView 1회의 소식을 들었을 때 참석하고 픈 마음이 있었지만 개인 사정으로 갈 수 없었습니다. 회사 개발자분들이 다녀온 이후에 팜플렛을 통해 큐브리드의 오픈소스 소식을 듣게 되었습니다.


다짐1! 라이센스 제약없이 무료로 쓸 수 있고 소스까지 공개된 국산 오픈소스 DB로 교체하자!

그 이후로 고난의 연속이었습니다. 취지는 좋았지만 기반 시스템을 바꾼다는 게 그리 쉬운 일은 아니었지요. 고난의 길을 지나서 지금은 안정화가 되었고 회사에도 큰 도움이 되었습니다만, 작년 한해는 튜닝하지 못한 raw 상태 그대로의 DBMS로 고생 좀 했었지요(MySQL에 너무 익숙해 있었는가 싶습니다).


다짐2! 큐브리드 매니저, 불편하네. 고쳐 써 보자!

그런 생각으로 인사이드 모임 1회부터 차근 차근 나가게 되었습니다. 소스 트리를 헤집어 놓아서 큐브리드 관계자 분들을 당황스럽게 만들기도 했었구요. 그렇게 그렇게 알게된 인연으로 좋은 분들 많이 만나게 되었습니다. 개인적으로 마음을 터놓고 지내는 분도 생겼구요. 불편해서 시작한 개인적인 목적의 개발이었는데 어쩌다보니 다른 분들이 큐브리드를 편리하게 쓸 수 있도록 했으면 하는 마음이 생겼습니다. 그래서 개인 시간을 더 쓰면서 소스를 분석하고 글을 쓰고 코드를 만들게 되었습니다.


다짐3! 개발자 확산에 힘쓰자!

시도도 제대로 못해봤었습니다. 노력 부족이었다고 판단하지만, 나름대로는 바빠서라고 핑게를 대곤 합니다. 혼자서 하는 것보다 여럿이서 하는 게 더 즐겁고 성과도 더 빛나는 거라 생각이 듭니다. 그러나, 월화수목금금금하는 현실에서 개인 시간을 쪼개어 오픈소스 개발을 할만큼 여유가 있는 분들은 드물지 않을까 생각합니다. 회사에서 코드 보는 것도 지겨운데 집에서도 코드를 봐야해? 라고 반문할 수 있겠지요. 블로터 인터뷰에서 "코드를 보면 피로가 풀려요"라는 말 한마디에 졸지에 워커홀릭이 되어버렸지만, 내가 좋아하고 좋아하는 개발을 언제 어디서든 할 수 있다는 것을 항상 하느님께 감사드리며 여전히 코드로 피로를 풀고 있습니다(^^;). 이런 분들 어디 계시면 연락을~. 2009년은 큐브리더로서 최소한의 역할을 수행하는 정도였다고 생각합니다.


다짐4! 큐브리드 인사이드 발표도 해보자!

언젠가 제안이 들어왔지요. 현재 개발하고 있는 부분을 발표해 보는 게 어떤가? 그렇게 하면 좀 더 개발자들이 참여할 수 있지 않을까 하는 생각에 선뜻 받아들였습니다. 근데, 안면도 없는 분들 앞에서 하는 게 어렵긴 어려웠습니다. 그러나 이것도 경험이다 싶어서 하고 나니 할만 했었지요.


다짐5! DeView 함 해보자!

네이버의 개발자 행사인 DeView 2009에 세션 발표자로 서게 되었습니다. 이것도 외부 참여 개발자가 튜터리얼 세션을 진행하면 좋지 않겠는가? 그런 제안에 선뜻 받아들였습니다. 인사이드 발표도 했는데 뭘~ 하면서요^^ 자료 준비하는 데 노력이 많이 들었습니다. 오신 분들 시간을 아껴드려야하기에 대충 할 수 없는 거죠. 결국 내용이 많아 참석하신 분들을 숙박비 없이 재워드렸습니다. 그날 OKJSP의 허광남님이 보러 오셨는데요. 그분의 세미나 스타일을 좋아합니다. 재밌게 이야기를 풀어나가는 능력이 몸에 배어 있다고나 할까요. 그 내공 언젠가는 저도 익히게 되리라 믿습니다. 여튼 좋았었습니다.


다짐6! I Do Code, 그래 이왕 하는 거면 거기에 내보는 것도 좋지!

지금은 시간 투여할 여력이 없어서 잠시 보류해두고 있는 프로젝트가 있습니다. 큐브리드 DBMS와 큐브리드 매니저와는 Cubrid Manager Protocol로 데이터를 교환하는데, RCP로 개발된 Cubrid Manager 뿐만 아니라 MySQL에서 익숙해 있었던 저로서는 phpMyAdmin 스타일의 DBMS 관리툴이 절실히 필요했었습니다. 그런 이유로 비 접속 유지 프로토콜인 HTTP에서도 불편없이 사용할 수 있도록 cm broker와 cubrid web manager를 개발하게 되었는데, 퇴근 후에 밤늦게까지 PC와 씨름하던 그 무더웠던 여름날이 아직도 잊혀지지 않습니다. 하루 3~4시간을 자면서 그렇다고 회사에 누가 되지 않도록 최선을 다했던 기억이 듭니다. 지금 다시 하라면 못할 듯 합니다만, 생각해보면 뿌듯합니다. 그래서 NHN에서 대상을 타는 영광을 누리지 않았나 생각해봅니다.


이렇게 지난 2009년을 큐브리드와 함께 보냈습니다. 힘든 기억도 즐거운 기억도 새로운 경험도 많이 했었던 한해였습니다. 2010년의 목표는 큐브리드가 좀 더 많이 사용하게 되고 그로 인해 많은 유저가 알게 되고 많은 개발자가 개발에 참여하게 되고 기능과 안정성이 더 좋아져서 국산 시스템 소프트웨어로서 세계에서도 인정받을 수 있는 밑거름이 되려고 노력하려고 합니다. 그러면 저는 무료로 잘 사용할 수 있겠죠^^;

저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/11/01 19:52
큐브리드 R2.0부터 제공되는 CUBRID Manager는 Eclipse의 플러그인으로 동작이 가능하도록 설계가 되어 있습니다. 그래서, 이클립스로 개발할 경우 편리하게 사용될 수 있게 되었습니다. 또한, 윈도우즈, 리눅스, 맥 등 다중 플랫폼에서 실행 가능한 독립 애플리케이션 형태로도 배포가 되고 있어서 R1.x에 비해 편의성이 좋아졌습니다.

그러나, 현재 큐브리드 매니저의 개발 목표는 큐브리드 데이터베이스 관리 도구입니다. 개발시 자주 사용되는 SQL 편집기, 데이터 편집기, 실행계획 분석기, 스키마 조회 등만 별도로 제공되는 큐브리드 전용 도구는 없습니다. CUBRID Manager는 SQL 개발도구가 아닌 데이터베이스 관리도구입니다.

SQL을 테스트하거나 테이블 구조를 조회하기 위해서도 CM 계정으로 로그인해야하는 문제가 발생합니다. 권한 부여가 가능하기는 하나 불필요하게 계정 정보가 노출 되어야 하는 문제가 발생하는 것이지요. 데이터베이스 유저 정보만으로도 JDBC 인터페이스를 통해서 충분히 접근가능한 정보들인데도 말이지요.

CUBRID 데이터베이스도 점차 확산되는 추세이다보니 양질의 개발 도구에 대한 개발자들의 니즈도 점점 증가하는 추세로 보입니다. 개발자들이 가장 절실하게 필요로 하는 도구는 바로 이와 같은 SQL 개발을 위한 그리고, 데이터 조회/편집을 위한 도구라고 생각이 됩니다.

이러한 이유로, CUBRID SQL 개발도구에 대한 니즈를 수집하고 그에 따른 개발 프로젝트를 오픈소스로 진행해보려 합니다.
관심 있으신 분들은 큐브리드 도구 개발카페로 오셔서 함께 하여 주시면 좋겠습니다.

[큐브리드도구개발카페 바로가기]

저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/18 23:20
DELETEBACKUPINFO

설명
DELETEBACKUPINFO 명령은 백업 자동화를 위한 예약 사항을 삭제하는데 사용된다. 기존에 등록된 예약 사항은 backupid로 구분이 되며,backupid 항목에는 필히 기존에 등록된 예약 사항의 backupid가 사용되어야 한다.


구문
DELETEBACKUPINFO 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다.

task:deletebackupinfo
token:{cmserver 인증후 받은 token 문자열}
dbname:{백업 대상 데이터베이스명}
backupid:{백업 자동화 아이디}


예제
demodb 데이터베이스 백업 자동화 예약 항목을 삭제하는 예제이다.

--request--
task:deletebackupinfo
token:4504b930fc1be99b56c62051e186181169c3a3d75bc217ed30e72b1bd4aa20b67926f07dd201b6aa
dbname:notexistdb
backupid:bak_daily

--response:success--
task:deletebackupinfo
status:success
note:none

--response:success(존재하지 않는 데이터베이스, 존재하지 않는 backupid)--
task:deletebackupinfo
status:success
note:none

--response:fail(데이터베이스명 및 필수 입력 사항 누락)--
task:deletebackupinfo
status:failure
note:Parameter(database name) missing in the request

※ 존재하지 않는 DB명 및 존재하지 않는 backupid를 입력하더라도 에러는 발생하지 않는다. 다만, 정상적으로 삭제되지는 않을 뿐이다.
저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/18 23:19
SETBACKUPINFO

설명
SETBACKUPINFO 명령은 백업 자동화를 위한 예약 사항을 변경하는데 사용된다. 기존에 등록된 예약 사항은 backupid로 구분이 되며, backupid 항목에는 필히 기존에 등록된 예약 사항의 backupid가 사용되어야 한다.


구문
SETBACKUPINFO 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다. 참고로, SETBACKUPINFO와 ADDBACKUPINFO의 구문은 동일하다.

task:setbackupinfo
token:{cmserver 인증후 받은 token 문자열}
dbname:{백업 대상 데이터베이스명}
backupid:{백업 자동화 아이디}
path:{백업될 경로}
period_type:{Monthly or Weekly or Daily or Special, 기간 유형}
period_date:{1-31/Monthlyor Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday/Weekly ornothing/Daily, yyyy-mm-dd/Special}
time:{hhmi, 백업시간(시분)}
level:{0-2, 백업레벨}
archivedel:{ON or OFF, 아카이브 로그 파일 삭제 여부}
updatestatus:{ON or OFF, 통계정보 업데이트 여부}
storeold:{ON or OFF, 이전 백업 보존 여부}
onoff:{ON or OFF, 온라인 및 오프라인 백업}
zip:{y or n, 백업파일 압축 여부}
check:{y or n, 데이터 일관성 체크 여부}
mt:{n >= 0, 병렬백업 쓰레드 개수}


예제
demodb 데이터베이스 백업 자동화 예약 항목을 변경하는 예제이다.

--request--
task:setbackupinfo
token:4504b930fc1be99b4eaf9ddf7d52f6e3d0e5415096e0ca7230e72b1bd4aa20b67926f07dd201b6aa
dbname:demodb
backupid:bak_daily
path:/opt/frameworks/cubrid/databases/demodb/backup
period_type:Daily
period_date:nothing
time:1230
level:1
archivedel:ON
updatestatus:OFF
storeold:ON
onoff:ON
zip:y
check:y
mt:0

--response:success--
task:setbackupinfo
status:success
note:none

--response:success(존재하지 않는 데이터베이스, 존재하지 않는 backupid)--
task:setbackupinfo
status:success
note:none

--response:fail(데이터베이스명 및 필수 입력 사항 누락)--
task:setbackupinfo
status:failure
note:Parameter(?) missing in the request

※ 존재하지 않는 DB명 및 존재하지 않는 backupid를 입력하더라도 에러는 발생하지 않는다. 다만, 정상적으로 변경되지는 않을 뿐이다.
저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/18 23:19
ADDBACKUPINFO

설명
ADDBACKUPINFO 명령은 백업 자동화를 위한 예약 사항을 등록하는데 사용된다. 백업 자동화란 일정 주기 또는 특정 일자에 백업이 자동으로 수행되도록 설정해두는 일종의 예약 시스템이라고 할 수 있다.


구문
ADDBACKUPINFO 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다.

task:addbackupinfo
token:{cmserver 인증후 받은 token 문자열}
dbname:{백업 대상 데이터베이스명}
backupid:{백업 자동화 항목 구분을 위한 적절한 아이디를 부여}
path:{백업될 경로}
period_type:{Monthly or Weekly or Daily or Special, 기간 유형}
period_date:{1-31/Monthly or Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday/Weekly or nothing/Daily, yyyy-mm-dd/Special}
time:{hhmi, 백업시간(시분)}
level:{0-2, 백업레벨}
archivedel:{ON or OFF, 아카이브 로그 파일 삭제 여부}
updatestatus:{ON or OFF, 통계정보 업데이트 여부}
storeold:{ON or OFF, 이전 백업 보존 여부}
onoff:{ON or OFF, 온라인 및 오프라인 백업}
zip:{y or n, 백업파일 압축 여부}
check:{y or n, 데이터 일관성 체크 여부}
mt:{n >= 0, 병렬백업 쓰레드 개수}


예제
demodb 데이터베이스 백업 자동화 예약 항목을 등록하는 예제이다.

--request--
task:addbackupinfo
token:4504b930fc1be99b4eaf9ddf7d52f6e3d0e5415096e0ca7230e72b1bd4aa20b67926f07dd201b6aa
dbname:demodb
backupid:bak_monthly
path:/opt/frameworks/cubrid/databases/demodb/backup
period_type:Monthly
period_date:1
time:1230
level:0
archivedel:ON
updatestatus:ON
storeold:ON
onoff:ON
zip:y
check:y
mt:0

--response:success--
task:addbackupinfo
status:success
note:none

--response:success(존재하지 않는 데이터베이스)--
task:addbackupinfo
status:success
note:none

--response:fail(데이터베이스명 입력누락)--
task:addbackupinfo
status:failure
note:Parameter(database name) missing in the request

※ 존재하지 않는 DB명을 입력하더라도 에러는 발생하지 않는다.
저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/18 23:18
GETBACKUPINFO

설명
GETBACKUPINFO명령은 백업 자동화 예약된 항목의 상세 정보를 조회하는데 사용된다.


구문
GETBACKUPINFO 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다.

task:getbackupinfo
token:{cmserver 인증후 받은 token 문자열}

dbname:{조회할 데이터베이스명}


예제
demodb 데이터베이스 백업 자동화 예약 항목을 조회하는 예제이다.

--request--
task:getbackupinfo
token:4504b930fc1be99b9cb8c885a0e8674a4ea3fcd68c6ea61530e72b1bd4aa20b67926f07dd201b6aa
dbname:demodb

--response(백업 예약 항목이 1건)--
task:getbackupinfo
status:success
note:none
dbname:demodb
dbname:demodb
backupid:bak_monthly
path:/opt/frameworks/cubrid2/databases/demodb/backup
period_type:Monthly
period_date:1
time:1230
level:0
archivedel:ON
updatestatus:ON
storeold:ON
onoff:ON
zip:y
check:y
mt:0

--response(백업 예약 항목이 1건 이상)--
task:getbackupinfo
status:success
note:none
dbname:demodb
dbname:demodb
backupid:bak_monthly
path:/opt/frameworks/cubrid2/databases/demodb/backup
period_type:Monthly
period_date:1
time:1230
level:0
archivedel:ON
updatestatus:ON
storeold:ON
onoff:ON
zip:y
check:y
mt:0
dbname:demodb
backupid:bak_daily
path:/opt/frameworks/cubrid2/databases/demodb/backup
period_type:Daily
period_date:nothing
time:1230
level:1
archivedel:ON
updatestatus:OFF
storeold:OFF
onoff:ON
zip:y
check:y
mt:0

--response:success(존재하지 않는 데이터베이스)--
task:getbackupinfo
status:success
note:none
dbname:notexistdb

--response:fail(데이터베이스명 입력누락)--
task:getbackupinfo
status:failure
note:Parameter(database name) missing in the request


※ 이 명령은 백업 자동화와 관련이 있으므로 GETBACKUPINFO 보다는 BACKUPPLANLIST가 더 맞을 듯 하다.
※ 존재하지 않는 DB명을 입력하더라도 에러는 발생하지 않으며 dbname항목만 추가가 되어서 반환된다(CM서버의 오류로 판단된다).
저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/18 23:18
GETBACKUPLIST

설명
GETBACKUPLIST 명령은 각 백업 레벨(0~2)별 백업 파일의 경로 정보를 조회하는 데 사용된다. 단, 레벨별로 최종 백업 정보만 조회가 가능하며, 상위 레벨의 백업이 되면 하위 레벨의 내역은 제외되어 출력된다. 즉, 2레벨까지 모두 백업된 이후에 1레벨을 백업하면 2레벨의 정보는 자동으로 제외될 것이다.


구문
GETBACKUPLIST 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다.

task:getbackuplist
token:{cmserver 인증후 받은 token 문자열}

dbname:{조회할 데이터베이스명}


예제
demodb 데이터베이스 백업 이력을 조회하는 예제이다.

--request--
task:getbackuplist
token:4504b930fc1be99b9cb8c885a0e8674a4ea3fcd68c6ea61530e72b1bd4aa20b67926f07dd201b6aa
dbname:demodb

--response--
task:getbackuplist
status:success
note:none
level0:/opt/frameworks/cubrid2/databases/demodb/backup/demodb_backup_lv0
level1:/opt/frameworks/cubrid2/databases/demodb/backup/demodb_backup_lv1
level2:/opt/frameworks/cubrid2/databases/demodb/backup/demodb_backup_lv2

--response:fail(존재하지 않는 데이터베이스)--
task:getbackuplist
status:failure
note:Can not find the directory database(notexistdb) is located

--response:fail(데이터베이스명 입력누락)--
task:getbackuplist
status:failure
note:Parameter(database name) missing in the request
저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/07/13 23:53
CLASS

설명
CLASS 명령은 테이블(클래스) 또는 뷰(가상클래스)의 속성, 제약조건 등의 스키마 정보를 확인하는 데 사용된다.


구문
CLASS 명령의 문법은 다음과 같다. 볼드체는 필수 입력 정보이다.

task:class
token:{cmserver 인증후 받은 token 문자열}

dbname:{조회할 데이터베이스명}
classname: {조회할 테이블 및 뷰 명}


예제
demodb 데이터베이스 백업 정보를 조회하는 예제이다.

--request--
task:class
token:4504b930fc1be99bcd937c8bdb7f87608375a218acf865b0918e032c738469ff7926f07dd201b6aa
dbname:demodb
classname:code

--response--
task:class
status:success
note:none
open:classinfo
dbname:demodb
classname:code
type:user
owner:PUBLIC
virtual:normal
open:attribute
name:s_name
type:character(1)
inherit:code
indexed:n
notnull:n
shared:n
unique:n
default:
close:attribute
open:attribute
name:f_name
type:character varying(6)
inherit:code
indexed:n
notnull:n
shared:n
unique:n
default:
close:attribute
close:classinfo

--response:fail(존재하지 않는 데이터베이스)--
task:class
status:failure
note:Failed to connect to database server, 'notexist', on the following host(s): localhost

--response:fail(존재하지 않는 테이블 또는 뷰)--
task:class
status:failure
note:Unknown class "notexisttbl".

--response:fail(데이터베이스명 또는 테이블/뷰명 입력 누락)--
task:class
status:failure
note:Function called with missing or invalid arguments.
저작자 표시 비영리 변경 금지
Posted by 종이비행기