Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
117b640f
提交
117b640f
authored
4月 01, 2018
作者:
andrei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address synthetic access issues
上级
4ecab392
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
165 行增加
和
165 行删除
+165
-165
Cursor.java
h2/src/main/org/h2/mvstore/Cursor.java
+4
-4
MVMap.java
h2/src/main/org/h2/mvstore/MVMap.java
+48
-66
MVStore.java
h2/src/main/org/h2/mvstore/MVStore.java
+30
-30
Page.java
h2/src/main/org/h2/mvstore/Page.java
+47
-30
MVRTreeMap.java
h2/src/main/org/h2/mvstore/rtree/MVRTreeMap.java
+10
-9
TestMVStore.java
h2/src/test/org/h2/test/store/TestMVStore.java
+1
-1
dictionary.txt
h2/src/tools/org/h2/build/doc/dictionary.txt
+25
-25
没有找到文件。
h2/src/main/org/h2/mvstore/Cursor.java
浏览文件 @
117b640f
...
@@ -118,7 +118,6 @@ public final class Cursor<K, V> implements Iterator<K> {
...
@@ -118,7 +118,6 @@ public final class Cursor<K, V> implements Iterator<K> {
*
*
* @param n the number of entries to skip
* @param n the number of entries to skip
*/
*/
@SuppressWarnings
(
"unchecked"
)
public
void
skip
(
long
n
)
{
public
void
skip
(
long
n
)
{
if
(
n
<
10
)
{
if
(
n
<
10
)
{
while
(
n
--
>
0
&&
hasNext
())
{
while
(
n
--
>
0
&&
hasNext
())
{
...
@@ -126,10 +125,11 @@ public final class Cursor<K, V> implements Iterator<K> {
...
@@ -126,10 +125,11 @@ public final class Cursor<K, V> implements Iterator<K> {
}
}
}
else
if
(
hasNext
())
{
}
else
if
(
hasNext
())
{
assert
cursorPos
!=
null
;
assert
cursorPos
!=
null
;
CursorPos
c
urPos
=
cursorPos
;
CursorPos
c
p
=
cursorPos
;
CursorPos
parent
;
CursorPos
parent
;
while
((
parent
=
curPos
.
parent
)
!=
null
)
curPos
=
parent
;
while
((
parent
=
cp
.
parent
)
!=
null
)
cp
=
parent
;
Page
root
=
curPos
.
page
;
Page
root
=
cp
.
page
;
@SuppressWarnings
(
"unchecked"
)
MVMap
<
K
,
?>
map
=
(
MVMap
<
K
,
?>)
root
.
map
;
MVMap
<
K
,
?>
map
=
(
MVMap
<
K
,
?>)
root
.
map
;
long
index
=
map
.
getKeyIndex
(
next
());
long
index
=
map
.
getKeyIndex
(
next
());
last
=
map
.
getKey
(
index
+
n
);
last
=
map
.
getKey
(
index
+
n
);
...
...
h2/src/main/org/h2/mvstore/MVMap.java
浏览文件 @
117b640f
...
@@ -28,7 +28,7 @@ import org.h2.mvstore.type.StringDataType;
...
@@ -28,7 +28,7 @@ import org.h2.mvstore.type.StringDataType;
* @param <V> the value class
* @param <V> the value class
*/
*/
public
class
MVMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
public
class
MVMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
implements
ConcurrentMap
<
K
,
V
>
implements
ConcurrentMap
<
K
,
V
>
{
{
/**
/**
...
@@ -58,16 +58,16 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -58,16 +58,16 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* This designates the "last stored" version for a store which was
* This designates the "last stored" version for a store which was
* just open for the first time.
* just open for the first time.
*/
*/
public
static
final
long
INITIAL_VERSION
=
-
1
;
static
final
long
INITIAL_VERSION
=
-
1
;
protected
MVMap
(
Map
<
String
,
Object
>
config
)
{
protected
MVMap
(
Map
<
String
,
Object
>
config
)
{
this
((
MVStore
)
config
.
get
(
"store"
),
this
((
MVStore
)
config
.
get
(
"store"
),
(
DataType
)
config
.
get
(
"key"
),
(
DataType
)
config
.
get
(
"key"
),
(
DataType
)
config
.
get
(
"val"
),
(
DataType
)
config
.
get
(
"val"
),
DataUtils
.
readHexInt
(
config
,
"id"
,
0
),
DataUtils
.
readHexInt
(
config
,
"id"
,
0
),
DataUtils
.
readHexLong
(
config
,
"createVersion"
,
0
),
DataUtils
.
readHexLong
(
config
,
"createVersion"
,
0
),
new
AtomicReference
<
RootReference
>()
new
AtomicReference
<
RootReference
>()
);
);
setInitialRoot
(
createEmptyLeaf
(),
store
.
getCurrentVersion
());
setInitialRoot
(
createEmptyLeaf
(),
store
.
getCurrentVersion
());
}
}
...
@@ -83,9 +83,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -83,9 +83,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
setInitialRoot
(
createEmptyLeaf
(),
store
.
getCurrentVersion
());
setInitialRoot
(
createEmptyLeaf
(),
store
.
getCurrentVersion
());
}
}
@SuppressWarnings
(
"unchecked"
)
private
MVMap
(
MVStore
store
,
DataType
keyType
,
DataType
valueType
,
int
id
,
long
createVersion
,
private
MVMap
(
MVStore
store
,
DataType
keyType
,
DataType
valueType
,
int
id
,
long
createVersion
,
AtomicReference
<
RootReference
>
root
)
{
AtomicReference
<
RootReference
>
root
)
{
this
.
store
=
store
;
this
.
store
=
store
;
this
.
id
=
id
;
this
.
id
=
id
;
this
.
createVersion
=
createVersion
;
this
.
createVersion
=
createVersion
;
...
@@ -142,7 +141,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -142,7 +141,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param value the value (may not be null)
* @param value the value (may not be null)
* @return the old value if the key existed, or null otherwise
* @return the old value if the key existed, or null otherwise
*/
*/
@SuppressWarnings
(
"unchecked"
)
public
final
V
put
(
K
key
,
V
value
,
DecisionMaker
<?
super
V
>
decisionMaker
)
{
public
final
V
put
(
K
key
,
V
value
,
DecisionMaker
<?
super
V
>
decisionMaker
)
{
DataUtils
.
checkArgument
(
value
!=
null
,
"The value may not be null"
);
DataUtils
.
checkArgument
(
value
!=
null
,
"The value may not be null"
);
return
operate
(
key
,
value
,
decisionMaker
);
return
operate
(
key
,
value
,
decisionMaker
);
...
@@ -174,7 +172,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -174,7 +172,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param index the index
* @param index the index
* @return the key
* @return the key
*/
*/
@SuppressWarnings
(
"unchecked"
)
public
final
K
getKey
(
long
index
)
{
public
final
K
getKey
(
long
index
)
{
if
(
index
<
0
||
index
>=
sizeAsLong
())
{
if
(
index
<
0
||
index
>=
sizeAsLong
())
{
return
null
;
return
null
;
...
@@ -186,7 +183,9 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -186,7 +183,9 @@ public class MVMap<K, V> extends AbstractMap<K, V>
if
(
index
>=
offset
+
p
.
getKeyCount
())
{
if
(
index
>=
offset
+
p
.
getKeyCount
())
{
return
null
;
return
null
;
}
}
return
(
K
)
p
.
getKey
((
int
)
(
index
-
offset
));
@SuppressWarnings
(
"unchecked"
)
K
key
=
(
K
)
p
.
getKey
((
int
)
(
index
-
offset
));
return
key
;
}
}
int
i
=
0
,
size
=
getChildPageCount
(
p
);
int
i
=
0
,
size
=
getChildPageCount
(
p
);
for
(;
i
<
size
;
i
++)
{
for
(;
i
<
size
;
i
++)
{
...
@@ -386,30 +385,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -386,30 +385,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
return
(
V
)
Page
.
get
(
p
,
key
);
return
(
V
)
Page
.
get
(
p
,
key
);
}
}
/**
* Get the value for the given key, or null if not found.
*
* @param p the page
* @param key the key
* @return the value or null
*/
protected
Object
binarySearch
(
Page
p
,
Object
key
)
{
int
x
=
p
.
binarySearch
(
key
);
if
(!
p
.
isLeaf
())
{
if
(
x
<
0
)
{
x
=
-
x
-
1
;
}
else
{
x
++;
}
p
=
p
.
getChildPage
(
x
);
return
binarySearch
(
p
,
key
);
}
if
(
x
>=
0
)
{
return
p
.
getValue
(
x
);
}
return
null
;
}
@Override
@Override
public
final
boolean
containsKey
(
Object
key
)
{
public
final
boolean
containsKey
(
Object
key
)
{
return
get
(
key
)
!=
null
;
return
get
(
key
)
!=
null
;
...
@@ -472,7 +447,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -472,7 +447,6 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param value the expected value
* @param value the expected value
* @return true if the item was removed
* @return true if the item was removed
*/
*/
@SuppressWarnings
(
"unchecked"
)
@Override
@Override
public
boolean
remove
(
Object
key
,
Object
value
)
{
public
boolean
remove
(
Object
key
,
Object
value
)
{
EqualsDecisionMaker
<
V
>
decisionMaker
=
new
EqualsDecisionMaker
<>(
valueType
,
(
V
)
value
);
EqualsDecisionMaker
<
V
>
decisionMaker
=
new
EqualsDecisionMaker
<>(
valueType
,
(
V
)
value
);
...
@@ -499,7 +473,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -499,7 +473,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param datatype to use for comparison
* @param datatype to use for comparison
* @return true if they are equal
* @return true if they are equal
*/
*/
public
static
boolean
areValuesEqual
(
DataType
datatype
,
Object
a
,
Object
b
)
{
static
boolean
areValuesEqual
(
DataType
datatype
,
Object
a
,
Object
b
)
{
return
a
==
b
return
a
==
b
||
a
!=
null
&&
b
!=
null
&&
datatype
.
compare
(
a
,
b
)
==
0
;
||
a
!=
null
&&
b
!=
null
&&
datatype
.
compare
(
a
,
b
)
==
0
;
}
}
...
@@ -799,12 +773,12 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -799,12 +773,12 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param newRootPage the new root page
* @param newRootPage the new root page
* @param attemptUpdateCounter how many attempt (including current)
* @param attemptUpdateCounter how many attempt (including current)
* were made to update root
* were made to update root
* @param obeyLock false means override root
iven if it
marked as locked (used to unlock)
* @param obeyLock false means override root
even if it's
marked as locked (used to unlock)
* true will fail to update, if ro
t
t is currently locked
* true will fail to update, if ro
o
t is currently locked
* @return new RootReference or null if update failed
* @return new RootReference or null if update failed
*/
*/
private
RootReference
setNewRoot
(
RootReference
oldRoot
,
Page
newRootPage
,
private
RootReference
setNewRoot
(
RootReference
oldRoot
,
Page
newRootPage
,
int
attemptUpdateCounter
,
boolean
obeyLock
)
{
int
attemptUpdateCounter
,
boolean
obeyLock
)
{
RootReference
currentRoot
=
getRoot
();
RootReference
currentRoot
=
getRoot
();
assert
newRootPage
!=
null
||
currentRoot
!=
null
;
assert
newRootPage
!=
null
||
currentRoot
!=
null
;
if
(
currentRoot
!=
oldRoot
&&
oldRoot
!=
null
)
{
if
(
currentRoot
!=
oldRoot
&&
oldRoot
!=
null
)
{
...
@@ -830,7 +804,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -830,7 +804,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
RootReference
updatedRootReference
=
new
RootReference
(
newRootPage
,
newVersion
,
previous
,
updateCounter
,
RootReference
updatedRootReference
=
new
RootReference
(
newRootPage
,
newVersion
,
previous
,
updateCounter
,
attemptUpdateCounter
,
false
);
attemptUpdateCounter
,
false
);
boolean
success
=
root
.
compareAndSet
(
currentRoot
,
updatedRootReference
);
boolean
success
=
root
.
compareAndSet
(
currentRoot
,
updatedRootReference
);
return
success
?
updatedRootReference
:
null
;
return
success
?
updatedRootReference
:
null
;
}
}
...
@@ -862,7 +836,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -862,7 +836,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
/**
/**
* Use the new root page from now on.
* Use the new root page from now on.
* @param oldRoot the old root reference, will use the current root reference, if null is specified
* @param oldRoot the old root reference, will use the current root reference,
* if null is specified
* @param newRoot the new root page
* @param newRoot the new root page
*/
*/
protected
final
boolean
updateRoot
(
RootReference
oldRoot
,
Page
newRoot
,
int
attemptUpdateCounter
)
{
protected
final
boolean
updateRoot
(
RootReference
oldRoot
,
Page
newRoot
,
int
attemptUpdateCounter
)
{
...
@@ -1078,7 +1053,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1078,7 +1053,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* @param name the map name (or null)
* @param name the map name (or null)
* @return the string
* @return the string
*/
*/
protected
String
asString
(
String
name
)
{
protected
String
asString
(
String
name
)
{
StringBuilder
buff
=
new
StringBuilder
();
StringBuilder
buff
=
new
StringBuilder
();
if
(
name
!=
null
)
{
if
(
name
!=
null
)
{
DataUtils
.
appendMap
(
buff
,
"name"
,
name
);
DataUtils
.
appendMap
(
buff
,
"name"
,
name
);
...
@@ -1179,7 +1154,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1179,7 +1154,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
/**
/**
* Indicator that map is locked for update.
* Indicator that map is locked for update.
*/
*/
public
final
boolean
lockedForUpdate
;
final
boolean
lockedForUpdate
;
/**
/**
* Reference to the previous root in the chain.
* Reference to the previous root in the chain.
*/
*/
...
@@ -1193,9 +1168,9 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1193,9 +1168,9 @@ public class MVMap<K, V> extends AbstractMap<K, V>
*/
*/
public
final
long
updateAttemptCounter
;
public
final
long
updateAttemptCounter
;
private
RootReference
(
Page
root
,
long
version
,
RootReference
previous
,
RootReference
(
Page
root
,
long
version
,
RootReference
previous
,
long
updateCounter
,
long
updateAttemptCounter
,
long
updateCounter
,
long
updateAttemptCounter
,
boolean
lockedForUpdate
)
{
boolean
lockedForUpdate
)
{
this
.
root
=
root
;
this
.
root
=
root
;
this
.
version
=
version
;
this
.
version
=
version
;
this
.
previous
=
previous
;
this
.
previous
=
previous
;
...
@@ -1205,7 +1180,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1205,7 +1180,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
// This one is used for locking
// This one is used for locking
private
RootReference
(
RootReference
r
)
{
RootReference
(
RootReference
r
)
{
this
.
root
=
r
.
root
;
this
.
root
=
r
.
root
;
this
.
version
=
r
.
version
;
this
.
version
=
r
.
version
;
this
.
previous
=
r
.
previous
;
this
.
previous
=
r
.
previous
;
...
@@ -1215,7 +1190,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1215,7 +1190,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
// This one is used for unlocking
// This one is used for unlocking
private
RootReference
(
RootReference
r
,
Page
root
,
int
attempt
)
{
RootReference
(
RootReference
r
,
Page
root
,
int
attempt
)
{
this
.
root
=
root
;
this
.
root
=
root
;
this
.
version
=
r
.
version
;
this
.
version
=
r
.
version
;
this
.
previous
=
r
.
previous
;
this
.
previous
=
r
.
previous
;
...
@@ -1225,7 +1200,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1225,7 +1200,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
// This one is used for version change
// This one is used for version change
private
RootReference
(
RootReference
r
,
long
version
,
int
attempt
)
{
RootReference
(
RootReference
r
,
long
version
,
int
attempt
)
{
RootReference
previous
=
r
;
RootReference
previous
=
r
;
RootReference
tmp
;
RootReference
tmp
;
while
((
tmp
=
previous
.
previous
)
!=
null
&&
tmp
.
root
==
r
.
root
)
{
while
((
tmp
=
previous
.
previous
)
!=
null
&&
tmp
.
root
==
r
.
root
)
{
...
@@ -1240,7 +1215,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1240,7 +1215,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
// This one is used for r/o snapshots
// This one is used for r/o snapshots
private
RootReference
(
Page
root
,
long
version
)
{
RootReference
(
Page
root
,
long
version
)
{
this
.
root
=
root
;
this
.
root
=
root
;
this
.
version
=
version
;
this
.
version
=
version
;
this
.
previous
=
null
;
this
.
previous
=
null
;
...
@@ -1373,16 +1348,19 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1373,16 +1348,19 @@ public class MVMap<K, V> extends AbstractMap<K, V>
public
Builder
()
{}
public
Builder
()
{}
@Override
public
Builder
<
K
,
V
>
keyType
(
DataType
dataType
)
{
public
Builder
<
K
,
V
>
keyType
(
DataType
dataType
)
{
setKeyType
(
dataType
);
setKeyType
(
dataType
);
return
this
;
return
this
;
}
}
@Override
public
Builder
<
K
,
V
>
valueType
(
DataType
dataType
)
{
public
Builder
<
K
,
V
>
valueType
(
DataType
dataType
)
{
setValueType
(
dataType
);
setValueType
(
dataType
);
return
this
;
return
this
;
}
}
@Override
protected
MVMap
<
K
,
V
>
create
(
Map
<
String
,
Object
>
config
)
{
protected
MVMap
<
K
,
V
>
create
(
Map
<
String
,
Object
>
config
)
{
Object
type
=
config
.
get
(
"type"
);
Object
type
=
config
.
get
(
"type"
);
if
(
type
==
null
||
type
.
equals
(
"rtree"
))
{
if
(
type
==
null
||
type
.
equals
(
"rtree"
))
{
...
@@ -1443,7 +1421,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1443,7 +1421,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
};
};
private
static
final
DecisionMaker
<
Object
>
IF_ABSENT
=
new
DecisionMaker
<
Object
>()
{
static
final
DecisionMaker
<
Object
>
IF_ABSENT
=
new
DecisionMaker
<
Object
>()
{
@Override
@Override
public
Decision
decide
(
Object
existingValue
,
Object
providedValue
)
{
public
Decision
decide
(
Object
existingValue
,
Object
providedValue
)
{
return
existingValue
==
null
?
Decision
.
PUT
:
Decision
.
ABORT
;
return
existingValue
==
null
?
Decision
.
PUT
:
Decision
.
ABORT
;
...
@@ -1455,7 +1433,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1455,7 +1433,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
};
};
private
static
final
DecisionMaker
<
Object
>
IF_PRESENT
=
new
DecisionMaker
<
Object
>()
{
static
final
DecisionMaker
<
Object
>
IF_PRESENT
=
new
DecisionMaker
<
Object
>()
{
@Override
@Override
public
Decision
decide
(
Object
existingValue
,
Object
providedValue
)
{
public
Decision
decide
(
Object
existingValue
,
Object
providedValue
)
{
return
existingValue
!=
null
?
Decision
.
PUT
:
Decision
.
ABORT
;
return
existingValue
!=
null
?
Decision
.
PUT
:
Decision
.
ABORT
;
...
@@ -1468,12 +1446,12 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1468,12 +1446,12 @@ public class MVMap<K, V> extends AbstractMap<K, V>
};
};
/**
/**
* Makes a
decision about how to proceed with
update.
* Makes a
decision about how to proceed with the
update.
* @param existingValue value currently exists in the map
* @param existingValue value currently exists in the map
* @param providedValue original input value
* @param providedValue original input value
* @return PUT if a new value need to replace existing one or
* @return PUT if a new value need to replace existing one or
* new value to be inserted if there is none
* new value to be inserted if there is none
* REMOVE if existin value should be deleted
* REMOVE if existin
g
value should be deleted
* ABORT if update operation should be aborted
* ABORT if update operation should be aborted
*/
*/
public
abstract
Decision
decide
(
V
existingValue
,
V
providedValue
);
public
abstract
Decision
decide
(
V
existingValue
,
V
providedValue
);
...
@@ -1507,7 +1485,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1507,7 +1485,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
RootReference
rootReference
=
getRoot
();
RootReference
rootReference
=
getRoot
();
int
contention
=
0
;
int
contention
=
0
;
if
(
oldRootReference
!=
null
)
{
if
(
oldRootReference
!=
null
)
{
long
updateAttemptCounter
=
rootReference
.
updateAttemptCounter
-
oldRootReference
.
updateAttemptCounter
;
long
updateAttemptCounter
=
rootReference
.
updateAttemptCounter
-
oldRootReference
.
updateAttemptCounter
;
assert
updateAttemptCounter
>=
0
:
updateAttemptCounter
;
assert
updateAttemptCounter
>=
0
:
updateAttemptCounter
;
long
updateCounter
=
rootReference
.
updateCounter
-
oldRootReference
.
updateCounter
;
long
updateCounter
=
rootReference
.
updateCounter
-
oldRootReference
.
updateCounter
;
assert
updateCounter
>=
0
:
updateCounter
;
assert
updateCounter
>=
0
:
updateCounter
;
...
@@ -1521,7 +1500,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1521,7 +1500,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
int
index
=
pos
.
index
;
int
index
=
pos
.
index
;
CursorPos
tip
=
pos
;
CursorPos
tip
=
pos
;
pos
=
pos
.
parent
;
pos
=
pos
.
parent
;
final
V
result
=
index
<
0
?
null
:
(
V
)
p
.
getValue
(
index
);
V
result
=
index
<
0
?
null
:
(
V
)
p
.
getValue
(
index
);
Decision
decision
=
decisionMaker
.
decide
(
result
,
value
);
Decision
decision
=
decisionMaker
.
decide
(
result
,
value
);
int
unsavedMemory
=
0
;
int
unsavedMemory
=
0
;
...
@@ -1538,7 +1517,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1538,7 +1517,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
if
(
index
<
0
)
{
if
(
index
<
0
)
{
return
null
;
return
null
;
}
}
if
(
attempt
>
2
&&
!(
needUnlock
=
lockRoot
(
decisionMaker
,
rootReference
,
attempt
,
contention
)))
{
if
(
attempt
>
2
&&
!(
needUnlock
=
lockRoot
(
decisionMaker
,
rootReference
,
attempt
,
contention
)))
{
continue
;
continue
;
}
}
if
(
p
.
getTotalCount
()
==
1
&&
pos
!=
null
)
{
if
(
p
.
getTotalCount
()
==
1
&&
pos
!=
null
)
{
...
@@ -1557,7 +1537,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1557,7 +1537,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
break
;
break
;
}
}
case
PUT:
{
case
PUT:
{
if
(
attempt
>
2
&&
!(
needUnlock
=
lockRoot
(
decisionMaker
,
rootReference
,
attempt
,
contention
)))
{
if
(
attempt
>
2
&&
!(
needUnlock
=
lockRoot
(
decisionMaker
,
rootReference
,
attempt
,
contention
)))
{
continue
;
continue
;
}
}
value
=
decisionMaker
.
selectValue
(
result
,
value
);
value
=
decisionMaker
.
selectValue
(
result
,
value
);
...
@@ -1565,7 +1546,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1565,7 +1546,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
if
(
index
<
0
)
{
if
(
index
<
0
)
{
p
.
insertLeaf
(-
index
-
1
,
key
,
value
);
p
.
insertLeaf
(-
index
-
1
,
key
,
value
);
int
keyCount
;
int
keyCount
;
while
((
keyCount
=
p
.
getKeyCount
())
>
store
.
getKeysPerPage
()
||
p
.
getMemory
()
>
store
.
getMaxPageSize
()
while
((
keyCount
=
p
.
getKeyCount
())
>
store
.
getKeysPerPage
()
||
p
.
getMemory
()
>
store
.
getMaxPageSize
()
&&
keyCount
>
(
p
.
isLeaf
()
?
1
:
2
))
{
&&
keyCount
>
(
p
.
isLeaf
()
?
1
:
2
))
{
long
totalCount
=
p
.
getTotalCount
();
long
totalCount
=
p
.
getTotalCount
();
int
at
=
keyCount
>>
1
;
int
at
=
keyCount
>>
1
;
...
@@ -1629,7 +1611,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1629,7 +1611,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
}
}
private
boolean
lockRoot
(
DecisionMaker
<?
super
V
>
decisionMaker
,
RootReference
rootReference
,
private
boolean
lockRoot
(
DecisionMaker
<?
super
V
>
decisionMaker
,
RootReference
rootReference
,
int
attempt
,
int
contention
)
{
int
attempt
,
int
contention
)
{
boolean
success
=
lockRoot
(
rootReference
);
boolean
success
=
lockRoot
(
rootReference
);
if
(!
success
)
{
if
(!
success
)
{
decisionMaker
.
reset
();
decisionMaker
.
reset
();
...
@@ -1681,7 +1663,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1681,7 +1663,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
private
final
V
expectedValue
;
private
final
V
expectedValue
;
private
Decision
decision
;
private
Decision
decision
;
private
EqualsDecisionMaker
(
DataType
dataType
,
V
expectedValue
)
{
EqualsDecisionMaker
(
DataType
dataType
,
V
expectedValue
)
{
this
.
dataType
=
dataType
;
this
.
dataType
=
dataType
;
this
.
expectedValue
=
expectedValue
;
this
.
expectedValue
=
expectedValue
;
}
}
...
@@ -1699,7 +1681,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
...
@@ -1699,7 +1681,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
decision
=
null
;
decision
=
null
;
}
}
public
Decision
getDecision
()
{
Decision
getDecision
()
{
return
decision
;
return
decision
;
}
}
...
...
h2/src/main/org/h2/mvstore/MVStore.java
浏览文件 @
117b640f
...
@@ -158,7 +158,7 @@ public final class MVStore {
...
@@ -158,7 +158,7 @@ public final class MVStore {
private
volatile
boolean
closed
;
private
volatile
boolean
closed
;
private
final
FileStore
fileStore
;
final
FileStore
fileStore
;
private
final
boolean
fileStoreIsProvided
;
private
final
boolean
fileStoreIsProvided
;
private
final
int
pageSplitSize
;
private
final
int
pageSplitSize
;
...
@@ -170,14 +170,14 @@ public final class MVStore {
...
@@ -170,14 +170,14 @@ public final class MVStore {
* It is split in 16 segments. The stack move distance is 2% of the expected
* It is split in 16 segments. The stack move distance is 2% of the expected
* number of entries.
* number of entries.
*/
*/
private
final
CacheLongKeyLIRS
<
Page
>
cache
;
final
CacheLongKeyLIRS
<
Page
>
cache
;
/**
/**
* The page chunk references cache. The default size is 4 MB, and the
* The page chunk references cache. The default size is 4 MB, and the
* average size is 2 KB. It is split in 16 segments. The stack move distance
* average size is 2 KB. It is split in 16 segments. The stack move distance
* is 2% of the expected number of entries.
* is 2% of the expected number of entries.
*/
*/
private
final
CacheLongKeyLIRS
<
int
[]>
cacheChunkRef
;
final
CacheLongKeyLIRS
<
int
[]>
cacheChunkRef
;
/**
/**
* The newest chunk. If nothing was stored yet, this field is not set.
* The newest chunk. If nothing was stored yet, this field is not set.
...
@@ -505,15 +505,14 @@ public final class MVStore {
...
@@ -505,15 +505,14 @@ public final class MVStore {
}
}
public
synchronized
<
M
extends
MVMap
<
K
,
V
>,
K
,
V
>
M
openMap
(
int
id
,
public
synchronized
<
M
extends
MVMap
<
K
,
V
>,
K
,
V
>
M
openMap
(
int
id
,
MVMap
.
MapBuilder
<
M
,
K
,
V
>
builder
)
{
MVMap
.
MapBuilder
<
M
,
K
,
V
>
builder
)
{
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
M
map
=
(
M
)
getMap
(
id
);
M
map
=
(
M
)
getMap
(
id
);
if
(
map
==
null
)
{
if
(
map
==
null
)
{
String
configAsString
=
meta
.
get
(
MVMap
.
getMapKey
(
id
));
String
configAsString
=
meta
.
get
(
MVMap
.
getMapKey
(
id
));
if
(
configAsString
!=
null
)
{
if
(
configAsString
!=
null
)
{
HashMap
<
String
,
Object
>
config
=
new
HashMap
<>();
HashMap
<
String
,
Object
>
config
=
HashMap
<
String
,
String
>
cfg
=
DataUtils
.
parseMap
(
configAsString
);
new
HashMap
<
String
,
Object
>(
DataUtils
.
parseMap
(
configAsString
));
config
.
putAll
(
cfg
);
config
.
put
(
"id"
,
id
);
config
.
put
(
"id"
,
id
);
map
=
builder
.
create
(
this
,
config
);
map
=
builder
.
create
(
this
,
config
);
map
.
init
();
map
.
init
();
...
@@ -729,7 +728,8 @@ public final class MVStore {
...
@@ -729,7 +728,8 @@ public final class MVStore {
int
length
=
c
.
len
*
BLOCK_SIZE
;
int
length
=
c
.
len
*
BLOCK_SIZE
;
fileStore
.
markUsed
(
start
,
length
);
fileStore
.
markUsed
(
start
,
length
);
}
}
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
// read all chunk headers and footers within the retention time,
// read all chunk headers and footers within the retention time,
// to detect unwritten data after a power failure
// to detect unwritten data after a power failure
}
while
((
newest
=
verifyLastChunks
())
!=
null
);
}
while
((
newest
=
verifyLastChunks
())
!=
null
);
...
@@ -989,7 +989,7 @@ public final class MVStore {
...
@@ -989,7 +989,7 @@ public final class MVStore {
* @param pos the position
* @param pos the position
* @return the chunk
* @return the chunk
*/
*/
private
Chunk
getChunk
(
long
pos
)
{
Chunk
getChunk
(
long
pos
)
{
Chunk
c
=
getChunkIfFound
(
pos
);
Chunk
c
=
getChunkIfFound
(
pos
);
if
(
c
==
null
)
{
if
(
c
==
null
)
{
int
chunkId
=
DataUtils
.
getPageChunkId
(
pos
);
int
chunkId
=
DataUtils
.
getPageChunkId
(
pos
);
...
@@ -1203,7 +1203,8 @@ public final class MVStore {
...
@@ -1203,7 +1203,8 @@ public final class MVStore {
long
filePos
=
allocateFileSpace
(
length
,
!
reuseSpace
);
long
filePos
=
allocateFileSpace
(
length
,
!
reuseSpace
);
c
.
block
=
filePos
/
BLOCK_SIZE
;
c
.
block
=
filePos
/
BLOCK_SIZE
;
c
.
len
=
length
/
BLOCK_SIZE
;
c
.
len
=
length
/
BLOCK_SIZE
;
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
()
+
" "
+
c
;
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
()
+
" "
+
c
;
c
.
metaRootPos
=
metaRoot
.
getPos
();
c
.
metaRootPos
=
metaRoot
.
getPos
();
// calculate and set the likely next position
// calculate and set the likely next position
if
(
reuseSpace
)
{
if
(
reuseSpace
)
{
...
@@ -1311,7 +1312,8 @@ public final class MVStore {
...
@@ -1311,7 +1312,8 @@ public final class MVStore {
long
start
=
c
.
block
*
BLOCK_SIZE
;
long
start
=
c
.
block
*
BLOCK_SIZE
;
int
length
=
c
.
len
*
BLOCK_SIZE
;
int
length
=
c
.
len
*
BLOCK_SIZE
;
fileStore
.
free
(
start
,
length
);
fileStore
.
free
(
start
,
length
);
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
}
else
{
}
else
{
if
(
c
.
unused
==
0
)
{
if
(
c
.
unused
==
0
)
{
c
.
unused
=
time
;
c
.
unused
=
time
;
...
@@ -1370,7 +1372,7 @@ public final class MVStore {
...
@@ -1370,7 +1372,7 @@ public final class MVStore {
private
ChunkIdsCollector
child
;
private
ChunkIdsCollector
child
;
private
int
mapId
;
private
int
mapId
;
private
ChunkIdsCollector
(
int
mapId
)
{
ChunkIdsCollector
(
int
mapId
)
{
this
.
parent
=
null
;
this
.
parent
=
null
;
this
.
mapId
=
mapId
;
this
.
mapId
=
mapId
;
}
}
...
@@ -1448,7 +1450,7 @@ public final class MVStore {
...
@@ -1448,7 +1450,7 @@ public final class MVStore {
"Negative position {0}; p={1}, c={2}"
,
filePos
,
pos
,
chunk
.
toString
());
"Negative position {0}; p={1}, c={2}"
,
filePos
,
pos
,
chunk
.
toString
());
}
}
long
maxPos
=
(
chunk
.
block
+
chunk
.
len
)
*
BLOCK_SIZE
;
long
maxPos
=
(
chunk
.
block
+
chunk
.
len
)
*
BLOCK_SIZE
;
Page
.
readChildren
s
Positions
(
fileStore
,
pos
,
filePos
,
maxPos
,
childCollector
);
Page
.
readChildrenPositions
(
fileStore
,
pos
,
filePos
,
maxPos
,
childCollector
);
}
}
// and cache resulting set of chunk ids
// and cache resulting set of chunk ids
if
(
cacheChunkRef
!=
null
)
{
if
(
cacheChunkRef
!=
null
)
{
...
@@ -1476,9 +1478,9 @@ public final class MVStore {
...
@@ -1476,9 +1478,9 @@ public final class MVStore {
private
int
[]
getChunkIds
()
{
private
int
[]
getChunkIds
()
{
int
chunkIds
[]
=
new
int
[
referenced
.
size
()];
int
chunkIds
[]
=
new
int
[
referenced
.
size
()];
int
indx
=
0
;
int
ind
e
x
=
0
;
for
(
int
chunkId
:
referenced
)
{
for
(
int
chunkId
:
referenced
)
{
chunkIds
[
indx
++]
=
chunkId
;
chunkIds
[
ind
e
x
++]
=
chunkId
;
}
}
return
chunkIds
;
return
chunkIds
;
}
}
...
@@ -1948,7 +1950,7 @@ public final class MVStore {
...
@@ -1948,7 +1950,7 @@ public final class MVStore {
@Override
@Override
public
int
compare
(
Chunk
o1
,
Chunk
o2
)
{
public
int
compare
(
Chunk
o1
,
Chunk
o2
)
{
int
comp
=
Integer
.
compare
(
o1
.
collectPriority
,
int
comp
=
Integer
.
compare
(
o1
.
collectPriority
,
o2
.
collectPriority
);
o2
.
collectPriority
);
if
(
comp
==
0
)
{
if
(
comp
==
0
)
{
comp
=
Long
.
compare
(
o1
.
maxLenLive
,
comp
=
Long
.
compare
(
o1
.
maxLenLive
,
o2
.
maxLenLive
);
o2
.
maxLenLive
);
...
@@ -2202,7 +2204,7 @@ public final class MVStore {
...
@@ -2202,7 +2204,7 @@ public final class MVStore {
long
current
=
this
.
oldestVersionToKeep
.
get
();
long
current
=
this
.
oldestVersionToKeep
.
get
();
// Oldest version may only advance, never goes back
// Oldest version may only advance, never goes back
success
=
oldestVersionToKeep
<=
current
||
success
=
oldestVersionToKeep
<=
current
||
this
.
oldestVersionToKeep
.
compareAndSet
(
current
,
oldestVersionToKeep
);
this
.
oldestVersionToKeep
.
compareAndSet
(
current
,
oldestVersionToKeep
);
}
while
(!
success
);
}
while
(!
success
);
}
}
...
@@ -2391,7 +2393,8 @@ public final class MVStore {
...
@@ -2391,7 +2393,8 @@ public final class MVStore {
long
start
=
c
.
block
*
BLOCK_SIZE
;
long
start
=
c
.
block
*
BLOCK_SIZE
;
int
length
=
c
.
len
*
BLOCK_SIZE
;
int
length
=
c
.
len
*
BLOCK_SIZE
;
fileStore
.
free
(
start
,
length
);
fileStore
.
free
(
start
,
length
);
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
assert
fileStore
.
getFileLengthInUse
()
==
measureFileLengthInUse
()
:
fileStore
.
getFileLengthInUse
()
+
" != "
+
measureFileLengthInUse
();
// overwrite the chunk,
// overwrite the chunk,
// so it is not be used later on
// so it is not be used later on
WriteBuffer
buff
=
getWriteBuffer
();
WriteBuffer
buff
=
getWriteBuffer
();
...
@@ -2486,16 +2489,15 @@ public final class MVStore {
...
@@ -2486,16 +2489,15 @@ public final class MVStore {
"Renaming the meta map is not allowed"
);
"Renaming the meta map is not allowed"
);
int
id
=
map
.
getId
();
int
id
=
map
.
getId
();
String
oldName
=
getMapName
(
id
);
String
oldName
=
getMapName
(
id
);
if
(
oldName
.
equals
(
newName
))
{
if
(
oldName
!=
null
&&
!
oldName
.
equals
(
newName
))
{
return
;
DataUtils
.
checkArgument
(
!
meta
.
containsKey
(
"name."
+
newName
),
"A map named {0} already exists"
,
newName
);
meta
.
remove
(
"name."
+
oldName
);
meta
.
put
(
MVMap
.
getMapKey
(
id
),
map
.
asString
(
newName
));
meta
.
put
(
"name."
+
newName
,
Integer
.
toHexString
(
id
));
markMetaChanged
();
}
}
DataUtils
.
checkArgument
(
!
meta
.
containsKey
(
"name."
+
newName
),
"A map named {0} already exists"
,
newName
);
meta
.
remove
(
"name."
+
oldName
);
meta
.
put
(
MVMap
.
getMapKey
(
id
),
map
.
asString
(
newName
));
meta
.
put
(
"name."
+
newName
,
Integer
.
toHexString
(
id
));
markMetaChanged
();
}
}
/**
/**
...
@@ -2857,7 +2859,7 @@ public final class MVStore {
...
@@ -2857,7 +2859,7 @@ public final class MVStore {
public
final
long
version
;
public
final
long
version
;
public
final
AtomicInteger
counter
=
new
AtomicInteger
();
public
final
AtomicInteger
counter
=
new
AtomicInteger
();
private
TxCounter
(
long
version
)
{
TxCounter
(
long
version
)
{
this
.
version
=
version
;
this
.
version
=
version
;
}
}
...
@@ -3136,7 +3138,5 @@ public final class MVStore {
...
@@ -3136,7 +3138,5 @@ public final class MVStore {
// Cast from HashMap<String, String> to HashMap<String, Object> is safe
// Cast from HashMap<String, String> to HashMap<String, Object> is safe
return
new
Builder
((
HashMap
)
DataUtils
.
parseMap
(
s
));
return
new
Builder
((
HashMap
)
DataUtils
.
parseMap
(
s
));
}
}
}
}
}
}
h2/src/main/org/h2/mvstore/Page.java
浏览文件 @
117b640f
...
@@ -66,16 +66,33 @@ public abstract class Page implements Cloneable
...
@@ -66,16 +66,33 @@ public abstract class Page implements Cloneable
private
volatile
boolean
removedInMemory
;
private
volatile
boolean
removedInMemory
;
/**
/**
* The estimated number of bytes used per
page object
.
* The estimated number of bytes used per
base page
.
*/
*/
private
static
final
int
PAGE_MEMORY
=
Constants
.
MEMORY_OBJECT
+
2
*
Constants
.
MEMORY_POINTER
+
Constants
.
MEMORY_ARRAY
+
17
;
private
static
final
int
PAGE_MEMORY
=
protected
static
final
int
PAGE_NODE_MEMORY
=
PAGE_MEMORY
+
Constants
.
MEMORY_POINTER
+
8
+
Constants
.
MEMORY_ARRAY
;
Constants
.
MEMORY_OBJECT
+
// this
protected
static
final
int
PAGE_LEAF_MEMORY
=
PAGE_MEMORY
+
Constants
.
MEMORY_POINTER
+
Constants
.
MEMORY_ARRAY
;
2
*
Constants
.
MEMORY_POINTER
+
// map, keys
Constants
.
MEMORY_ARRAY
+
// Object[] keys
17
;
// pos, cachedCompare, memory, removedInMemory
/**
* The estimated number of bytes used per empty internal page object.
*/
static
final
int
PAGE_NODE_MEMORY
=
PAGE_MEMORY
+
// super
Constants
.
MEMORY_POINTER
+
// children
Constants
.
MEMORY_ARRAY
+
// totalCount
8
;
/**
* The estimated number of bytes used per empty leaf page.
*/
static
final
int
PAGE_LEAF_MEMORY
=
PAGE_MEMORY
+
// super
Constants
.
MEMORY_POINTER
+
// values
Constants
.
MEMORY_ARRAY
;
// Object[] values
/**
/**
* The estimated number of bytes used per child entry.
* The estimated number of bytes used per child entry.
*/
*/
protected
static
final
int
PAGE_MEMORY_CHILD
=
Constants
.
MEMORY_POINTER
+
16
;
// 16 = two longs
static
final
int
PAGE_MEMORY_CHILD
=
Constants
.
MEMORY_POINTER
+
16
;
// 16 = two longs
/**
/**
* An empty object array.
* An empty object array.
...
@@ -90,16 +107,16 @@ public abstract class Page implements Cloneable
...
@@ -90,16 +107,16 @@ public abstract class Page implements Cloneable
private
static
final
PageReference
[]
SINGLE_EMPTY
=
{
PageReference
.
EMPTY
};
private
static
final
PageReference
[]
SINGLE_EMPTY
=
{
PageReference
.
EMPTY
};
private
Page
(
MVMap
<?,
?>
map
)
{
Page
(
MVMap
<?,
?>
map
)
{
this
.
map
=
map
;
this
.
map
=
map
;
}
}
private
Page
(
MVMap
<?,
?>
map
,
Page
source
)
{
Page
(
MVMap
<?,
?>
map
,
Page
source
)
{
this
(
map
,
source
.
keys
);
this
(
map
,
source
.
keys
);
memory
=
source
.
memory
;
memory
=
source
.
memory
;
}
}
private
Page
(
MVMap
<?,
?>
map
,
Object
keys
[])
{
Page
(
MVMap
<?,
?>
map
,
Object
keys
[])
{
this
.
map
=
map
;
this
.
map
=
map
;
this
.
keys
=
keys
;
this
.
keys
=
keys
;
}
}
...
@@ -221,9 +238,9 @@ public abstract class Page implements Cloneable
...
@@ -221,9 +238,9 @@ public abstract class Page implements Cloneable
* @param maxPos the maximum position (the end of the chunk)
* @param maxPos the maximum position (the end of the chunk)
* @param collector to report child pages positions to
* @param collector to report child pages positions to
*/
*/
static
void
readChildren
s
Positions
(
FileStore
fileStore
,
long
pos
,
static
void
readChildrenPositions
(
FileStore
fileStore
,
long
pos
,
long
filePos
,
long
maxPos
,
long
filePos
,
long
maxPos
,
MVStore
.
ChunkIdsCollector
collector
)
{
MVStore
.
ChunkIdsCollector
collector
)
{
ByteBuffer
buff
;
ByteBuffer
buff
;
int
maxLength
=
DataUtils
.
getPageMaxLength
(
pos
);
int
maxLength
=
DataUtils
.
getPageMaxLength
(
pos
);
if
(
maxLength
==
DataUtils
.
PAGE_LARGE
)
{
if
(
maxLength
==
DataUtils
.
PAGE_LARGE
)
{
...
@@ -291,9 +308,9 @@ public abstract class Page implements Cloneable
...
@@ -291,9 +308,9 @@ public abstract class Page implements Cloneable
/**
/**
* Create a copy of this page with potentially different owning map.
* Create a copy of this page with potentially different owning map.
* This is used exclusively during bulk map cop
i
ing.
* This is used exclusively during bulk map cop
y
ing.
* Child page references for nodes are cleared (repointed to an empty page)
* Child page references for nodes are cleared (re
-
pointed to an empty page)
* to be filled-in later to cop
i
ing procedure. This way it can be saved
* to be filled-in later to cop
y
ing procedure. This way it can be saved
* mid-process without tree integrity violation
* mid-process without tree integrity violation
*
*
* @param map new map to own resulting page
* @param map new map to own resulting page
...
@@ -468,7 +485,7 @@ public abstract class Page implements Cloneable
...
@@ -468,7 +485,7 @@ public abstract class Page implements Cloneable
*/
*/
abstract
Page
split
(
int
at
);
abstract
Page
split
(
int
at
);
protected
final
Object
[]
splitKeys
(
int
aCount
,
int
bCount
)
{
final
Object
[]
splitKeys
(
int
aCount
,
int
bCount
)
{
assert
aCount
+
bCount
<=
getKeyCount
();
assert
aCount
+
bCount
<=
getKeyCount
();
Object
aKeys
[]
=
createKeyStorage
(
aCount
);
Object
aKeys
[]
=
createKeyStorage
(
aCount
);
Object
bKeys
[]
=
createKeyStorage
(
bCount
);
Object
bKeys
[]
=
createKeyStorage
(
bCount
);
...
@@ -549,7 +566,7 @@ public abstract class Page implements Cloneable
...
@@ -549,7 +566,7 @@ public abstract class Page implements Cloneable
public
abstract
void
insertNode
(
int
index
,
Object
key
,
Page
childPage
);
public
abstract
void
insertNode
(
int
index
,
Object
key
,
Page
childPage
);
@SuppressWarnings
(
"SuspiciousSystemArraycopy"
)
@SuppressWarnings
(
"SuspiciousSystemArraycopy"
)
protected
final
void
insertKey
(
int
index
,
Object
key
)
{
final
void
insertKey
(
int
index
,
Object
key
)
{
int
keyCount
=
getKeyCount
();
int
keyCount
=
getKeyCount
();
assert
index
<=
keyCount
:
index
+
" > "
+
keyCount
;
assert
index
<=
keyCount
:
index
+
" > "
+
keyCount
;
Object
[]
newKeys
=
new
Object
[
keyCount
+
1
];
Object
[]
newKeys
=
new
Object
[
keyCount
+
1
];
...
@@ -571,16 +588,15 @@ public abstract class Page implements Cloneable
...
@@ -571,16 +588,15 @@ public abstract class Page implements Cloneable
public
void
remove
(
int
index
)
{
public
void
remove
(
int
index
)
{
int
keyCount
=
getKeyCount
();
int
keyCount
=
getKeyCount
();
DataType
keyType
=
map
.
getKeyType
();
DataType
keyType
=
map
.
getKeyType
();
int
indx
=
index
;
if
(
index
==
keyCount
)
{
if
(
indx
==
keyCount
)
{
--
index
;
--
indx
;
}
}
if
(
isPersistent
())
{
if
(
isPersistent
())
{
Object
old
=
getKey
(
indx
);
Object
old
=
getKey
(
ind
e
x
);
addMemory
(-
keyType
.
getMemory
(
old
));
addMemory
(-
keyType
.
getMemory
(
old
));
}
}
Object
newKeys
[]
=
new
Object
[
keyCount
-
1
];
Object
newKeys
[]
=
new
Object
[
keyCount
-
1
];
DataUtils
.
copyExcept
(
keys
,
newKeys
,
keyCount
,
indx
);
DataUtils
.
copyExcept
(
keys
,
newKeys
,
keyCount
,
ind
e
x
);
keys
=
newKeys
;
keys
=
newKeys
;
}
}
...
@@ -792,7 +808,7 @@ public abstract class Page implements Cloneable
...
@@ -792,7 +808,7 @@ public abstract class Page implements Cloneable
return
0
;
//getKeyCount();
return
0
;
//getKeyCount();
}
}
protected
final
void
addMemory
(
int
mem
)
{
final
void
addMemory
(
int
mem
)
{
memory
+=
mem
;
memory
+=
mem
;
}
}
...
@@ -826,7 +842,7 @@ public abstract class Page implements Cloneable
...
@@ -826,7 +842,7 @@ public abstract class Page implements Cloneable
return
new
Object
[
size
];
return
new
Object
[
size
];
}
}
protected
final
Object
[]
createValueStorage
(
int
size
)
final
Object
[]
createValueStorage
(
int
size
)
{
{
return
new
Object
[
size
];
return
new
Object
[
size
];
}
}
...
@@ -857,7 +873,7 @@ public abstract class Page implements Cloneable
...
@@ -857,7 +873,7 @@ public abstract class Page implements Cloneable
this
(
page
,
page
.
getPos
(),
page
.
getTotalCount
());
this
(
page
,
page
.
getPos
(),
page
.
getTotalCount
());
}
}
private
PageReference
(
long
pos
,
long
count
)
{
PageReference
(
long
pos
,
long
count
)
{
this
(
null
,
pos
,
count
);
this
(
null
,
pos
,
count
);
assert
pos
!=
0
;
assert
pos
!=
0
;
}
}
...
@@ -887,9 +903,9 @@ public abstract class Page implements Cloneable
...
@@ -887,9 +903,9 @@ public abstract class Page implements Cloneable
/**
/**
* The total entry count of this page and all children.
* The total entry count of this page and all children.
*/
*/
private
long
totalCount
;
private
long
totalCount
;
private
NonLeaf
(
MVMap
<?,
?>
map
)
{
NonLeaf
(
MVMap
<?,
?>
map
)
{
super
(
map
);
super
(
map
);
}
}
...
@@ -899,7 +915,7 @@ public abstract class Page implements Cloneable
...
@@ -899,7 +915,7 @@ public abstract class Page implements Cloneable
this
.
totalCount
=
totalCount
;
this
.
totalCount
=
totalCount
;
}
}
private
NonLeaf
(
MVMap
<?,
?>
map
,
Object
keys
[],
PageReference
children
[],
long
totalCount
)
{
NonLeaf
(
MVMap
<?,
?>
map
,
Object
keys
[],
PageReference
children
[],
long
totalCount
)
{
super
(
map
,
keys
);
super
(
map
,
keys
);
this
.
children
=
children
;
this
.
children
=
children
;
this
.
totalCount
=
totalCount
;
this
.
totalCount
=
totalCount
;
...
@@ -945,6 +961,7 @@ public abstract class Page implements Cloneable
...
@@ -945,6 +961,7 @@ public abstract class Page implements Cloneable
throw
new
UnsupportedOperationException
();
throw
new
UnsupportedOperationException
();
}
}
@Override
@SuppressWarnings
(
"SuspiciousSystemArraycopy"
)
@SuppressWarnings
(
"SuspiciousSystemArraycopy"
)
public
Page
split
(
int
at
)
{
public
Page
split
(
int
at
)
{
assert
!
isSaved
();
assert
!
isSaved
();
...
@@ -1173,7 +1190,7 @@ public abstract class Page implements Cloneable
...
@@ -1173,7 +1190,7 @@ public abstract class Page implements Cloneable
*/
*/
private
Object
values
[];
private
Object
values
[];
private
Leaf
(
MVMap
<?,
?>
map
)
{
Leaf
(
MVMap
<?,
?>
map
)
{
super
(
map
);
super
(
map
);
}
}
...
@@ -1182,7 +1199,7 @@ public abstract class Page implements Cloneable
...
@@ -1182,7 +1199,7 @@ public abstract class Page implements Cloneable
this
.
values
=
source
.
values
;
this
.
values
=
source
.
values
;
}
}
private
Leaf
(
MVMap
<?,
?>
map
,
Object
keys
[],
Object
values
[])
{
Leaf
(
MVMap
<?,
?>
map
,
Object
keys
[],
Object
values
[])
{
super
(
map
,
keys
);
super
(
map
,
keys
);
this
.
values
=
values
;
this
.
values
=
values
;
}
}
...
@@ -1256,7 +1273,7 @@ public abstract class Page implements Cloneable
...
@@ -1256,7 +1273,7 @@ public abstract class Page implements Cloneable
Object
old
=
setValueInternal
(
index
,
value
);
Object
old
=
setValueInternal
(
index
,
value
);
if
(
isPersistent
())
{
if
(
isPersistent
())
{
addMemory
(
valueType
.
getMemory
(
value
)
-
addMemory
(
valueType
.
getMemory
(
value
)
-
valueType
.
getMemory
(
old
));
valueType
.
getMemory
(
old
));
}
}
return
old
;
return
old
;
}
}
...
...
h2/src/main/org/h2/mvstore/rtree/MVRTreeMap.java
浏览文件 @
117b640f
...
@@ -26,7 +26,7 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
...
@@ -26,7 +26,7 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
/**
/**
* The spatial key type.
* The spatial key type.
*/
*/
private
final
SpatialDataType
keyType
;
final
SpatialDataType
keyType
;
private
boolean
quadraticSplit
;
private
boolean
quadraticSplit
;
...
@@ -177,29 +177,29 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
...
@@ -177,29 +177,29 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
private
V
operate
(
Page
p
,
Object
key
,
V
value
,
DecisionMaker
<?
super
V
>
decisionMaker
)
{
private
V
operate
(
Page
p
,
Object
key
,
V
value
,
DecisionMaker
<?
super
V
>
decisionMaker
)
{
V
result
=
null
;
V
result
=
null
;
if
(
p
.
isLeaf
())
{
if
(
p
.
isLeaf
())
{
int
indx
=
-
1
;
int
ind
e
x
=
-
1
;
int
keyCount
=
p
.
getKeyCount
();
int
keyCount
=
p
.
getKeyCount
();
for
(
int
i
=
0
;
i
<
keyCount
;
i
++)
{
for
(
int
i
=
0
;
i
<
keyCount
;
i
++)
{
if
(
keyType
.
equals
(
p
.
getKey
(
i
),
key
))
{
if
(
keyType
.
equals
(
p
.
getKey
(
i
),
key
))
{
indx
=
i
;
ind
e
x
=
i
;
}
}
}
}
result
=
ind
x
<
0
?
null
:
(
V
)
p
.
getValue
(
ind
x
);
result
=
ind
ex
<
0
?
null
:
(
V
)
p
.
getValue
(
inde
x
);
Decision
decision
=
decisionMaker
.
decide
(
result
,
value
);
Decision
decision
=
decisionMaker
.
decide
(
result
,
value
);
switch
(
decision
)
{
switch
(
decision
)
{
case
ABORT:
break
;
case
ABORT:
break
;
case
REMOVE:
case
REMOVE:
if
(
indx
>=
0
)
{
if
(
ind
e
x
>=
0
)
{
p
.
remove
(
indx
);
p
.
remove
(
ind
e
x
);
}
}
break
;
break
;
case
PUT:
case
PUT:
value
=
decisionMaker
.
selectValue
(
result
,
value
);
value
=
decisionMaker
.
selectValue
(
result
,
value
);
if
(
indx
<
0
)
{
if
(
ind
e
x
<
0
)
{
p
.
insertLeaf
(
p
.
getKeyCount
(),
key
,
value
);
p
.
insertLeaf
(
p
.
getKeyCount
(),
key
,
value
);
}
else
{
}
else
{
p
.
setKey
(
indx
,
key
);
p
.
setKey
(
ind
e
x
,
key
);
p
.
setValue
(
indx
,
value
);
p
.
setValue
(
ind
e
x
,
value
);
}
}
break
;
break
;
}
}
...
@@ -608,6 +608,7 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
...
@@ -608,6 +608,7 @@ public final class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
* @param valueType the key type
* @param valueType the key type
* @return this
* @return this
*/
*/
@Override
public
Builder
<
V
>
valueType
(
DataType
valueType
)
{
public
Builder
<
V
>
valueType
(
DataType
valueType
)
{
setValueType
(
valueType
);
setValueType
(
valueType
);
return
this
;
return
this
;
...
...
h2/src/test/org/h2/test/store/TestMVStore.java
浏览文件 @
117b640f
...
@@ -1375,7 +1375,7 @@ public class TestMVStore extends TestBase {
...
@@ -1375,7 +1375,7 @@ public class TestMVStore extends TestBase {
// This test tries to cast in bronze some peculiar behaviour,
// This test tries to cast in bronze some peculiar behaviour,
// which is rather implementation artifact then intentional.
// which is rather implementation artifact then intentional.
// Once store is closed, only one sinle version of the data
// Once store is closed, only one sin
g
le version of the data
// will exists upon re-opening - the latest.
// will exists upon re-opening - the latest.
// I hope nobody relies on this "multi-versioning".
// I hope nobody relies on this "multi-versioning".
/*
/*
...
...
h2/src/tools/org/h2/build/doc/dictionary.txt
浏览文件 @
117b640f
...
@@ -11,11 +11,11 @@ activities activity acts actual actually acute adam adamo adams adapter adapters
...
@@ -11,11 +11,11 @@ activities activity acts actual actually acute adam adamo adams adapter adapters
adapting adaptive add added addiction adding addition additional additionally
adapting adaptive add added addiction adding addition additional additionally
additions addon addr address addressed addresses adds adeptia adjacent adjust
additions addon addr address addressed addresses adds adeptia adjacent adjust
adjusted adjusts admin administration administrator admins admission ado adopt
adjusted adjusts admin administration administrator admins admission ado adopt
advanced advances advantage advantages advised aeiou aejaks aelig aes afaik
advance
advance
d advances advantage advantages advised aeiou aejaks aelig aes afaik
affect affected affects affero affine affinity after afterwards again against agar age
affect affected affects affero affine affinity after afterwards again against agar age
agent agentlib agg aggregate aggregated aggregates aggregating aggressive agile
agent agentlib agg aggregate aggregated aggregates aggregating aggressive agile
agrave agree agreeable agreed agreement agreements agrees ahead
agrave agree agreeable agreed agreement agreements agrees ahead
ahilmnqbjkcdeopfrsg aid ajax alan alarm ale alefsym alert alessio alexander alfki
ahilmnqbjkcdeopfrsg aid a
ir a
jax alan alarm ale alefsym alert alessio alexander alfki
algo algorithm algorithms alias aliased aliases aliasing align aligned alignment
algo algorithm algorithms alias aliased aliases aliasing align aligned alignment
alive all allclasses alleged alleging allocate allocated allocates allocating
alive all allclasses alleged alleging allocate allocated allocates allocating
allocation allow allowed allowing allows almost aload alone along alpha
allocation allow allowed allowing allows almost aload alone along alpha
...
@@ -66,7 +66,7 @@ border bordercolor borg borges boss bot both bottlenecks bottom bound boundaries
...
@@ -66,7 +66,7 @@ border bordercolor borg borges boss bot both bottlenecks bottom bound boundaries
boundary bounding bounds bout box boysenberry bpchar bpm brace braces brack
boundary bounding bounds bout box boysenberry bpchar bpm brace braces brack
bracket brackets bradmesserle branch branches branda brasil brasilia breach
bracket brackets bradmesserle branch branches branda brasil brasilia breach
breadth break breaking breaks bridge bring brings brittain broke broken broker
breadth break breaking breaks bridge bring brings brittain broke broken broker
brought brown browse browser browsers brute brvbar bsdiff bson bsr btc btree
bro
nze bro
ught brown browse browser browsers brute brvbar bsdiff bson bsr btc btree
btrfs bucher bucket buckets buddha buf buff buffer buffered buffering buffers bug
btrfs bucher bucket buckets buddha buf buff buffer buffered buffering buffers bug
bugfix bugfixes buggy bugs build builder building builds built bukkit bulk bull
bugfix bugfixes buggy bugs build builder building builds built bukkit bulk bull
builtin bundle bundled bundles bungisoft burden business busy but button bxor bye
builtin bundle bundled bundles bungisoft burden business busy but button bxor bye
...
@@ -127,7 +127,7 @@ consisting consists console consortium conspicuously const constant constants
...
@@ -127,7 +127,7 @@ consisting consists console consortium conspicuously const constant constants
constitute constitutes constraint constraints construct constructed constructing
constitute constitutes constraint constraints construct constructed constructing
construction constructor constructors constructs construe construed consult
construction constructor constructors constructs construe construed consult
consulting consumes consumption contact contacts contain contained container
consulting consumes consumption contact contacts contain contained container
containers containing contains contended contends content contents context
containers containing contains contended contends content content
ion content
s context
contiguous contingent continuation continue continued continues continuous
contiguous contingent continuation continue continued continues continuous
contract contracts contribute contributed contributes contributing contribution
contract contracts contribute contributed contributes contributing contribution
contributions contributor contributors control controlled controller controls
contributions contributor contributors control controlled controller controls
...
@@ -175,7 +175,7 @@ deprecate deprecated deprecation dept depth deque derby derbyclient derbynet
...
@@ -175,7 +175,7 @@ deprecate deprecated deprecation dept depth deque derby derbyclient derbynet
deregister derivation derivative derive derived des desc descendant descending
deregister derivation derivative derive derived des desc descendant descending
descent descr describe described describes describing description descriptions
descent descr describe described describes describing description descriptions
descriptor deserialization deserialize deserializing design designate designated
descriptor deserialization deserialize deserializing design designate designated
designator designed designer desirable desired desktop dest destdir destination
designator design
ates design
ed designer desirable desired desktop dest destdir destination
destroy destroyed destroyer destroying destruct destruction destructor detail
destroy destroyed destroyer destroying destruct destruction destructor detail
detailed details detect detected detecting detection detector detects determine
detailed details detect detected detecting detection detector detects determine
determining deterministic detrimental deusen deutsch dev develop developed
determining deterministic detrimental deusen deutsch dev develop developed
...
@@ -209,7 +209,7 @@ eater ebean ecb eccn ecdh echo ecirc eckenfelder eckenfels ecl eclipse eclipsecs
...
@@ -209,7 +209,7 @@ eater ebean ecb eccn ecdh echo ecirc eckenfelder eckenfels ecl eclipse eclipsecs
eclipselink ecm ecole eder edge edh edit editable edited editing edition editor
eclipselink ecm ecole eder edge edh edit editable edited editing edition editor
editors edugility effect effective effectively effects efficient efficiently
editors edugility effect effective effectively effects efficient efficiently
effort egrave eid eing eins einstellung either elapsed eldest elect electronic
effort egrave eid eing eins einstellung either elapsed eldest elect electronic
element elements elephant elig eliminate elisabetta ell ellipsis elm else
element elements elephant elig eli
gible eli
minate elisabetta ell ellipsis elm else
elsewhere elton email emails embedded embedding embeds emergency emf emit emitted
elsewhere elton email emails embedded embedding embeds emergency emf emit emitted
emma empire employee empty emsp emulate emulated emulates emulation enable
emma empire employee empty emsp emulate emulated emulates emulation enable
enabled enables enabling enc encapsulates enclose enclosed enclosing encode
enabled enables enabling enc encapsulates enclose enclosed enclosing encode
...
@@ -217,8 +217,8 @@ encoded encoder encodes encoding encountered encounters encrypt encrypted
...
@@ -217,8 +217,8 @@ encoded encoder encodes encoding encountered encounters encrypt encrypted
encrypting encryption encrypts end ended enderbury endif ending endings endless
encrypting encryption encrypts end ended enderbury endif ending endings endless
endlessly endorse ends enforce enforceability enforceable enforced engine engines
endlessly endorse ends enforce enforceability enforceable enforced engine engines
english enhance enhanced enhancement enhancer enlarge enough enqueued ensp ensure
english enhance enhanced enhancement enhancer enlarge enough enqueued ensp ensure
ensures ensuring enter entered entering enterprise entire entities entity entr
ies
ensures ensuring enter entered entering enterprise entire entities entity entr
ance
entry enum enumerate enumerated enumerator enumerators enumeration env envelope
entr
ies entr
y enum enumerate enumerated enumerator enumerators enumeration env envelope
environment environments enwiki eof eol epl epoch epoll epsilon equal equality equally
environment environments enwiki eof eol epl epoch epoll epsilon equal equality equally
equals equipment equitable equiv equivalent equivalents era erable eremainder eric
equals equipment equitable equiv equivalent equivalents era erable eremainder eric
erik err error errorlevel errors erwan ery esc escape escaped escapes escaping
erik err error errorlevel errors erwan ery esc escape escaped escapes escaping
...
@@ -247,7 +247,7 @@ february federal federated federation fedotovs fee feed feedback fees feff fetch
...
@@ -247,7 +247,7 @@ february federal federated federation fedotovs fee feed feedback fees feff fetch
fetched fetching few fewer ffeecc fffe fid field fields fiery fifo fifty file
fetched fetching few fewer ffeecc fffe fid field fields fiery fifo fifty file
filed filename filepwd files filesystem fill filled filler fillers filling fills
filed filename filepwd files filesystem fill filled filler fillers filling fills
filo filter filtered filtering filters fin final finalization finalize finalizer
filo filter filtered filtering filters fin final finalization finalize finalizer
finally find finder finding finds fine finer finish finished finland fire
finally find finder finding finds fine finer finish finished fin
ishes fin
land fire
firebird firebirdsql fired firefox firewall first firstname fish fit fitness fits
firebird firebirdsql fired firefox firewall first firstname fish fit fitness fits
fitting five fix fixed fixes fixing fkcolumn fktable flag flags flash flashback
fitting five fix fixed fixes fixing fkcolumn fktable flag flags flash flashback
flat fle fletcher flexibility flexible flexive flip flipped fload float floating
flat fle fletcher flexibility flexible flexive flip flipped fload float floating
...
@@ -350,7 +350,7 @@ joel joerg johann john johnny johnson join joined joining joins joist jon jones
...
@@ -350,7 +350,7 @@ joel joerg johann john johnny johnson join joined joining joins joist jon jones
joonas jooq jopr jorissen jpa jpox jps jre jsessionid json jsp jsr jsse jstack
joonas jooq jopr jorissen jpa jpox jps jre jsessionid json jsp jsr jsse jstack
jtds jts judged judgment judicial julian july jump jumps jun junctions junit
jtds jts judged judgment judicial julian july jump jumps jun junctions junit
jurczyk jurisdiction jurisdictions jury just jvm jvoid kaiser kappa karin karl
jurczyk jurisdiction jurisdictions jury just jvm jvoid kaiser kappa karin karl
karlsson kaspersky kawashima keegan keep keeping keeps ken kept kerberos kernel
karlsson kaspersky kawashima keegan keep keep
er keep
ing keeps ken kept kerberos kernel
kerry kevent key keyalg keying keypass keys keystore keystores keytool keyword
kerry kevent key keyalg keying keypass keys keystore keystores keytool keyword
keywords khtml kicks kidd kill killed killer killing kills kilobytes kind
keywords khtml kicks kidd kill killed killer killing kills kilobytes kind
kindergarden kinds kingdom kiritimati kit kiwi knife know knowing knowledge known
kindergarden kinds kingdom kiritimati kit kiwi knife know knowing knowledge known
...
@@ -382,7 +382,7 @@ lshl lshr lsm lsquo lstore lsub lte ltrim lucene lucerne lugano lukas lumber
...
@@ -382,7 +382,7 @@ lshl lshr lsm lsquo lstore lsub lte ltrim lucene lucerne lugano lukas lumber
lumberjack luntbuild lushr lutin lxabcdef lxor lying lynx lzf mac macdonald
lumberjack luntbuild lushr lutin lxabcdef lxor lying lynx lzf mac macdonald
machine machines maciej macr macro macromedia macros made magic magnolia magyar
machine machines maciej macr macro macromedia macros made magic magnolia magyar
mahon mail mailing main mainly maintain maintained maintaining maintains
mahon mail mailing main mainly maintain maintained maintaining maintains
maintenance major majority make makensis makes making malformed malfunction man
maintenance major majority make makensis make
r make
s making malformed malfunction man
manage management manager managing manifest manifested manipulate manipulating
manage management manager managing manifest manifested manipulate manipulating
manipulation manipulations manley manner manske manual manually many map mapped
manipulation manipulations manley manner manske manual manually many map mapped
mapper mapping mappings maps mar marc march marcio marcy margin marginheight
mapper mapping mappings maps mar marc march marcio marcy margin marginheight
...
@@ -397,7 +397,7 @@ mediumblob mediumint mediumtext megabyte megabytes mehner meier meijer melbourne
...
@@ -397,7 +397,7 @@ mediumblob mediumint mediumtext megabyte megabytes mehner meier meijer melbourne
mem member members memcpy memmove memo memory mendonca mentioned menu
mem member members memcpy memmove memo memory mendonca mentioned menu
merchantability merchantable merge merged merges merging meridian message
merchantability merchantable merge merged merges merging meridian message
messager messages messes met meta metadata meteorite method methods mfulton mgmt
messager messages messes met meta metadata meteorite method methods mfulton mgmt
michael michi micro microarray microarrays microsoft middle middleware middot
michael michi micro microarray microarrays microsoft mid
mid
dle middleware middot
midnight midori midpoint might migrate migrated migrating migration mill miller
midnight midori midpoint might migrate migrated migrating migration mill miller
million millions millis millisecond milliseconds mime mimer min mind mine
million millions millis millisecond milliseconds mime mimer min mind mine
minecraft mini minimal minimalistic minimum minneapolis minor mins minus minute
minecraft mini minimal minimalistic minimum minneapolis minor mins minus minute
...
@@ -451,7 +451,7 @@ ought ouml our out outback outdated outer outfile outline outln outperforms
...
@@ -451,7 +451,7 @@ ought ouml our out outback outdated outer outfile outline outln outperforms
output outset outside outstanding over overall overcareful overflow overflows
output outset outside outstanding over overall overcareful overflow overflows
overhead overlap overlapping overlaps overload overloaded overloading overridden overriding
overhead overlap overlapping overlaps overload overloaded overloading overridden overriding
override overrides overtakes overtaking overview overwrite overwrites overwriting
override overrides overtakes overtaking overview overwrite overwrites overwriting
overwritten overwrote owl own ownable owned owner owners ownership owns oymaurice
overwritten overwrote owl own ownable owned owner owners ownership own
ing own
s oymaurice
pacific pack package packages packaging packets pad padded padding page paged
pacific pack package packages packaging packets pad padded padding page paged
pages pagestore pageview pagination pair pairs pal panel panels panic papa paper
pages pagestore pageview pagination pair pairs pal panel panels panic papa paper
para paradox paragraph paragraphs parallel param parameter parameterized
para paradox paragraph paragraphs parallel param parameter parameterized
...
@@ -462,7 +462,7 @@ particularly parties partition partitioning partners partnership parts party pas
...
@@ -462,7 +462,7 @@ particularly parties partition partitioning partners partnership parts party pas
passed passes passing passive password passwords past paste pastebin pasted
passed passes passing passive password passwords past paste pastebin pasted
pasties pasv patadia patch patched patches patching patent patents path pathogen
pasties pasv patadia patch patched patches patching patent patents path pathogen
paths pattern patterns paul pause paused pauses pay payload payment pbkdf pdf pdo
paths pattern patterns paul pause paused pauses pay payload payment pbkdf pdf pdo
peace pears peek pencil pending pengxiang people pepper per percent percentage
peace pears pe
culiar pe
ek pencil pending pengxiang people pepper per percent percentage
perfect perform performance performed performing performs perhaps period periodic
perfect perform performance performed performing performs perhaps period periodic
periodically periods permanently permil permission permissions permits permitted
periodically periods permanently permil permission permissions permits permitted
permutation permutations perp persist persisted persistence persistent persister
permutation permutations perp persist persisted persistence persistent persister
...
@@ -472,7 +472,7 @@ philosophers phone php phrase phrases phromros physical pick picked pickle pico
...
@@ -472,7 +472,7 @@ philosophers phone php phrase phrases phromros physical pick picked pickle pico
pid pieces pier pietrzak pilot piman ping pinned pipe piped pit pitest piv pivot
pid pieces pier pietrzak pilot piman ping pinned pipe piped pit pitest piv pivot
pkcolumn pkcs pktable place placed placeholders places placing plain plaintext
pkcolumn pkcs pktable place placed placeholders places placing plain plaintext
plan planned planner planning plans plant platform platforms play player please
plan planned planner planning plans plant platform platforms play player please
plug pluggable plugin plugins plus plusmn png point pointbase pointer pointers
plug pluggable plugin plugins plus plusmn png point pointbase pointe
d pointe
r pointers
pointing points poker poland polar pole poleposition policies policy polish poll
pointing points poker poland polar pole poleposition policies policy polish poll
polling polski poly polygon pom pondered poodle pool poolable pooled pooling
polling polski poly polygon pom pondered poodle pool poolable pooled pooling
pools poor poormans pop popular populate populated population popup port
pools poor poormans pop popular populate populated population popup port
...
@@ -513,13 +513,13 @@ reach reachable reached reaches read readability readable reader readers reading
...
@@ -513,13 +513,13 @@ reach reachable reached reaches read readability readable reader readers reading
readonly reads readwrite ready real reality really realm realtime reaper reason
readonly reads readwrite ready real reality really realm realtime reaper reason
reasonable reasonably reasoning reasons rebind rebuild rebuilt rec recalculate
reasonable reasonably reasoning reasons rebind rebuild rebuilt rec recalculate
receipt receive received receives receiving recency recent recently recipient
receipt receive received receives receiving recency recent recently recipient
recipients reclaimed rec
oding recognized recommendations recommended recompile
recipients reclaimed rec
lamation recoding recognized recommendations recommended
recompiles reconnect reconnected reconnecting reconstruct record recorded
recompile
recompile
s reconnect reconnected reconnecting reconstruct record recorded
recorder recording records recover recovered recovering recovers recovery
recorder recording records recover recovered recovering recovers recovery
recreate recreated recreation rect rectangle rectangular recurse recursing
recreate recreated recreation rect rectangle rectangular recurse recursing
recursion recursions recursive recursively recycle recycled red redeployment
recursion recursions recursive recursively recycle recycled red redeployment
redirect redirected redirection redirector redirects redistribute redistribution
redirect redirected redirection redirector redirects redistribute redistribution
redistributions redo reduce reduced reduces redundancy redundant reeve ref
redistributions redo reduce reduced reduces redu
ction redu
ndancy redundant reeve ref
refactor refactoring refactorings refer reference referenceable referenced
refactor refactoring refactorings refer reference referenceable referenced
references referencing referent referential referred refers refill reflect
references referencing referent referential referred refers refill reflect
reflected reflection reflective reflectively reflects reformed refresh refreshed
reflected reflection reflective reflectively reflects reformed refresh refreshed
...
@@ -553,7 +553,7 @@ revoked revolutions rewind rewrite rewriting rfc rfloor rgb rho rice richard rid
...
@@ -553,7 +553,7 @@ revoked revolutions rewind rewrite rewriting rfc rfloor rgb rho rice richard rid
ridvan rife right rightmost rights rijndael ring rioyxlgt risk risks risky rlm
ridvan rife right rightmost rights rijndael ring rioyxlgt risk risks risky rlm
rmd rmdir rmerr rmi rmiregistry rnd rnfr rnto road roadmap roads robert roc rogue
rmd rmdir rmerr rmi rmiregistry rnd rnfr rnto road roadmap roads robert roc rogue
rojas role roles roll rollback rollbacks rolled rolling rollover rolls roman room
rojas role roles roll rollback rollbacks rolled rolling rollover rolls roman room
root roots rot rotate round rounded rounding roundmagic rounds routine routinely
root root
ed root
s rot rotate round rounded rounding roundmagic rounds routine routinely
routines row rowcount rowid rowlock rownum rows rowscn rowsize roy royalty rpad rpm rsa
routines row rowcount rowid rowlock rownum rows rowscn rowsize roy royalty rpad rpm rsa
rsaquo rsquo rss rtree rtrim ruby ruebezahl rule rules run rund rundll runnable
rsaquo rsquo rss rtree rtrim ruby ruebezahl rule rules run rund rundll runnable
runner runners running runs runscript runtime rwd rws sabine safari safe safely
runner runners running runs runscript runtime rwd rws sabine safari safe safely
...
@@ -626,8 +626,8 @@ suite suites sullivan sum summand summary summer summertime sums sun sunday sup
...
@@ -626,8 +626,8 @@ suite suites sullivan sum summand summary summer summertime sums sun sunday sup
super superclass superfluous superinterfaces superior superseded supertable
super superclass superfluous superinterfaces superior superseded supertable
superuser supplemental supplied supplier supply support supported supporter
superuser supplemental supplied supplier supply support supported supporter
supporters supporting supports supposed suppress sure surname surrogate
supporters supporting supports supposed suppress sure surname surrogate
surrogates surrounded survive survives susan suse suspended su
xxess sval svg svn
surrogates surrounded survive survives susan suse suspended su
spicious suxxess
swap swapped sweden sweep swing swiss switch switched switches switching
s
val svg svn s
wap swapped sweden sweep swing swiss switch switched switches switching
switchstatements switzerland swprintf swt sxd syb sybase syear sylvain symbol
switchstatements switzerland swprintf swt sxd syb sybase syear sylvain symbol
symbolic symbols symmetric sync syncable synced synchronization synchronize
symbolic symbols symmetric sync syncable synced synchronization synchronize
synchronized synchronizers synchronizes synchronizing synchronous synchronously
synchronized synchronizers synchronizes synchronizing synchronous synchronously
...
@@ -650,7 +650,7 @@ threaded threading threads three threshold threw throttle throttled throttling
...
@@ -650,7 +650,7 @@ threaded threading threads three threshold threw throttle throttled throttling
through throughput throw throwable throwing thrown throws thumbs thun thursday
through throughput throw throwable throwing thrown throws thumbs thun thursday
thus tick ticker tid tigers tilde time timed timely timeout timer times timestamp
thus tick ticker tid tigers tilde time timed timely timeout timer times timestamp
timestampadd timestampdiff timestamps timezone timezones timing tiny tinyblob
timestampadd timestampdiff timestamps timezone timezones timing tiny tinyblob
tinyint tinytext tips tired tis title titled titles tls tme tmendrscan tmfail
tinyint tinytext tip
tip
s tired tis title titled titles tls tme tmendrscan tmfail
tmjoin tmnoflags tmonephase tmp tmpdir tmresume tmstartrscan tmsuccess tmsuspend
tmjoin tmnoflags tmonephase tmp tmpdir tmresume tmstartrscan tmsuccess tmsuspend
tmueller tmzone toc today todescato todo tofu together toggle token tokenize
tmueller tmzone toc today todescato todo tofu together toggle token tokenize
tokenizer tokens tolerant tom tomas tomcat tong too took tool toolbar toolkit
tokenizer tokens tolerant tom tomas tomcat tong too took tool toolbar toolkit
...
@@ -661,8 +661,8 @@ transactional transactionally transactions transfer transferred transferring
...
@@ -661,8 +661,8 @@ transactional transactionally transactions transfer transferred transferring
transform transformation transient transiently transition transitional
transform transformation transient transiently transition transitional
transitions translatable translate translated translates translating translation
transitions translatable translate translated translates translating translation
translations translator transmission transmitted transparent transport travel
translations translator transmission transmitted transparent transport travel
traversal travers
ing tray tread treat treated treatment trede tree trees trial
traversal travers
e traversing tray tread treat treated treatment trede tree trees
trick tricky tried tries trig trigger triggered triggers trigonometric trim
tri
al tri
ck tricky tried tries trig trigger triggered triggers trigonometric trim
trimmed trims trip trivial trouble true trunc truncate truncated truncates
trimmed trims trip trivial trouble true trunc truncate truncated truncates
truncating truncation trunk trust trusted trx try trying tsi tsmsys tsv tucc
truncating truncation trunk trust trusted trx try trying tsi tsmsys tsv tucc
tucker tuesday tune tunes tuning turkel turkish turn turned turns tutorial tweak
tucker tuesday tune tunes tuning turkel turkish turn turned turns tutorial tweak
...
@@ -686,7 +686,7 @@ unset unsigned unsorted unspecified unstable unsuccessful unsupported
...
@@ -686,7 +686,7 @@ unset unsigned unsorted unspecified unstable unsuccessful unsupported
unsynchronized untested until untranslated unusable unused unusual unvisited
unsynchronized untested until untranslated unusable unused unusual unvisited
unwrap unwrapped unwritten unzip upc upd updatable update updated updates
unwrap unwrapped unwritten unzip upc upd updatable update updated updates
updating upgrade upgraded upgrader upgrades upgrading upload uploaded upon upper
updating upgrade upgraded upgrader upgrades upgrading upload uploaded upon upper
uppercase uppercased uppermost ups upsert upside upsih upsilon urgent urgently
uppercase uppercased uppermost ups upsert ups
et ups
ide upsih upsilon urgent urgently
uri url urls usa usable usage usd use used useful user userbyid username userpwd
uri url urls usa usable usage usd use used useful user userbyid username userpwd
users uses using usr usual usually utc ute utf util utilities utility utilization
users uses using usr usual usually utc ute utf util utilities utility utilization
utilize utilizes utils uui uuid uuml vacuum vacuuming val valid validate
utilize utilizes utils uui uuid uuml vacuum vacuuming val valid validate
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论