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

📄 recordmanager.java

📁 用JAVA实现的miniSQL
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
							}
			        	  for(int q=0;q<cmd.attnumber;q++)
			        	      System.out.print(entry[q]+"\t");
			        	  System.out.print("\n");
			          }
				   }
			       current = current + length;
			   }
		   }
		   System.out.println("查询结果个数为: "+count); 
    }
    public boolean recordright(String key1, String key2, int atttype, int op){
    	Keyword K1=null;
    	Keyword K2=null;
    	if(atttype == 1){
    		K1 = new Keyword(Integer.parseInt(key1));
    		K2 = new Keyword(Integer.parseInt(key2));
    	}
    	else if(atttype == 2){
    		K1 = new Keyword(Float.parseFloat(key1));
    		K2 = new Keyword(Float.parseFloat(key2));
    	}
    	else{
    		K1 = new Keyword(key1);
    		K2 = new Keyword(key2);
    	}
    	switch(op){
    	    case 1:{
    	    	return K1.compareTo(K2)==0;
    	    }
    	    case 2:{
    	    	return K1.compareTo(K2)!=0;
    	    }
    	    case 3:{
    	    	return K1.compareTo(K2)<0;
    	    }
    	    case 4:{
    	    	return K1.compareTo(K2)>0;
    	    }
    	    case 5:{
    	    	return K1.compareTo(K2)<=0;
    	    }
    	    case 6:{
    	    	return K1.compareTo(K2)>=0;
    	    }
    	    default:
    	    	return false;
    	}
    }
    public void getaddressRecord(Interpreter cmd, long recordpos){
    	buffer.getBlock(new File(cmd.table), (recordpos-1024)/4096,1024);
		Block selectb = buffer.list.getFirst();
		int offset = (int)((recordpos-1024)%4096);
        selectb.seek(offset);
        if(selectb.readBoolean()){
		for(int m=0; m<cmd.attnumber ;m++){
		    if(cmd.atttype[m]==1){
			    selectb.read();
			    System.out.print(selectb.readInt());
			    System.out.print("\t");
		    }
		    else if(cmd.atttype[m]==2){
			    selectb.read();
			    System.out.print(selectb.readFloat());
			    System.out.print("\t");
		    }
		    else if(cmd.atttype[m]==3){
			    int len = selectb.read()*2;
			    byte[] name = new byte[len];
			    selectb.read(name,cmd.attlength[m]);
			    try{
			        System.out.print(new String(name, "UTF16"));
			        System.out.print("\t");
			    }catch(Exception e){
			        System.out.println("RecordManager + getAdressRecord");
			    }       
		    }      
	     }
        }
	     System.out.print("\n");
    }
    public LinkedList<Long> getAddressB(String index, String key1, String key2, int atttype, int type1, int type2){
    	Keyword K1=null;
    	Keyword K2=null;
    	if(atttype == 1){
    		K1 = new Keyword(Integer.parseInt(key1));
    		K2 = new Keyword(Integer.parseInt(key2));
    	}
    	else if(atttype == 2){
    		K1 = new Keyword(Float.parseFloat(key1));
    		K2 = new Keyword(Float.parseFloat(key2));
    	}
    	else{
    		K1 = new Keyword(key1);
    		K2 = new Keyword(key2);
    	}
    	if(type1 == 3&&type2 == 4){
    		if(K1.compareTo(K2)<=0)
    			return new LinkedList<Long>();
    		return indexmanager.getAddress(index, K1, K2);
    	}
    	else if(type1 == 4&&type2 == 3){
    		if(K1.compareTo(K2)>=0)
    			return new LinkedList<Long>();
    		return indexmanager.getAddress(index, K1, K2);
    	}
    	else if(type1 == 3&&type2 == 6){
    		if(K1.compareTo(K2)<=0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		long pos = indexmanager.getAddress(index, K2);
    		if(pos>=0)
    		   list.addFirst(new Long(pos));
    		return list;
    	}
    	else if(type1 == 6&&type2 == 3){
    		if(K1.compareTo(K2)>=0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		long pos = indexmanager.getAddress(index, K1);
    		if(pos>=0)
    		   list.addFirst(new Long(pos));
    		return list;
    	}
    	else if(type1 == 5&&type2 == 6){
    		if(K1.compareTo(K2)<0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		if(K1.compareTo(K2)==0)
    			return list;
    		long pos = indexmanager.getAddress(index, K1);
    		long pos2 = indexmanager.getAddress(index, K2);
    		if(pos2>=0)
    		   list.addFirst(new Long(pos2));
    		if(pos>=0)
    			list.add(new Long(pos));
    		return list;
    	}
    	else if(type1 == 6&&type2 == 5){
    		if(K1.compareTo(K2)>0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		if(K1.compareTo(K2)==0)
    			return list;
    		long pos = indexmanager.getAddress(index, K1);
    		long pos2 = indexmanager.getAddress(index, K2);
    		if(pos>=0)
    		   list.addFirst(new Long(pos));
    		if(pos2>=0)
    			list.add(new Long(pos2));
    		return list;
    	}
    	else if(type1 == 5&&type2 == 4){
    		if(K1.compareTo(K2)<=0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		long pos = indexmanager.getAddress(index, K1);
    		if(pos>=0)
    		   list.add(new Long(pos));
    		return list;
    	}
    	else if(type1 == 4&&type2 == 5){
    		if(K1.compareTo(K2)>=0)
    			return new LinkedList<Long>();
    		LinkedList<Long> list = indexmanager.getAddress(index, K1, K2);
    		long pos = indexmanager.getAddress(index, K2);
    		if(pos>=0)
    		   list.add(new Long(pos));
    		return list;
    	}
    	else{
    		return new LinkedList<Long>();
    	}
    }
    public LinkedList<Long> getAddress(String index, String key, int atttype, int type){
    	LinkedList<Long> list;
    	Keyword K=null;
    	if(atttype == 1)
    	    K = new Keyword(Integer.parseInt(key));
    	else if(atttype == 2)
    		K = new Keyword(Float.parseFloat(key));
    	else
    		K = new Keyword(key);
    	if(type == 3){
    		list = indexmanager.getlessAddress(index, K);
    	}
    	else if(type == 4){
    		list = indexmanager.getlargeAddress(index, K);
    	}
    	else if(type == 5){
    		list = indexmanager.getlessAddress(index, K);
    		long equ = indexmanager.getAddress(index, K);
    		if(equ >= 0)
    		   list.add(new Long(equ));
    	}
    	else if(type == 6){
    		list = indexmanager.getlargeAddress(index, K);
    		long equ = indexmanager.getAddress(index, K);
    		if(equ >=0)
    			list.addFirst(new Long(equ));
    	}
    	else{
    		list = new LinkedList<Long>();
    	}
    	return list;
    }
    public boolean insertRecord(Interpreter cmd){
    	long total=0; //总个多少记录
    	long blocknumber=0;//总共多少个块
    	int num=0;//每个块有多少记录
    	int length=0; //每条记录的长度
    	long freepos=0;
    	try{
    	    RandomAccessFile recordfile = new RandomAccessFile(new File(cmd.table),"r");
    		total = recordfile.readLong();
    		blocknumber = recordfile.readLong();
    		length = recordfile.readInt();
    		num = recordfile.readInt();
    		freepos = recordfile.readLong();
    		recordfile.close();
    	}catch (Exception e){
    		System.out.println("RecordManager + insertRecord + 1");
    	}
    	if(blocknumber*num == total){
    		byte[] newbyte = new byte[4096];
    		Block newb = new Block(cmd.table, blocknumber, 1024, newbyte);
    		newb.seek(0);
    		newb.write(1);
    		for(int i=0; i<cmd.attnumber ;i++){
    			if(cmd.attindex[i]!=null){
    				if(cmd.atttype[i]==1){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(Integer.parseInt(cmd.op2[i])),freepos)){
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 1);
    				    	}
    				    	return false;
    				    }
    			    }
    			    else if(cmd.atttype[i]==2){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(Float.parseFloat(cmd.op2[i])),freepos)){
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 2);
    				    	}
    				    	return false;
    				    }
    			    }
    			    else if(cmd.atttype[i]==3){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(cmd.op2[i]),freepos)){
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 3);
    				    	}
    				    	return false;
    				    }
    			    }
    			}
    		}
    		for(int i=0; i<cmd.attnumber ;i++){
    			if(cmd.attindex[i]!=null){
    			    if(cmd.atttype[i]==1){
    				    newb.write(4);
    				    newb.writeInt(Integer.parseInt(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==2){
    				    newb.write(4);
    				    newb.writeFloat(Float.parseFloat(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==3){
    				    newb.write(cmd.op2[i].length());
    				    newb.writeChars(cmd.op2[i],cmd.attlength[i]);
    			    }
    			}
    			else{
    				if(cmd.atttype[i]==1){
    				    newb.write(4);
    				    newb.writeInt(Integer.parseInt(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==2){
    				    newb.write(4);
    				    newb.writeFloat(Float.parseFloat(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==3){
    				    newb.write(cmd.op2[i].length());
    				    newb.writeChars(cmd.op2[i],cmd.attlength[i]);
    			    }
    			}
    		}
    		buffer.list.addFirst(newb);
    		if(num == 1)
    		    freepos = freepos + 4096;
    		else
                freepos = 4096*blocknumber+ 1024 +length;
            total++;
            blocknumber++;
            try{
    	        RandomAccessFile recordfile = new RandomAccessFile(new File(cmd.table),"rw");
    		    recordfile.writeLong(total);
    		    recordfile.writeLong(blocknumber);
    		    recordfile.seek(24);
    		    recordfile.writeLong(freepos);
    		    recordfile.close();
    	    }catch (Exception e){
    	    	System.out.println("RecordManager + insertRecord + 2");
    	    }
    	}
    	else{
    		buffer.getBlock(new File(cmd.table), blocknumber-1, 1024);
    		Block newb = buffer.list.getFirst();
    		newb.seek((int)(freepos-(blocknumber-1)*4096-1024));
    		newb.write(1);
    		for(int i=0; i<cmd.attnumber ;i++){
    			if(cmd.attindex[i]!=null){
    				if(cmd.atttype[i]==1){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(Integer.parseInt(cmd.op2[i])),freepos)){    				 
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 1);
    				    	}
    				    	return false;
    				    }
    			    }
    			    else if(cmd.atttype[i]==2){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(Float.parseFloat(cmd.op2[i])),freepos)){
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 2);
    				    	}
    				    	return false;
    				    }
    			    }
    			    else if(cmd.atttype[i]==3){
    				    if(!indexmanager.insertIndex(cmd.attindex[i],new Keyword(cmd.op2[i]),freepos)){
    				    	for(int j=0; j<i; j++){
    				    		if(cmd.attindex[j]!=null)
    				    		    indexmanager.delete(cmd.attindex[j], cmd.op2[j], 3);
    				    	}
    				    	return false;
    				    }
    			    }
    			}
    		}
    		for(int i=0; i<cmd.attnumber ;i++){
    			if(cmd.attindex[i]!=null){
    			    if(cmd.atttype[i]==1){
    				    newb.write(4);
    				    newb.writeInt(Integer.parseInt(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==2){
    				    newb.write(4);
    				    newb.writeFloat(Float.parseFloat(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==3){
    				    newb.write(cmd.op2[i].length());
    				    newb.writeChars(cmd.op2[i],cmd.attlength[i]);
    			    }
    			}
    			else{
    				if(cmd.atttype[i]==1){
    				    newb.write(4);
    				    newb.writeInt(Integer.parseInt(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==2){
    				    newb.write(4);
    				    newb.writeFloat(Float.parseFloat(cmd.op2[i]));
    			    }
    			    else if(cmd.atttype[i]==3){
    				    newb.write(cmd.op2[i].length());
    				    newb.writeChars(cmd.op2[i],cmd.attlength[i]);
    			    }
    			}
    		}
    		total++;
    		if(blocknumber*num == total)
    			freepos = blocknumber*4096 + 1024;
    		else
    			freepos = freepos + length;
    		try{
    	        RandomAccessFile recordfile = new RandomAccessFile(new File(cmd.table),"rw");
    		    recordfile.writeLong(total);
    		    recordfile.writeLong(blocknumber);
    		    recordfile.seek(24);
    		    recordfile.writeLong(freepos);
    		    recordfile.close();
    	    }catch (Exception e){
    	    	System.out.println("RecordManager + insertRecord + 3");
    	    	return false;
    	    }
    	}
    	return true;
    } 
    public int deleteRecord(Interpreter cmd){
    	long total=0; //总个多少记录
    	long blocknumber=0;//总共多少个块
    	int num=0;//每个块有多少记录
    	int length=0; //每条记录的长度
    	long freepos=0;
    	int current=0;
    	long count = 0;//查询的结果数
    	try{
    	    RandomAccessFile recordfile = new RandomAccessFile(new File(cmd.table),"r");
    		total = recordfile.readLong();
    		blocknumber = recordfile.readLong();
    		length = recordfile.readInt();

⌨️ 快捷键说明

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