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

📄 table.java

📁 用JAVA实现了,将DB装入内存,内存由DBMS控制,实现简单数据库的创建、数据表的创建、记录插入、查询以及表的删除。
💻 JAVA
字号:
package org.kdb.struct;

import java.util.List;
import java.util.ArrayList;
import java.io.RandomAccessFile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.

 * Date: 2007-11-17
 * Time: 14:28:24
 */
public class Table extends BaseTableInfo {
    public Database getDatabase() {
        return database;
    }

    public void setDatabase(Database database) {
        this.database = database;
        if (file == null) {
            file = new File(new File(new File(new File(Constant.DEFALUT_DATABASE_FOLDER, this.database.getDatabaseName()), Constant.DEFAULT_USER_TABLE_FOLDER), this.getTableName()), Constant.DEFAULT_TABLE);
            try {
                tableAccess = new RandomAccessFile(file, "rw");
                if (tableAccess.length() == 0) {
                    tableAccess.writeInt(0);
                    tableAccess.writeInt(this.getTotalFieldCount());
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private List<BaseField> baseFields = new ArrayList<BaseField>(20);
    private int totalFieldCount = 0;//用于表示存储一个列对象一共需要多大长度
    private Database database = null;
    private File file = null;
    private RandomAccessFile tableAccess = null;

    public Table() {

    }

    public void addRecord(Object[] obj) {
        try {
            tableAccess.seek(0);
            int count = tableAccess.readInt();
            int totalCount = tableAccess.readInt();
            int pos = Constant.DEFAULT_TABLE_HEADER_SIZE + count * totalCount;
            tableAccess.seek(pos);
            int size = 0;
            for (BaseField field : baseFields) {
                switch (field.getType().getIndex()) {
                    case 0:
                        tableAccess.writeInt(((Integer) obj[size++]).intValue());
                        continue;
                    case 1:
                        byte[] b1 = new byte[field.getFieldLength()];
                        byte[] b = ((String) obj[size++]).getBytes();
                        System.arraycopy(b,0,b1,0,b.length);
                        tableAccess.write(b1);
//                        System.out.println(0);
//                        System.out.println(tableAccess.getFilePointer());
//                        tableAccess.skipBytes(field.getFieldLength() - b.length);
//                        System.out.println(tableAccess.getFilePointer());
                        
                        continue;
                    default:
                        tableAccess.writeLong(((Long) obj[size++]).longValue());
                }

            }
            tableAccess.seek(0);
            tableAccess.writeInt(count+1);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public List<Object[]> getRecords(){
        List<Object[]> records = new ArrayList<Object[]>(20);
        try {
            tableAccess.seek(0);
            int count = tableAccess.readInt();
            int pos = Constant.DEFAULT_TABLE_HEADER_SIZE;
            tableAccess.seek(pos);
            for(int i =0;i<count;i++){
                Object[] obj = new Object[baseFields.size()];
                int baseCount =0;
            for (BaseField field : baseFields) {
                switch (field.getType().getIndex()) {
                    case 0:
                        int value =tableAccess.readInt();
                         obj[baseCount++] = value;
                        continue;
                    case 1:
                        byte[] b = new byte[field.getFieldLength()];
                        tableAccess.read(b);
                        obj[baseCount++] = new String(b);
                        continue;
                    default:
                        long v2 =tableAccess.readLong();
                        obj[baseCount++] = v2;
                }

            }
                records.add(obj);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return records;
    }


    public int getTotalFieldCount() {
        return totalFieldCount;
    }

    public void setTotalFieldCount(int totalFieldCount) {
        this.totalFieldCount = totalFieldCount;
    }

    public List<BaseField> getBaseFields() {
        return baseFields;
    }

    public void setBaseFields(List<BaseField> baseFields) {
        this.baseFields = baseFields;
    }

    public int addFiled(BaseField field) {
        baseFields.add(field);
        return baseFields.size();
    }
}

⌨️ 快捷键说明

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