⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbm.java

📁 jdbm NMS
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    {
        int i = hash(abyte0);
        jdbmBucket jdbmbucket = lookupBucket(i);
        jdbmBucketElement jdbmbucketelement = jdbmbucket.lookup(abyte0, i);
        if(jdbmbucketelement != null)
            return readData(jdbmbucketelement);
        else
            return null;
    }

    public byte[] lookup(String s)
        throws IOException
    {
        byte abyte0[] = new byte[s.length()];
        s.getBytes(0, abyte0.length, abyte0, 0);
        return lookup(abyte0);
    }

    public boolean delete(byte abyte0[])
        throws IOException
    {
        int i = hash(abyte0);
        jdbmBucket jdbmbucket = lookupBucket(i);
        jdbmBucketElement jdbmbucketelement = jdbmbucket.lookup(abyte0, i);
        if(jdbmbucketelement != null)
        {
            jdbmbucket.delete(jdbmbucketelement);
            return true;
        } else
        {
            return false;
        }
    }

    public boolean delete(String s)
        throws IOException
    {
        byte abyte0[] = new byte[s.length()];
        s.getBytes(0, abyte0.length, abyte0, 0);
        return delete(abyte0);
    }

    public void close()
        throws IOException
    {
        try
        {
            save();
        }
        catch(IOException ioexception)
        {
            System.out.println("jdbm: Could not save while closing: " + ioexception.getMessage());
        }
        fd.close();
    }

    public void save()
        throws IOException
    {
        if(header_changed)
        {
            trace("saving header.");
            DataOutputStream dataoutputstream = new DataOutputStream(new FastByteArrayOutputStream(buffer));
            saveHeader(dataoutputstream);
            fd.seek(0L);
            fd.write(buffer);
            header_changed = false;
        }
        if(dir_changed)
        {
            trace("saving directory.");
            byte abyte0[] = new byte[dir_size * 4];
            DataOutputStream dataoutputstream1 = new DataOutputStream(new FastByteArrayOutputStream(abyte0));
            saveDirectory(dataoutputstream1);
            fd.seek(dir_adr);
            fd.write(abyte0);
            dir_changed = false;
        }
        list.saveModified(this);
    }

    public jdbm(File file1)
        throws IOException
    {
        block_size = 1024;
        dir_bits = 3;
        cache_size = 32;
        dir_changed = false;
        header_changed = false;
        boolean flag = file1.exists();
        file = file1;
        fd = new RandomAccessFile(file1, "rw");
        buffer = new byte[block_size];
        list = new LRUList();
        if(flag)
        {
            fd.seek(0L);
            if(fd.read(buffer) != buffer.length)
            {
                fd.close();
                throw new IOException("unable to restore DB header.");
            }
            restoreHeader(new DataInputStream(new ByteArrayInputStream(buffer)));
            fd.seek(dir_adr);
            byte abyte0[] = new byte[dir_size * 4];
            fd.readFully(abyte0);
            if(fd.read(buffer) != buffer.length)
            {
                fd.close();
                throw new IOException("unable to restore DB directory.");
            } else
            {
                restoreDirectory(new DataInputStream(new ByteArrayInputStream(abyte0)));
                loaded_buckets = 0;
                return;
            }
        }
        block_size = 1024;
        dir_bits = 3;
        dir_adr = block_size;
        bucket_elems = (block_size - 60) / 24 + 1;
        for(dir_size = 1 << dir_bits; dir_size * 4 < block_size;)
        {
            dir_size <<= 1;
            dir_bits++;
        }

        if(dir_size * 4 != block_size)
            throw new RuntimeException("block_size can't match dir_size");
        cache_size = 32;
        loaded_buckets = 1;
        diridx = new int[dir_size];
        int i = 2 * block_size;
        LRUEntry lruentry = list.addEntry(new jdbmBucket(this, i, 3));
        for(int j = 0; j < dir_size; j++)
            diridx[j] = i;

        avail_length = (block_size - 36) / 8;
        avail_size = new int[avail_length];
        avail_ptr = new int[avail_length];
        avail_count = 0;
        next_block = 4;
        DataOutputStream dataoutputstream = null;
        dataoutputstream = new DataOutputStream(new FastByteArrayOutputStream(buffer));
        saveHeader(dataoutputstream);
        fd.seek(0L);
        fd.write(buffer);
        dataoutputstream = new DataOutputStream(new FastByteArrayOutputStream(buffer));
        saveDirectory(dataoutputstream);
        fd.seek(dir_adr);
        fd.write(buffer);
        dataoutputstream = new DataOutputStream(new FastByteArrayOutputStream(buffer));
        lruentry.bucket.save(dataoutputstream);
        fd.seek(2 * block_size);
        fd.write(buffer);
    }

    protected boolean getNextBucket(jdbmEnumerator jdbmenumerator)
        throws IOException
    {
        int i = -1;
        int j = -1;
        int k = -1;
        if(jdbmenumerator.didx < 0)
        {
            k = 0;
            j = -1;
            i = diridx[0];
        } else
        if(jdbmenumerator.didx + 1 < dir_size)
        {
            k = jdbmenumerator.didx;
            j = diridx[k++];
            i = diridx[k];
        } else
        {
            return false;
        }
        for(; i == j && k < dir_size; i = diridx[k++]);
        if(k < dir_size)
        {
            LRUEntry lruentry = list.lookupBucket(i);
            if(lruentry == null)
                lruentry = loadBucket(i);
            list.notifyUses(lruentry);
            jdbmenumerator.bucket = lruentry.bucket;
            jdbmenumerator.didx = k;
            jdbmenumerator.bidx = 0;
            return true;
        } else
        {
            return false;
        }
    }

    public Enumeration keys()
    {
        return new jdbmEnumerator(this, true, -1);
    }

    public Enumeration elements()
    {
        return new jdbmEnumerator(this, false, -1);
    }

    public jdbm reorganize(boolean flag)
    {
        Enumeration enumeration = keys();
        int i = 0;
        File file1 = new File(file.getParent(), file.getName() + ".tmp");
        Object obj = null;
        jdbm jdbm2 = null;
        long l = -1L;
        try
        {
            save();
            jdbm jdbm1 = new jdbm(file1);
            if(flag)
            {
                System.out.println("using temp file: " + file1);
                l = System.currentTimeMillis();
            }
            while(enumeration.hasMoreElements()) 
            {
                byte abyte0[] = (byte[])enumeration.nextElement();
                byte abyte1[] = lookup(abyte0);
                if(abyte1 != null)
                    jdbm1.store(abyte0, abyte1, 1);
                else
                if(flag)
                    System.out.println("no value for [" + new String(abyte0) + "]");
                if(flag && ++i % 100 == 0)
                    System.out.println(i + " elements reindexed.");
            }
            jdbm1.save();
            if(flag)
                System.out.println("reorganization done (" + (System.currentTimeMillis() - l) + "ms)");
        }
        catch(Exception exception1)
        {
            file1.delete();
            file1 = null;
            exception1.printStackTrace();
        }
        finally
        {
            if(file1 != null)
            {
                file.delete();
                file1.renameTo(file);
                try
                {
                    jdbm2 = new jdbm(file);
                }
                catch(IOException ioexception)
                {
                    ioexception.printStackTrace();
                }
            }
        }
        return jdbm2;
    }

    public static byte[] getBytes(String s)
    {
        byte abyte0[] = new byte[s.length()];
        s.getBytes(0, abyte0.length, abyte0, 0);
        return abyte0;
    }

    public static void main(String args[])
        throws Exception
    {
        File file1 = new File(args[0]);
        jdbm jdbm1 = new jdbm(file1);
        for(int i = 1; i < args.length; i++)
            if(args[i].equals("-clean"))
                jdbm1.reorganize(true);
            else
            if(args[i].equals("-stat"))
            {
                jdbm1.printHeader(System.out);
                jdbm1.printAvail(System.out);
            } else
            if(args[i].equals("-add"))
            {
                byte abyte0[] = getBytes(args[i + 1]);
                byte abyte2[] = getBytes(args[i + 2]);
                jdbm1.store(abyte0, abyte2, 2);
                i += 3;
            } else
            if(args[i].equals("-get"))
            {
                byte abyte1[] = getBytes(args[i + 1]);
                byte abyte3[] = jdbm1.lookup(abyte1);
                if(abyte3 == null)
                    System.out.println("not found.");
                else
                    System.out.println(new String(abyte3, 0, 0, abyte3.length));
                i += 2;
            } else
            if(args[i].equals("-nadd"))
            {
                int j = Integer.parseInt(args[i + 1]);
                String s = args[i + 2];
                while(--j >= 0) 
                {
                    String s2 = s + "-" + j;
                    String s4 = s + "-value-for-" + j;
                    System.out.println(s2 + "=" + s4);
                    jdbm1.store(getBytes(s2), getBytes(s4), 2);
                }
                i += 3;
            } else
            if(args[i].equals("-nget"))
            {
                int k = Integer.parseInt(args[i + 1]);
                String s1 = args[i + 2];
                while(--k >= 0) 
                {
                    String s3 = s1 + "-" + k;
                    byte abyte4[] = jdbm1.lookup(getBytes(s3));
                    if(abyte4 == null)
                        System.out.println("*** not found.");
                    else
                        System.out.println(s3 + "=" + new String(abyte4, 0, 0, abyte4.length));
                }
                i += 3;
            } else
            if(args[i].equals("-del"))
            {
                if(jdbm1.delete(getBytes(args[i + 1])))
                    System.out.println("deletion succesfull.");
                else
                    System.out.println("element not found.");
                i += 2;
            } else
            {
                System.out.println("[-add <key> <val>] [-get <key>]");
                System.exit(1);
            }

        jdbm1.save();
    }

    private static final int IGNORE_SIZE = 8;
    private static final boolean debug = false;
    public static final int STORE_REPLACE = 1;
    public static final int STORE_INSERT = 2;
    protected static final int BLOCK_SIZE = 1024;
    protected static final int DIR_BITS = 3;
    protected static final int CACHE_SIZE = 32;
    private static final int fsize = 36;
    int block_size;
    int dir_bits;
    int dir_size;
    int dir_adr;
    int cache_size;
    int bucket_elems;
    int next_block;
    int avail_count;
    int avail_length;
    int avail_size[];
    int avail_ptr[];
    File file;
    RandomAccessFile fd;
    int diridx[];
    private byte buffer[];
    private boolean dir_changed;
    private boolean header_changed;
    private LRUList list;
    private int loaded_buckets;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -