태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

버클리디비를 계속해서 쓰는데..검색이 안 되는 겁니다.

들어가는건 확실히 눈에 보이는데 말이죠.

근데 이게 웃긴게..DB에 집어 넣는 코드에서 마지막에 다 집어넣고 나서 검색하는 코드를 추가해서

검색을 하면 검색이 됩니다.

하지만 따로 검색하는 코드를 구현해서 프로그램으로 만들어서 실행해보면 아무것도 검색이 되지 않습니다.

저도 그래서 이걸로 윈도우에서 400줄 2번 짜고 무너트리고 리눅스에서 300줄 4번 짜고 무너트리고..

총 2000여줄을 쓰고 다시 무너트렸습니다.

결론 부터 말씀드리자면

DB를 다 쓰고 나서 마지막에 꼭 닫는 함수를 작성하십시오.

그럼 검색 잘 됩니다.

dbp->close(dbp,0)
중요합니다!!!
버클리디비가 RSS에서 검색이 되지 않아서 -_-)   (펌글로 오해 하는 바람에 막아놨음 -_-);;;; )

본의 아니게 많은 사람들에게 유용한 정보를 제공하기 위해서 같은 블로그에다가

링크를 달게 되었습니다 -_-);


버클리디비 사용기 - http://shine-ing.tistory.com/8
버클리디비 사용법 - http://shine-ing.tistory.com/7

버클리디비 윈도우 버전을 다운 받은 후에 설치를 마무리 짓는다.


이제부터 허우적거리기 시작해야 한다.-_-;;


필자는 이거 알아내는데 (일단 간단한 테스트만 해보았지만) 4일 걸렸다.


솔직히 리눅스로 작업을 다 끝내놓은 상태였는데 굳이 윈도우로 할 필요는 없었다.


하지만 나도 모르게 오기가 발동해서 결국 알아버렸다........


사용하는 법을 알아보자


환경

Windows XP SP2 (x86)

Visual Studio 2005(.cpp)


사용순서

1. 일단 자신의 컴퓨터에서 버클리 DB가 설치된 경로에서 bulild_windows를 찾는다. 그 후에 "Berkeley_DB" 라는 워크 스페이스를 찾아서 더블 클릭한다. 이때 확인 창이 뜨는데 "모두 예"를 눌러주자

Berkeley_DB Workspace를 더블클릭

Yes to all 클릭


2. 이제 빌드를 해야 하는데 빌드를 하기 전에 해야 할 일이 있다. 여기가 중요한 부분이니 잘 따라하길 바란다.

좌측의 솔루션 탐색기에서 build_all 위에 있는 "솔루션 'Berkeley_DB'"를 한번 클릭한다.(선택을 하는 것임)

그 다음에 위의 메뉴에서 "프로젝트 -> 속성"을 클릭

좌측의 트리메뉴에서 "구성속성"클릭

그럼 상단에 "구성(C) : " 이라고 있고 그 오른쪽에는 "플랫폼(P)" 라고 있을 것이다.

이 부분을 "Release x86" 으로 바꿔줘야 한다. 그러기 위해서는 오른쪽에 있는 "구성 관리자"를 누른다.

상당의 활성 솔루션 구성을"Release x86"으로 바꿔준다.

속성 페이지의 변경사항을 저장하겠습니까? 라는 창이 뜬다 예 를 눌러준다.

닫기

확인

이제 좌측 솔루션 탐색기에서 build_all을 우클릭 하여서 빌드를 실행한다.


시간이 좀 걸릴것이다.  에러도 많이 뜰 것이다. 개의치 말아라~ 원래 그런건가 보다 -_-;;;


자 이제 visual studio2005 창을 끄고


빌드가 잘 실행 되었는지 확인해 보자.


아까 설치된 build_windows의 폴더안에

Realease 라는 폴더가 생성되었다면 성공한것이다.


거기서 *.lib 파일을 눈여겨 보아 두어라.


잠깐!! 이제 곧 소스를 공개해서 실행을 해 볼텐데 그 전에 주의 사항이 있다.


헤더파일에 #include <db.h> #include <db_cxx.h> 가 포함되어야 한다.

그렇기 때문에 헤더파일 경로를 지정해 주어야 하는데 이 부분을 다들 알아서 할거 라고 믿는다.


모르시는 분은 댓글로 남겨 주는 센스!!


이제 첨부한 소스를 살펴보자.



#include <db.h>

#include <db_cxx.h>

#include <iostream>

#include <string>

#include <cstdlib>

#include <cstdio>

using namespace std;

int main()

{

DB *dbp;

DBT key,data;

//dp->db_create(&dp,NULL,0);

const char *name = "TEST.DB"

char buff1[20];

int isOK,cnt;

printf("<<<<<<<<<<< Start of Berkeley DB >>>>>>>>>>>>>>>> ");

if((isOK = db_create(&dbp,NULL,0)) != 0 )

{

printf("Can`t Create DB ");

return -1;

}

cnt = 10;

if((isOK = dbp->open(dbp,NULL,"TEST.DB",NULL,DB_BTREE,DB_CREATE,0)) != 0)

{

printf("Can`t Open DB ");

return -1;

}

cin>>buff1;

key.flags = 1;

key.data = (char*)buff1;

key.size = strlen(buff1);

cout<<"key`s data : "<<(char*)key.data<<endl<<"key`s size : "<<key.size<<endl;

memset(&data,0,sizeof(DBT));

if(dbp->get(dbp,NULL,&key,&data,0) < 0)

{

cout<<"Can`t Find "<<buff1<<endl;

data.data = (unsigned int*)&cnt;

data.size = sizeof(unsigned int);

dbp->put(dbp,NULL,&key,&data,0);

}

else

cout<<"founded "<<buff1<<endl;

cout<<"!"<<endl;

dbp->close(dbp,0);

return 0;

}



긁어 넣어서 직접 정렬해서 보기 바란다.


컴파일후 실행 ㄱㄱ


안될것이다 -_-;;;;;;; 필자는 여기서 캐삽질을 했다......


그 이유는 아까 눈여겨 보았던 *.lib 파일의 부재 때문이다.


좌측 솔루션 창에서 오른쪽 마우스 버튼을 누른후에 "추가"버튼을 누른다.


그 후에 기존항목을 선택.


파일 선택창이 뜨는데 이제 여기서

확장자명 혹은 파일 종류 선택하는 곳에서 "모든파일"을 선택한다.

아까 Release로 들어간다.

이 폴더 안에 있는 .lib 파일 중에서 libdb_small46s.lib 를 선택한후에 추가한다.


이제 컴파일을 해보면 잘 된다.


혹시 개 중에 한되는 사람이 있으면 다른 .lib 파일들을 첨부해서 해보기를 바란다.


소스에 대한 자세한 사항들은 api 문서에서 찾을 수 있을 것이다.


* 혹시 DBT key에서 key.flag 를 어떻게 해줘야 하는 건지 아시는 분들은 저에게 좀 알려주세요.. 저는 그냥 1로 해놨는데

잘 되더군요 -_-);;; 자세한 설명 부탁드립니다.

================================================================================================
Release안에서 위에서 언급한 .lib를 못찾는 경우가 발생하네요.. 저 같은 경우에도 포맷하고 다시 빌드를 했더니 안되네요 -_-);; 혹시 안되시는분 있으시면 릴리즈가 아닌 디버그 x86으로 한번 시도해 보시길 바랍니다.

일단 버클리 디비를 리눅스에서 사용해 봤는데 진짜 빨랐다.


그 전에 SQL을 써봤었는데 삽입하는 과정에서 그 보다 훨씬 빠른 속도를 보였다.


SQL이 1시간이 걸렸다고 하면 버클리디비는 약 20초면 끝났다.


하지만 SQL처럼 DB를 직접 눈으로 확인할수 없고 get을 사용하여서 콘솔에 출력을 해야지만 확인을 할 수 있다는 단점이있다.