2010-07-30 4 views
13

FOpen, FRead, FWrite, FSeek 및 FClose를 사용하여 Netburner 내장 장치 (비 윈도우) 용 사용자 지정 VFS (가상 파일 시스템)을 구현하려고합니다. 나는 VFS의 FOpen * 버전을 찾을 수 없다는 것에 놀랐다. 그것은 임베디드 장치에 훨씬 더 휴대 가능하게 만들 것입니다.FOpen을 사용하는 SQLite VFS 구현 가이드 라인 *

여기에 SQLite 용 VFS를 만드는 방법에 대한 정보가 있습니다. http://sqlite.org/c3ref/vfs.html 정보가 매우 상세하며 구현에 대한 다른 많은 질문이 있습니다.

나는 Windows, OS2, Linux 용 SQLite 소스 코드에 몇 가지 예제 VFS가 있지만 주석이 많지 않고 소스 코드 만있다.

위의 링크와 예제에서 제공하는 정보를 사용하여 맞춤 VFS를 만들 수 있지만, 내가 그렇게 한 경우 뭔가 놓칠 수 있습니다.

내 질문은 :

  • 내가 놓친 거지 SQLite는 VFS에 대해 더 이상 문서가 있나요? 어쩌면 구현 가이드일까요?
  • 사용할 수있는 SQLite VFS의 Fopen 버전이 있습니까?
  • 일단 내가 만든 사용자 정의 SQLite VFS를 테스트 할 수있는 단위 테스트 코드가 있습니까?
  • 공유하고 싶은 SQLite VFS 구현시 제안, 의견 및 경험.
+0

임베디드 장치에서 Linux를 실행하는 경우 왜 새로운 SQLite VFS를 구현해야합니까? –

+0

그것의 리눅스 또는 Windows 또는 OS2, http://www.freertos.org/의 수정 된 버전 및 리눅스/windows 라이브러리를 포함하지 않습니다 –

+1

나는 "구현 가이드 *" "구현 길드"가 아니라고 생각합니다. 길드는 장인의 조직입니다 (일종의 조합이지만, 중세). 나는 당신의 질문에 대한 좋은 대답이 없지만, 잠금 메커니즘과 의미론이 없기 때문에'fopen'과 친구들을 sqlite로 사용할 수 없다고 생각합니다. 특히 데이터가 영구 저장 장치에 도착할 때와 같이 sqlite가 필요로하기 때문에 아래로 못을 박았다. – zwol

답변

4

헤더 파일 sqlite3.h에 추가 문서가 있음을 확인 했습니까? 또한 Google 코드 검색은 친구입니다.

누락 된 항목에 대해 너무 걱정하지 마십시오. 테스트 스위트가 필요한 것입니다. 이름, 문서 및 예제 구현에서 모든 메소드의 목적을 추측 해보십시오. 첫 번째 초안 구현을 위해 가야한다. 타겟 플랫폼에서 테스트를 실행하십시오. 막대가 녹색이 될 때까지 반복합니다.

int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, 
       int flags, int *pOutFlags); 
    int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); 
    int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); 
    int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); 

사람들이다 당신의 실행 - 오프 평범한 파일 관리 기능 : 당신이 인용 인터페이스 문서의 피상적 인 독서에서, 여기에 몇 가지 교육을 추측이다. xOpen()은 읽기와 쓰기를위한 자체 포인터 메소드를 갖는 구조 sqlite3_file을 차례로 반환한다는 것을 알 수 있습니다.

void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); 
    void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); 
    void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); 
    void (*xDlClose)(sqlite3_vfs*, void*); 

이들은 공유 라이브러리 용입니다 (Linux의 경우 dlopen() 매뉴얼 페이지 참조). 임베디드 환경에서는 이들을 구현하지 않은 상태로 둘 수 있습니다 (이 값을 NULL로 설정하십시오).

int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); 

OS 표준 라이브러리가 이미 제공하지 않은 경우 난수 생성기를 구현해야 할 수도 있습니다. 작지만 좋은 linear feedback register을 제안합니다.

int (*xSleep)(sqlite3_vfs*, int microseconds); 
    int (*xCurrentTime)(sqlite3_vfs*, double*); 
    int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); 

다음은 시간 관리 기능으로, 사용중인 OS에 연결하는 데 사용됩니다.

int (*xGetLastError)(sqlite3_vfs*, int, char *); 

당신은 항상 (os_unix.c 여기를 참조 unixGetLastError :-) 덕분에 구글 코드 검색을 0을 반환하여 멀리 얻을 수 있습니다!)

행운을 빌어 요!

4

하나의 옵션은 메모리 기반 VFS를 사용하는 것입니다. 그런 다음 완료되면 파일을 메모리로 덤프하면됩니다. See : http://article.gmane.org/gmane.comp.db.sqlite.general/46450 이미 직렬화/직렬화를 지원하는 메모리 기반 VFS.

단점은 영구적으로 파일을 수동으로 작성해야한다는 것입니다. 갑자기 응용 프로그램이 종료되면 DB에 대한 중간 변경 사항은 유지되지 않습니다.

+0

VFS의 구현과 매우 계몽적인 링크가 있지만 확실하게 사용할 수 있는지 여부는 확실하지 않습니다 (http://osdir.com/ml/sqlite-users/2013-06/msg00067.html 참조) – Tibo