// Developed by Kinva Network Inc. 2000
// Source File Name: jdbm.java
package com.kinva.util.jdbm;
import java.io.*;
import java.util.Enumeration;
// Referenced classes of package com.kinva.util.jdbm:
// FastByteArrayOutputStream, LRUEntry, LRUList, jdbmBucket,
// jdbmBucketElement, jdbmEnumerator
public class jdbm
{
protected final void trace(String s)
{
}
private static final int hash(byte abyte0[])
{
int i = 0x238f13af * abyte0.length;
for(int j = 0; j < abyte0.length; j++)
i = i + (abyte0[j] << (j * 5) % 24) & 0x7fffffff;
return 0x41c64e6b * i + 12345 & 0x7fffffff;
}
private void splitBucket(int i, jdbmBucket jdbmbucket)
throws IOException
{
Object obj = null;
trace("split bucket: " + jdbmbucket.fileptr);
for(; jdbmbucket.count == bucket_elems; jdbmbucket = lookupBucket(i))
{
list.removeBucket(jdbmbucket);
loaded_buckets--;
markAvailable(jdbmbucket.fileptr, block_size);
int j = allocateSpace(block_size);
int k = allocateSpace(block_size);
jdbmBucket jdbmbucket2 = new jdbmBucket(this, j, -1);
jdbmBucket jdbmbucket3 = new jdbmBucket(this, k, -1);
list.addEntry(jdbmbucket2);
list.addEntry(jdbmbucket3);
trace("splited b0=" + j);
trace("splited b1=" + k);
loaded_buckets += 2;
int l = jdbmbucket.bits + 1;
jdbmbucket2.bits = l;
jdbmbucket3.bits = l;
if(dir_bits == jdbmbucket.bits)
{
dir_size <<= 1;
dir_adr = allocateSpace(dir_size * 4);
int ai[] = new int[dir_size];
for(int j1 = 0; j1 < dir_size / 2; j1++)
{
ai[2 * j1] = diridx[j1];
ai[2 * j1 + 1] = diridx[j1];
}
diridx = ai;
dir_bits = l;
dir_changed = true;
}
for(int i1 = 0; i1 < bucket_elems; i1++)
{
jdbmBucketElement jdbmbucketelement = jdbmbucket.elements[i1];
int l1 = jdbmbucketelement.hashval >> 31 - l & 0x1;
int j2 = jdbmbucketelement.hashval % bucket_elems;
jdbmBucket jdbmbucket1;
for(jdbmbucket1 = l1 != 0 ? jdbmbucket3 : jdbmbucket2; jdbmbucket1.elements[j2].hashval != -1; j2 = (j2 + 1) % bucket_elems);
jdbmbucket1.elements[j2] = jdbmbucketelement;
jdbmbucket1.count++;
}
jdbmbucket3.avail_count = jdbmbucket.avail_count;
jdbmbucket3.avail_size = jdbmbucket.avail_size;
jdbmbucket3.avail_ptr = jdbmbucket.avail_ptr;
int k1 = i >>> 31 - dir_bits;
int i2 = k1 >> dir_bits - l | 0x1;
int k2 = i2 + 1 << dir_bits - l;
i2 <<= dir_bits - l;
int l2 = i2 - (k2 - i2);
trace("updating dir from " + l2 + " to " + i2);
for(int i3 = l2; i3 < i2; i3++)
diridx[i3] = j;
trace("updating dir from " + i2 + " to " + k2);
for(int j3 = i2; j3 < k2; j3++)
diridx[j3] = k;
jdbmbucket2.modified = true;
jdbmbucket3.modified = true;
dir_changed = true;
saveBucket(jdbmbucket2);
saveBucket(jdbmbucket3);
}
}
private void saveHeader(DataOutputStream dataoutputstream)
throws IOException
{
dataoutputstream.writeInt(block_size);
dataoutputstream.writeInt(dir_bits);
dataoutputstream.writeInt(dir_size);
dataoutputstream.writeInt(dir_adr);
dataoutputstream.writeInt(cache_size);
dataoutputstream.writeInt(bucket_elems);
dataoutputstream.writeInt(next_block);
dataoutputstream.writeInt(avail_length);
dataoutputstream.writeInt(avail_count);
for(int i = 0; i < avail_length; i++)
{
dataoutputstream.writeInt(avail_size[i]);
dataoutputstream.writeInt(avail_ptr[i]);
}
}
private void restoreHeader(DataInputStream datainputstream)
throws IOException
{
block_size = datainputstream.readInt();
dir_bits = datainputstream.readInt();
dir_size = datainputstream.readInt();
dir_adr = datainputstream.readInt();
cache_size = datainputstream.readInt();
bucket_elems = datainputstream.readInt();
next_block = datainputstream.readInt();
avail_length = datainputstream.readInt();
avail_count = datainputstream.readInt();
avail_size = new int[avail_length];
avail_ptr = new int[avail_length];
for(int i = 0; i < avail_length; i++)
{
avail_size[i] = datainputstream.readInt();
avail_ptr[i] = datainputstream.readInt();
}
}
public void printHeader(PrintStream printstream)
{
printstream.println("Options for " + file.getAbsolutePath() + ":");
printstream.println("\tblock_size = " + block_size);
printstream.println("\tdir_bits = " + dir_bits);
printstream.println("\tdir_size = " + dir_size);
printstream.println("\tdir_adr = " + dir_adr);
printstream.println("\tcache_size = " + cache_size);
printstream.println("\tdir_size = " + (1 << dir_bits));
printstream.println("\tbucket_elems = " + bucket_elems);
printstream.println("\tnext_block = " + next_block);
printstream.println("\tavail_count = " + avail_count);
printstream.println("\tavail_length = " + avail_length);
}
public void printAvail(PrintStream printstream)
{
printstream.println("avail_count=" + avail_count + "/" + avail_size.length);
for(int i = 0; i < avail_count; i++)
printstream.println("\tsize=" + avail_size[i] + " ,ptr=" + avail_ptr[i]);
}
void saveBucket(jdbmBucket jdbmbucket)
throws IOException
{
DataOutputStream dataoutputstream = new DataOutputStream(new FastByteArrayOutputStream(buffer));
jdbmbucket.save(dataoutputstream);
fd.seek(jdbmbucket.fileptr);
fd.write(buffer);
}
private void saveDirectory(DataOutputStream dataoutputstream)
throws IOException
{
for(int i = 0; i < diridx.length; i++)
dataoutputstream.writeInt(diridx[i]);
}
private void restoreDirectory(DataInputStream datainputstream)
throws IOException
{
diridx = new int[dir_size];
for(int i = 0; i < diridx.length; i++)
diridx[i] = datainputstream.readInt();
}
void markAvailable(int i, int j)
{
if(avail_count + 1 >= avail_size.length)
return;
header_changed = true;
for(int k = 0; k < avail_count; k++)
if(avail_size[k] >= j)
{
System.arraycopy(avail_size, k, avail_size, k + 1, avail_count - k);
System.arraycopy(avail_ptr, k, avail_ptr, k + 1, avail_count - k);
avail_count++;
avail_size[k] = j;
avail_ptr[k] = i;
return;
}
avail_size[avail_count] = j;
avail_ptr[avail_count] = i;
avail_count++;
}
final void removeAvailable(int i)
{
header_changed = true;
avail_count--;
if(i == avail_count)
{
return;
} else
{
System.arraycopy(avail_size, i + 1, avail_size, i, avail_count - i);
System.arraycopy(avail_ptr, i + 1, avail_p
jdbm.rar_nms
版权申诉
128 浏览量
2022-09-24
12:15:38
上传
评论
收藏 5KB RAR 举报
JonSco
- 粉丝: 69
- 资源: 1万+
最新资源
- Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka
- Kotlin基础.pdf(39页,包含基础篇和进阶篇)
- 动态语义SLAM-目标检测+VSLAM+光流+多视角几何动态物体检测源码+octomap地图+目标数据库.zip
- 中国石油大学软件工程课程设计 网上在线销售系统
- 基于STM32F103C8T6、LCD1602、DS1338U(I2C接口)时钟采集显示系统proteus仿真设计
- python数据分析建模基础数据可视化自然语言处理入门基础.zip
- 使用YOLOv9+DeepSort实现的目标跟踪算法python源码.zip
- 鸿蒙OS ArkTS语言网络接口请求
- 基于序参量体系的大系统物质流与能量流协同度计算软件V1.0
- 基于STM32F103C8T6、LCD1602、DS1338(I2C接口)电子时钟proteus仿真设计
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈