提交 5f3ca200 authored 作者: Thomas Mueller's avatar Thomas Mueller

Documentation

上级 62710f4f
#Translation
#Fri Jul 06 10:47:50 KST 2012
.translator=Dylan
a.help=도움말
a.language=한국어
a.lynxNotSupported=죄송하지만 Lynx는 아직 지원되지 않습니다
a.password=비밀번호
a.remoteConnectionsDisabled=죄송하지만 이 서버는 원격 연결('webAllowOthers')이 사용 중지된 상태입니다.
a.title=H2 콘솔
a.tools=도구
a.user=사용자명
admin.executing=실행 여부
admin.ip=IP
admin.lastAccess=최종 액세스
admin.lastQuery=최종 질의
admin.no=아니요
admin.notConnected=연결되지 않았음
admin.url=URL
admin.yes=예
adminAllow=클라이언트 허가
adminConnection=연결 보안
adminHttp=암호화되지 않은 HTTP 연결 사용
adminHttps=암호화된 SSL(HTTPS) 연결 사용
adminLocal=로컬 연결만 허가
adminLogin=관리자 로그인
adminLoginCancel=취소
adminLoginOk=확인
adminLogout=로그아웃
adminOthers=다른 컴퓨터에서의 연결 허가
adminPort=포트 번호
adminPortWeb=웹 서버 포트 번호
adminRestart=변경 사항은 서버 재시작 후 반영됩니다.
adminSave=저장
adminSessions=활동중인 세션
adminShutdown=종료
adminTitle=H2 콘솔 설정
adminTranslateHelp=H2 콘솔을 번역하거나 번역을 수정할 수 있습니다.
adminTranslateStart=번역
helpAction=작업
helpAddAnotherRow=행 추가
helpAddDrivers=데이터베이스 드라이버 추가
helpAddDriversText=데이터베이스 드라이버를 추가로 등록하려면 H2DRIVERS나 CLASSPATH 환경 변수에 드라이버의 Jar 파일 위치를 추가하면 됩니다. 예 (Windows): 데이터베이스 드라이버 라이브러리로 C:/Programs/hsqldb/lib/hsqldb.jar를 추가하려면 H2DRIVERS 환경 변수를 C:/Programs/hsqldb/lib/hsqldb.jar로 설정합니다.
helpAddRow=행 추가
helpCommandHistory=명령 이력 보기
helpCreateTable=새 테이블 만들기
helpDeleteRow=행 삭제
helpDisconnect=데이터베이스 연결 끊기
helpDisplayThis=이 도움말 페이지 보기
helpDropTable=테이블이 존재하는 경우 삭제하기
helpExecuteCurrent=현재의 SQL 문 실행
helpIcon=아이콘
helpImportantCommands=중요 명령
helpOperations=작동
helpQuery=테이블 질의
helpSampleSQL=샘플 SQL 스크립트
helpStatements=SQL 문
helpUpdate=행 데이터 변경
helpWithColumnsIdName=컬럼은 ID와 NAME
login.connect=연결
login.driverClass=드라이버 클래스
login.driverNotFound=데이터베이스 드라이버를 찾지 못함<br />도움말에서 드라이버 추가 방법 참고
login.goAdmin=설정
login.jdbcUrl=JDBC URL
login.language=언어
login.login=로그인
login.remove=삭제
login.save=저장
login.savedSetting=저장한 설정
login.settingName=설정 이름
login.testConnection=연결 시험
login.testSuccessful=시험 성공
login.welcome=H2 콘설
result.1row=1 row
result.autoCommitOff=자동 커밋이 중지됨
result.autoCommitOn=자동 커밋이 작동됨
result.bytes=바이트
result.characters=자
result.maxrowsSet=최대 행 개수 설정
result.noRows=행 없음
result.noRunningStatement=현재 실행중인 문 없음
result.rows=행
result.statementWasCanceled=문이 취소됨
result.updateCount=갱신된 개수
resultEdit.action=작업
resultEdit.add=추가
resultEdit.cancel=취소
resultEdit.delete=삭제
resultEdit.edit=편집
resultEdit.editResult=편집
resultEdit.save=저장
toolbar.all=전체
toolbar.autoCommit=자동 커밋
toolbar.autoComplete=자동 완성
toolbar.autoComplete.full=전체
toolbar.autoComplete.normal=보통
toolbar.autoComplete.off=안함
toolbar.cancelStatement=현재 문 취소
toolbar.clear=지우기
toolbar.commit=커밋
toolbar.disconnect=연결 끊기
toolbar.history=명령 이력
toolbar.maxRows=최대 행 수
toolbar.refresh=새로 고침
toolbar.rollback=롤백
toolbar.run=실행 (Ctrl+엔터)
toolbar.sqlStatement=SQL 문
tools.backup=백업
tools.backup.help=데이터베이스 백업 만들기.
tools.changeFileEncryption=파일암호화변경
tools.changeFileEncryption.help=데이터베이스 파일 암호화 비밀번호 및 앨거리듬을 변경할 수 있습니다.
tools.cipher=Cipher (AES 또는 XTEA)
tools.commandLine=명령줄
tools.convertTraceFile=트레이스파일변환
tools.convertTraceFile.help=.trace.db 파일을 Java 애플리케이션 및 SQL 스크립트로 변환합니다.
tools.createCluster=클러스터생성
tools.createCluster.help=독립형 데이터베이스에서 클러스터를 만듧니다.
tools.databaseName=데이터베이스 이름
tools.decryptionPassword=복호화 비밀번호
tools.deleteDbFiles=Db파일삭제
tools.deleteDbFiles.help=데이터베이스에 속한 모든 파일을 삭제합니다.
tools.directory=디렉터리
tools.encryptionPassword=암호화 비밀번호
tools.javaDirectoryClassName=Java 디렉터리 및 클래스 이름
tools.recover=복구
tools.recover.help=손상된 데이터베이스를 복구하도록 합니다.
tools.restore=복원
tools.restore.help=데이터베이스 백업을 복원합니다.
tools.result=결과
tools.run=실행
tools.runScript=스크립트실행
tools.runScript.help=SQL 스크립트를 실행합니다.
tools.script=스크립트
tools.script.help=백업 또는 이관을 위해 데이터베이스를 SQL 스크립트로 변환할 수 있습니다.
tools.scriptFileName=스크립트 파일명
tools.serverList=서버 목록
tools.sourceDatabaseName=원본 데이터베이스 이름
tools.sourceDatabaseURL=원본 데이터베이스 URL
tools.sourceDirectory=원본 디렉터리
tools.sourceFileName=원본 파일명
tools.sourceScriptFileName=원본 스크립트 파일명
tools.targetDatabaseName=대상 데이터베이스 이름
tools.targetDatabaseURL=대상 데이터베이스 URL
tools.targetDirectory=대상 디렉터리
tools.targetFileName=대상 파일명
tools.targetScriptFileName=대상 스크립트 파일명
tools.traceFileName=트레이스 파일명
tree.admin=Admin
tree.current=현재 값
tree.hashed=Hashed
tree.increment=증가
tree.indexes=인덱스
tree.nonUnique=유니크아님
tree.sequences=시퀀스
tree.unique=유니크
tree.users=사용자
.translator=Dylan
a.help=도움말
a.language=한국어
a.lynxNotSupported=죄송하지만 Lynx는 아직 지원되지 않습니다
a.password=비밀번호
a.remoteConnectionsDisabled=죄송하지만 이 서버는 원격 연결('webAllowOthers')이 사용 중지된 상태입니다.
a.title=H2 콘솔
a.tools=도구
a.user=사용자명
admin.executing=실행 여부
admin.ip=IP
admin.lastAccess=최종 액세스
admin.lastQuery=최종 질의
admin.no=아니요
admin.notConnected=연결되지 않았음
admin.url=URL
admin.yes=예
adminAllow=클라이언트 허가
adminConnection=연결 보안
adminHttp=암호화되지 않은 HTTP 연결 사용
adminHttps=암호화된 SSL(HTTPS) 연결 사용
adminLocal=로컬 연결만 허가
adminLogin=관리자 로그인
adminLoginCancel=취소
adminLoginOk=확인
adminLogout=로그아웃
adminOthers=다른 컴퓨터에서의 연결 허가
adminPort=포트 번호
adminPortWeb=웹 서버 포트 번호
adminRestart=변경 사항은 서버 재시작 후 반영됩니다.
adminSave=저장
adminSessions=활동중인 세션
adminShutdown=종료
adminTitle=H2 콘솔 설정
adminTranslateHelp=H2 콘솔을 번역하거나 번역을 수정할 수 있습니다.
adminTranslateStart=번역
helpAction=작업
helpAddAnotherRow=행 추가
helpAddDrivers=데이터베이스 드라이버 추가
helpAddDriversText=데이터베이스 드라이버를 추가로 등록하려면 H2DRIVERS나 CLASSPATH 환경 변수에 드라이버의 Jar 파일 위치를 추가하면 됩니다. 예 (Windows): 데이터베이스 드라이버 라이브러리로 C:/Programs/hsqldb/lib/hsqldb.jar를 추가하려면 H2DRIVERS 환경 변수를 C:/Programs/hsqldb/lib/hsqldb.jar로 설정합니다.
helpAddRow=행 추가
helpCommandHistory=명령 이력 보기
helpCreateTable=새 테이블 만들기
helpDeleteRow=행 삭제
helpDisconnect=데이터베이스 연결 끊기
helpDisplayThis=이 도움말 페이지 보기
helpDropTable=테이블이 존재하는 경우 삭제하기
helpExecuteCurrent=현재의 SQL 문 실행
helpIcon=아이콘
helpImportantCommands=중요 명령
helpOperations=작동
helpQuery=테이블 질의
helpSampleSQL=샘플 SQL 스크립트
helpStatements=SQL 문
helpUpdate=행 데이터 변경
helpWithColumnsIdName=컬럼은 ID와 NAME
login.connect=연결
login.driverClass=드라이버 클래스
login.driverNotFound=데이터베이스 드라이버를 찾지 못함<br />도움말에서 드라이버 추가 방법 참고
login.goAdmin=설정
login.jdbcUrl=JDBC URL
login.language=언어
login.login=로그인
login.remove=삭제
login.save=저장
login.savedSetting=저장한 설정
login.settingName=설정 이름
login.testConnection=연결 시험
login.testSuccessful=시험 성공
login.welcome=H2 콘설
result.1row=1 row
result.autoCommitOff=자동 커밋이 중지됨
result.autoCommitOn=자동 커밋이 작동됨
result.bytes=바이트
result.characters=자
result.maxrowsSet=최대 행 개수 설정
result.noRows=행 없음
result.noRunningStatement=현재 실행중인 문 없음
result.rows=행
result.statementWasCanceled=문이 취소됨
result.updateCount=갱신된 개수
resultEdit.action=작업
resultEdit.add=추가
resultEdit.cancel=취소
resultEdit.delete=삭제
resultEdit.edit=편집
resultEdit.editResult=편집
resultEdit.save=저장
toolbar.all=전체
toolbar.autoCommit=자동 커밋
toolbar.autoComplete=자동 완성
toolbar.autoComplete.full=전체
toolbar.autoComplete.normal=보통
toolbar.autoComplete.off=안함
toolbar.cancelStatement=현재 문 취소
toolbar.clear=지우기
toolbar.commit=커밋
toolbar.disconnect=연결 끊기
toolbar.history=명령 이력
toolbar.maxRows=최대 행 수
toolbar.refresh=새로 고침
toolbar.rollback=롤백
toolbar.run=실행 (Ctrl+엔터)
toolbar.sqlStatement=SQL 문
tools.backup=백업
tools.backup.help=데이터베이스 백업 만들기.
tools.changeFileEncryption=파일암호화변경
tools.changeFileEncryption.help=데이터베이스 파일 암호화 비밀번호 및 앨거리듬을 변경할 수 있습니다.
tools.cipher=Cipher (AES 또는 XTEA)
tools.commandLine=명령줄
tools.convertTraceFile=트레이스파일변환
tools.convertTraceFile.help=.trace.db 파일을 Java 애플리케이션 및 SQL 스크립트로 변환합니다.
tools.createCluster=클러스터생성
tools.createCluster.help=독립형 데이터베이스에서 클러스터를 만듧니다.
tools.databaseName=데이터베이스 이름
tools.decryptionPassword=복호화 비밀번호
tools.deleteDbFiles=Db파일삭제
tools.deleteDbFiles.help=데이터베이스에 속한 모든 파일을 삭제합니다.
tools.directory=디렉터리
tools.encryptionPassword=암호화 비밀번호
tools.javaDirectoryClassName=Java 디렉터리 및 클래스 이름
tools.recover=복구
tools.recover.help=손상된 데이터베이스를 복구하도록 합니다.
tools.restore=복원
tools.restore.help=데이터베이스 백업을 복원합니다.
tools.result=결과
tools.run=실행
tools.runScript=스크립트실행
tools.runScript.help=SQL 스크립트를 실행합니다.
tools.script=스크립트
tools.script.help=백업 또는 이관을 위해 데이터베이스를 SQL 스크립트로 변환할 수 있습니다.
tools.scriptFileName=스크립트 파일명
tools.serverList=서버 목록
tools.sourceDatabaseName=원본 데이터베이스 이름
tools.sourceDatabaseURL=원본 데이터베이스 URL
tools.sourceDirectory=원본 디렉터리
tools.sourceFileName=원본 파일명
tools.sourceScriptFileName=원본 스크립트 파일명
tools.targetDatabaseName=대상 데이터베이스 이름
tools.targetDatabaseURL=대상 데이터베이스 URL
tools.targetDirectory=대상 디렉터리
tools.targetFileName=대상 파일명
tools.targetScriptFileName=대상 스크립트 파일명
tools.traceFileName=트레이스 파일명
tree.admin=Admin
tree.current=현재 값
tree.hashed=Hashed
tree.increment=증가
tree.indexes=인덱스
tree.nonUnique=유니크아님
tree.sequences=시퀀스
tree.unique=유니크
tree.users=사용자
......@@ -68,7 +68,7 @@ function editRow(row, session, write, undo) {
replace(/>/g, '&gt;');
var size;
var newHTML;
if (text.indexOf('\n') >= 0) {
if (text.indexOf('\n') >= 0) {
size = 40;
newHTML = '<textarea name="$rowName" cols="$size" onkeydown="return editKeyDown($row, this, event)">$t</textarea/>';
} else {
......
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Properties;
/**
* A block of data.
*/
class Block {
/**
* The block id.
*/
int id;
/**
* The start position within the file.
*/
long start;
/**
* The length in bytes.
*/
long length;
/**
* The entry count.
*/
int entryCount;
/**
* The number of life (non-garbage) objects.
*/
int liveCount;
/**
* The garbage collection priority.
*/
int collectPriority;
Block(int id) {
this.id = id;
}
/**
* Build a block from the given string.
*
* @param s the string
* @return the block
*/
static Block fromString(String s) {
Block b = new Block(0);
Properties prop = new Properties();
try {
prop.load(new ByteArrayInputStream(s.getBytes("UTF-8")));
b.id = Integer.parseInt(prop.get("id").toString());
b.start = Long.parseLong(prop.get("start").toString());
b.length = Long.parseLong(prop.get("length").toString());
b.entryCount = Integer.parseInt(prop.get("entryCount").toString());
b.liveCount = Integer.parseInt(prop.get("liveCount").toString());
return b;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public int getFillRate() {
return entryCount == 0 ? 0 : 100 * liveCount / entryCount;
}
public int hashCode() {
return id;
}
public boolean equals(Object o) {
return o instanceof Block && ((Block) o).id == id;
}
public String toString() {
return
"id:" + id + "\n" +
"start:" + start + "\n" +
"length:" + length + "\n" +
"entryCount:" + entryCount + "\n" +
"liveCount:" + liveCount + "\n";
}
}
......@@ -6,8 +6,6 @@
*/
package org.h2.dev.store.btree;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;
/**
......@@ -20,8 +18,8 @@ public class BtreeMap<K, V> {
private final BtreeMapStore store;
private final String name;
private final KeyType keyType;
private final ValueType valueType;
private final DataType keyType;
private final DataType valueType;
private Page root;
private BtreeMap(BtreeMapStore store, String name, Class<K> keyClass, Class<V> valueClass) {
......@@ -136,59 +134,6 @@ public class BtreeMap<K, V> {
return root != null && root.getId() < 0;
}
/**
* A value type.
*/
static interface ValueType {
/**
* Get the length in bytes.
*
* @param obj the object
* @return the length
*/
int length(Object obj);
/**
* Write the object.
*
* @param buff the target buffer
* @param x the value
*/
void write(ByteBuffer buff, Object x);
/**
* Read an object.
*
* @param buff the source buffer
* @return the object
*/
Object read(ByteBuffer buff);
/**
* Get the tag name of the class.
*
* @return the tag name
*/
String getName();
}
/**
* A key type.
*/
static interface KeyType extends ValueType {
/**
* Compare two keys.
*
* @param a the first key
* @param b the second key
* @return -1 if the first key is smaller, 1 if larger, and 0 if equal
*/
int compare(Object a, Object b);
}
/**
* Compare two keys.
*
......@@ -200,84 +145,12 @@ public class BtreeMap<K, V> {
return keyType.compare(a, b);
}
/**
* An integer type.
*/
static class IntegerType implements KeyType {
public int compare(Object a, Object b) {
return ((Integer) a).compareTo((Integer) b);
}
public int length(Object obj) {
return getVarIntLen((Integer) obj);
}
public Integer read(ByteBuffer buff) {
return readVarInt(buff);
}
public void write(ByteBuffer buff, Object x) {
writeVarInt(buff, (Integer) x);
}
public String getName() {
return "i";
}
}
/**
* A string type.
*/
static class StringType implements KeyType {
public int compare(Object a, Object b) {
return a.toString().compareTo(b.toString());
}
public int length(Object obj) {
try {
byte[] bytes = obj.toString().getBytes("UTF-8");
return getVarIntLen(bytes.length) + bytes.length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String read(ByteBuffer buff) {
int len = readVarInt(buff);
byte[] bytes = new byte[len];
buff.get(bytes);
try {
return new String(bytes, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void write(ByteBuffer buff, Object x) {
try {
byte[] bytes = x.toString().getBytes("UTF-8");
writeVarInt(buff, bytes.length);
buff.put(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String getName() {
return "s";
}
}
/**
* Get the key type.
*
* @return the key type
*/
KeyType getKeyType() {
DataType getKeyType() {
return keyType;
}
......@@ -286,7 +159,7 @@ public class BtreeMap<K, V> {
*
* @return the value type
*/
ValueType getValueType() {
DataType getValueType() {
return valueType;
}
......@@ -339,42 +212,7 @@ public class BtreeMap<K, V> {
* @return the iterator
*/
public Iterator<K> keyIterator(K from) {
return new Cursor(root, from);
}
/**
* A cursor to iterate over elements in ascending order.
*/
class Cursor implements Iterator<K> {
private ArrayList<Page.CursorPos> parents = new ArrayList<Page.CursorPos>();
private K current;
Cursor(Page root, K from) {
Page.min(root, parents, from);
fetchNext();
}
public K next() {
K c = current;
if (c != null) {
fetchNext();
}
return c == null ? null : c;
}
@SuppressWarnings("unchecked")
private void fetchNext() {
current = (K) Page.nextKey(parents);
}
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
return new Cursor<K>(root, from);
}
/**
......@@ -395,124 +233,4 @@ public class BtreeMap<K, V> {
return name;
}
/**
* Read a variable size long.
*
* @param buff the source buffer
* @return the value
*/
static long readVarLong(ByteBuffer buff) {
long x = buff.get();
if (x >= 0) {
return x;
}
x &= 0x7f;
for (int s = 7;; s += 7) {
long b = buff.get();
x |= (b & 0x7f) << s;
if (b >= 0) {
return x;
}
}
}
/**
* Read a variable size int.
*
* @param buff the source buffer
* @return the value
*/
static int readVarInt(ByteBuffer buff) {
int b = buff.get();
if (b >= 0) {
return b;
}
// a separate function so that this one can be inlined
return readVarIntRest(buff, b);
}
private static int readVarIntRest(ByteBuffer buff, int b) {
int x = b & 0x7f;
b = buff.get();
if (b >= 0) {
return x | (b << 7);
}
x |= (b & 0x7f) << 7;
b = buff.get();
if (b >= 0) {
return x | (b << 14);
}
x |= (b & 0x7f) << 14;
b = buff.get();
if (b >= 0) {
return x | b << 21;
}
x |= ((b & 0x7f) << 21) | (buff.get() << 28);
return x;
}
/**
* Get the length of the variable size int.
*
* @param x the value
* @return the length in bytes
*/
static int getVarIntLen(int x) {
if ((x & (-1 << 7)) == 0) {
return 1;
} else if ((x & (-1 << 14)) == 0) {
return 2;
} else if ((x & (-1 << 21)) == 0) {
return 3;
} else if ((x & (-1 << 28)) == 0) {
return 4;
}
return 5;
}
/**
* Get the length of the variable size long.
*
* @param x the value
* @return the length in bytes
*/
static int getVarLongLen(long x) {
int i = 1;
while (true) {
x >>>= 7;
if (x == 0) {
return i;
}
i++;
}
}
/**
* Write a variable size int.
*
* @param buff the target buffer
* @param x the value
*/
static void writeVarInt(ByteBuffer buff, int x) {
while ((x & ~0x7f) != 0) {
buff.put((byte) (0x80 | (x & 0x7f)));
x >>>= 7;
}
buff.put((byte) x);
}
/**
* Write a variable size int.
*
* @param buff the target buffer
* @param x the value
*/
static void writeVarLong(ByteBuffer buff, long x) {
while ((x & ~0x7f) != 0) {
buff.put((byte) (0x80 | (x & 0x7f)));
x >>>= 7;
}
buff.put((byte) x);
}
}
......@@ -605,90 +605,6 @@ public class BtreeMapStore {
return blocks.get(getBlockId(pageId));
}
/**
* A block of data.
*/
static class Block {
/**
* The block id.
*/
int id;
/**
* The start position within the file.
*/
long start;
/**
* The length in bytes.
*/
long length;
/**
* The entry count.
*/
int entryCount;
/**
* The number of life (non-garbage) objects.
*/
int liveCount;
/**
* The garbage collection priority.
*/
int collectPriority;
Block(int id) {
this.id = id;
}
/**
* Build a block from the given string.
*
* @param s the string
* @return the block
*/
static Block fromString(String s) {
Block b = new Block(0);
Properties prop = new Properties();
try {
prop.load(new ByteArrayInputStream(s.getBytes("UTF-8")));
b.id = Integer.parseInt(prop.get("id").toString());
b.start = Long.parseLong(prop.get("start").toString());
b.length = Long.parseLong(prop.get("length").toString());
b.entryCount = Integer.parseInt(prop.get("entryCount").toString());
b.liveCount = Integer.parseInt(prop.get("liveCount").toString());
return b;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public int getFillRate() {
return entryCount == 0 ? 0 : 100 * liveCount / entryCount;
}
public int hashCode() {
return id;
}
public boolean equals(Object o) {
return o instanceof Block && ((Block) o).id == id;
}
public String toString() {
return
"id:" + id + "\n" +
"start:" + start + "\n" +
"length:" + length + "\n" +
"entryCount:" + entryCount + "\n" +
"liveCount:" + liveCount + "\n";
}
}
/**
* Log the string, if logging is enabled.
*
......
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.util.ArrayList;
import java.util.Iterator;
/**
* A cursor to iterate over elements in ascending order.
*/
class Cursor<K> implements Iterator<K> {
private ArrayList<CursorPos> parents = new ArrayList<CursorPos>();
private K current;
Cursor(Page root, K from) {
Page.min(root, parents, from);
fetchNext();
}
public K next() {
K c = current;
if (c != null) {
fetchNext();
}
return c == null ? null : c;
}
@SuppressWarnings("unchecked")
private void fetchNext() {
current = (K) Page.nextKey(parents);
}
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
/**
* A position in a cursor
*/
class CursorPos {
/**
* The current page.
*/
Page page;
/**
* The current index.
*/
int index;
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.nio.ByteBuffer;
/**
* A value type.
*/
interface DataType {
/**
* Compare two keys.
*
* @param a the first key
* @param b the second key
* @return -1 if the first key is smaller, 1 if larger, and 0 if equal
*/
int compare(Object a, Object b);
/**
* Get the length in bytes.
*
* @param obj the object
* @return the length
*/
int length(Object obj);
/**
* Write the object.
*
* @param buff the target buffer
* @param x the value
*/
void write(ByteBuffer buff, Object x);
/**
* Read an object.
*
* @param buff the source buffer
* @return the object
*/
Object read(ByteBuffer buff);
/**
* Get the tag name of the class.
*
* @return the tag name
*/
String getName();
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.nio.ByteBuffer;
/**
* Utility methods
*/
public class DataUtils {
/**
* Get the length of the variable size int.
*
* @param x the value
* @return the length in bytes
*/
static int getVarIntLen(int x) {
if ((x & (-1 << 7)) == 0) {
return 1;
} else if ((x & (-1 << 14)) == 0) {
return 2;
} else if ((x & (-1 << 21)) == 0) {
return 3;
} else if ((x & (-1 << 28)) == 0) {
return 4;
}
return 5;
}
/**
* Get the length of the variable size long.
*
* @param x the value
* @return the length in bytes
*/
static int getVarLongLen(long x) {
int i = 1;
while (true) {
x >>>= 7;
if (x == 0) {
return i;
}
i++;
}
}
/**
* Read a variable size int.
*
* @param buff the source buffer
* @return the value
*/
static int readVarInt(ByteBuffer buff) {
int b = buff.get();
if (b >= 0) {
return b;
}
// a separate function so that this one can be inlined
return readVarIntRest(buff, b);
}
private static int readVarIntRest(ByteBuffer buff, int b) {
int x = b & 0x7f;
b = buff.get();
if (b >= 0) {
return x | (b << 7);
}
x |= (b & 0x7f) << 7;
b = buff.get();
if (b >= 0) {
return x | (b << 14);
}
x |= (b & 0x7f) << 14;
b = buff.get();
if (b >= 0) {
return x | b << 21;
}
x |= ((b & 0x7f) << 21) | (buff.get() << 28);
return x;
}
/**
* Read a variable size long.
*
* @param buff the source buffer
* @return the value
*/
static long readVarLong(ByteBuffer buff) {
long x = buff.get();
if (x >= 0) {
return x;
}
x &= 0x7f;
for (int s = 7;; s += 7) {
long b = buff.get();
x |= (b & 0x7f) << s;
if (b >= 0) {
return x;
}
}
}
/**
* Write a variable size int.
*
* @param buff the target buffer
* @param x the value
*/
static void writeVarInt(ByteBuffer buff, int x) {
while ((x & ~0x7f) != 0) {
buff.put((byte) (0x80 | (x & 0x7f)));
x >>>= 7;
}
buff.put((byte) x);
}
/**
* Write a variable size int.
*
* @param buff the target buffer
* @param x the value
*/
static void writeVarLong(ByteBuffer buff, long x) {
while ((x & ~0x7f) != 0) {
buff.put((byte) (0x80 | (x & 0x7f)));
x >>>= 7;
}
buff.put((byte) x);
}
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.nio.ByteBuffer;
/**
* An integer type.
*/
class IntegerType implements DataType {
public int compare(Object a, Object b) {
return ((Integer) a).compareTo((Integer) b);
}
public int length(Object obj) {
return DataUtils.getVarIntLen((Integer) obj);
}
public Integer read(ByteBuffer buff) {
return DataUtils.readVarInt(buff);
}
public void write(ByteBuffer buff, Object x) {
DataUtils.writeVarInt(buff, (Integer) x);
}
public String getName() {
return "i";
}
}
......@@ -167,22 +167,6 @@ class Page {
return -(low + 1);
}
/**
* A position in a cursor
*/
static class CursorPos {
/**
* The current page.
*/
Page page;
/**
* The current index.
*/
int index;
}
/**
* Go to the first element for the given key.
*
......@@ -453,7 +437,7 @@ class Page {
private void read(ByteBuffer buff) {
boolean node = buff.get() == 1;
if (node) {
int len = BtreeMap.readVarInt(buff);
int len = DataUtils.readVarInt(buff);
children = new long[len];
keys = new Object[len - 1];
for (int i = 0; i < len; i++) {
......@@ -463,7 +447,7 @@ class Page {
}
}
} else {
int len = BtreeMap.readVarInt(buff);
int len = DataUtils.readVarInt(buff);
keys = new Object[len];
values = new Object[len];
for (int i = 0; i < len; i++) {
......@@ -482,7 +466,7 @@ class Page {
if (children != null) {
buff.put((byte) 1);
int len = children.length;
BtreeMap.writeVarInt(buff, len);
DataUtils.writeVarInt(buff, len);
for (int i = 0; i < len; i++) {
long c = map.readPage(children[i]).storedId;
buff.putLong(c);
......@@ -493,7 +477,7 @@ class Page {
} else {
buff.put((byte) 0);
int len = keys.length;
BtreeMap.writeVarInt(buff, len);
DataUtils.writeVarInt(buff, len);
for (int i = 0; i < len; i++) {
map.getKeyType().write(buff, keys[i]);
map.getValueType().write(buff, values[i]);
......@@ -590,7 +574,7 @@ class Page {
int byteCount = 1;
if (children != null) {
int len = children.length;
byteCount += BtreeMap.getVarIntLen(len);
byteCount += DataUtils.getVarIntLen(len);
for (int i = 0; i < len; i++) {
byteCount += 8;
if (i < keys.length) {
......@@ -599,7 +583,7 @@ class Page {
}
} else {
int len = keys.length;
byteCount += BtreeMap.getVarIntLen(len);
byteCount += DataUtils.getVarIntLen(len);
for (int i = 0; i < len; i++) {
byteCount += map.getKeyType().length(keys[i]);
byteCount += map.getValueType().length(values[i]);
......
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.store.btree;
import java.nio.ByteBuffer;
/**
* A string type.
*/
class StringType implements DataType {
public int compare(Object a, Object b) {
return a.toString().compareTo(b.toString());
}
public int length(Object obj) {
try {
byte[] bytes = obj.toString().getBytes("UTF-8");
return DataUtils.getVarIntLen(bytes.length) + bytes.length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String read(ByteBuffer buff) {
int len = DataUtils.readVarInt(buff);
byte[] bytes = new byte[len];
buff.get(bytes);
try {
return new String(bytes, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void write(ByteBuffer buff, Object x) {
try {
byte[] bytes = x.toString().getBytes("UTF-8");
DataUtils.writeVarInt(buff, bytes.length);
buff.put(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String getName() {
return "s";
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论