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

📄 recordmanager.java

📁 用JAVA实现的miniSQL
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
import java.io.*;
import java.util.*;
public class RecordManager {
    BufferManager buffer;
    IndexManager indexmanager;
    public RecordManager(BufferManager br, IndexManager im) {
    	buffer = br;
    	indexmanager = im;
    }
    public boolean getRecord(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();
    		num = recordfile.readInt();
    		freepos = recordfile.readLong();
    		recordfile.close();
    	}catch (Exception e){
    		System.out.println("RecordManager + getRecord + 1");
    		return false;
    	}
    	if(cmd.opnumber==0){
    		for(int i=0;i<blocknumber; i++){
    			buffer.getBlock(new File(cmd.table), i,1024);
    			Block selectb = buffer.list.getFirst();
    			current = 0;
    			for(int j=0; j< num;j++){
    				
    				selectb.seek(current);
    				if(selectb.readBoolean()){
    					count++;
    					if(count==1){
    						for(int m=0; m<cmd.attnumber ;m++){
    						    System.out.print(cmd.attribute[m]);
    						    System.out.print("\t");
    						}
    						System.out.print("\n");
    					}
    					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 + getRecord + 2");
    	                          return false;
    				          }
    				          
    			          }
    			          
    		           }
    		           System.out.print("\n");
    		           
    				}
    			    current = current + length;
    			}
    		}
    		System.out.println("查询结果个数为: "+count); 
    		return true;
    	}
    	else if(cmd.opnumber ==1&&cmd.opcode[0]==1){
    		int th=-1;
    		for(int i=0; i<cmd.attnumber;i++)
    			if(cmd.opatt[0].equalsIgnoreCase(cmd.attribute[i])){
    				th = i;
    				break;
    			}
    		if(cmd.attindex[th]!=null){
    			long recordpos=-1;
    			if(cmd.atttype[th]==1)
    			    recordpos = indexmanager.getAddress(cmd.attindex[th], new Keyword(Integer.parseInt(cmd.op2[0])));
    			else if(cmd.atttype[th]==2)
    				recordpos = indexmanager.getAddress(cmd.attindex[th], new Keyword(Float.parseFloat(cmd.op2[0])));
    			else if(cmd.atttype[th]==3)
    				recordpos = indexmanager.getAddress(cmd.attindex[th], new Keyword(cmd.op2[0]));
                if(recordpos==-1){
                	System.out.println("查询结果为空");
                	return true;
                }
                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++){
    					System.out.print(cmd.attribute[m]);
    					System.out.print("\t");
    				}
    					System.out.print("\n");
    			}
    			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 + getRecord + 2");
    	                    return false;
    				    }
    				          
    			    }
    			          
    		     }
    		     System.out.print("\n");
    		}
    		else{
    			for(int i=0;i<blocknumber; i++){
        			buffer.getBlock(new File(cmd.table), i,1024);
        			Block selectb = buffer.list.getFirst();
        			current = 0;
        			for(int j=0; j< num;j++){
        				selectb.seek(current);
        				if(selectb.readBoolean()){
        					String[] entry = new String[cmd.attnumber];
        					for(int m=0; m<cmd.attnumber ;m++){
        			          if(cmd.atttype[m]==1){
        				          selectb.read();
        				          entry[m]=String.valueOf(selectb.readInt());
        			          }
        			          else if(cmd.atttype[m]==2){
        				          selectb.read();
        				          entry[m]=String.valueOf(selectb.readFloat());
        			          }
        			          else if(cmd.atttype[m]==3){
        				          int len = selectb.read()*2;
        				          byte[] name = new byte[len];
        				          selectb.read(name,cmd.attlength[m]);
        				          try{
        				          	 entry[m]=new String(name, "UTF16");
        				          }catch(Exception e){
        				        	  System.out.println("RecordManager + getRecord + 3");
        				        	  return false;
        				          }
        			          }
        					}
        			          boolean correct = false;
        			          switch(cmd.atttype[th]){
        			              case 1:{
        			            	  correct = Integer.parseInt(entry[th])== Integer.parseInt(cmd.op2[0]);
        			            	  break;
        			              }
        			              case 2:{
        			            	  correct = Float.parseFloat(entry[th])== Float.parseFloat(cmd.op2[0]);
        			            	  break;
        			              }
        			              case 3:{
        			            	  correct = entry[th].equals(cmd.op2[0]);
        			            	  break;
        			              }
        			              default:
        			            	  break;
        			          }
        			          if(correct){
        			        	  count++;
        			        	  if(count==1){
              						for(int m=0; m<cmd.attnumber ;m++){
              						    System.out.print(cmd.attribute[m]);
              						    System.out.print("\t");
              						}
              						System.out.print("\n");
              					}
        			        	  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); 
        		return true;
    		}
    	}
    	else if(cmd.opnumber==1&&cmd.opcode[0]==2){
    		int th=-1;
    		for(int i=0; i<cmd.attnumber;i++)
    			if(cmd.opatt[0].equalsIgnoreCase(cmd.attribute[i])){
    				th = i;
    				break;
    			}
    		for(int i=0;i<blocknumber; i++){
        		buffer.getBlock(new File(cmd.table), i,1024);
        		Block selectb = buffer.list.getFirst();
        		current = 0;
        		for(int j=0; j< num;j++){
        			selectb.seek(current);
        			if(selectb.readBoolean()){
        				String[] entry = new String[cmd.attnumber];
        				for(int m=0; m<cmd.attnumber ;m++){
        			        if(cmd.atttype[m]==1){
        				        selectb.read();
        				         entry[m]=String.valueOf(selectb.readInt());
        			        }
        			        else if(cmd.atttype[m]==2){
        				        selectb.read();
        				        entry[m]=String.valueOf(selectb.readFloat());
        			          }
        			        else if(cmd.atttype[m]==3){
        				        int len = selectb.read()*2;
        				        byte[] name = new byte[len];
        				        selectb.read(name,cmd.attlength[m]);
        				        try{
        				            entry[m]=new String(name, "UTF16");
        				        }catch(Exception e){
        				            System.out.println("RecordManager + getRecord + 3");
        				            return false;
        				        }
        			         }
        				}
        			         boolean correct = false;
        			         switch(cmd.atttype[th]){
        			          case 1:{
        			              correct = Integer.parseInt(entry[th])!= Integer.parseInt(cmd.op2[0]);
        			              break;
        			          }
        			          case 2:{
        			              correct = Float.parseFloat(entry[th])!= Float.parseFloat(cmd.op2[0]);
        			              break;
        			          }
        			          case 3:{
        			              correct = !entry[th].equals(cmd.op2[0]);
        			              break;
        			          }
        			          default:
        			              break;
        			          }
        			         if(correct){
        			            count++;
        	        			if(count==1){
        	        				for(int q=0; q<cmd.attnumber ;q++){
        	        					System.out.print(cmd.attribute[q]);
        	        					System.out.print("\t");
        	        				}
        	        				System.out.print("\n");
        	        			}
        			            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); 
        		return true;
    	}
    	
    	else if(cmd.opnumber == 1){
    		int th=-1;
    		for(int i=0; i<cmd.attnumber;i++)
    			if(cmd.opatt[0].equalsIgnoreCase(cmd.attribute[i])){
    				th = i;
    				break;
    			}
    	    if(cmd.attindex[th]!=null){
    	    	LinkedList<Long> list = getAddress(cmd.attindex[th], cmd.op2[0],cmd.atttype[th], cmd.opcode[0]);
    	    	if(list.size()>0){
    	    		for(int m=0; m<cmd.attnumber ;m++){
    					System.out.print(cmd.attribute[m]);
    					System.out.print("\t");
    				}
    					System.out.print("\n");
    	    	}
    	    	for(int j= 0 ; j< list.size();j++)
    	    	     getaddressRecord(cmd, list.get(j).longValue());
    	    	System.out.println("查询结果个数为: "+list.size()); 
    	    	return true;
    	    }
    	    else{
    	    	getLine(cmd);
    	    }
    	}
    	else if(cmd.opnumber == 2&&cmd.opatt[0].equals(cmd.opatt[1])){
    		int th=-1;
    		for(int i=0; i<cmd.attnumber;i++)
    			if(cmd.opatt[0].equalsIgnoreCase(cmd.attribute[i])){
    				th = i;
    				break;
    			}
    		if(cmd.attindex[th]!=null){
    			if((cmd.opcode[0]==3&&cmd.opcode[1]==4)||(cmd.opcode[0]==4&&cmd.opcode[1]==3)||(cmd.opcode[0]==3&&cmd.opcode[1]==6)||(cmd.opcode[0]==6&&cmd.opcode[1]==3)||(cmd.opcode[0]==5&&cmd.opcode[1]==4)||(cmd.opcode[0]==4&&cmd.opcode[1]==5)||(cmd.opcode[0]==6&&cmd.opcode[1]==5)||(cmd.opcode[0]==5&&cmd.opcode[1]==6)){
    				LinkedList<Long> list = getAddressB(cmd.attindex[th], cmd.op2[0], cmd.op2[1], cmd.atttype[th], cmd.opcode[0], cmd.opcode[1]);
    				if(list.size()>0){
    					for(int q=0;q<cmd.attnumber;q++)
			        	     System.out.print(cmd.attribute[q]+"\t");
			        	System.out.print("\n");
    				}
    				for(int j=0;j<list.size();j++){
    					getaddressRecord(cmd, list.get(j).longValue());
    				}
    				System.out.println("查询结果个数为: "+list.size()); 
        	    	return true;
    			}
    			else{
    				getLine(cmd);
    			}
    		}
    		else{
    			getLine(cmd);
    		}
    	}
    	else{
    		getLine(cmd);
    	}
    	return true;
    }
    public void getLine(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();
    		num = recordfile.readInt();
    		freepos = recordfile.readLong();
    		recordfile.close();
    	}catch (Exception e){
    		System.out.println("RecordManager + getLine + 1");
    	}
		for(int i=0;i<blocknumber; i++){
			buffer.getBlock(new File(cmd.table), i,1024);
			Block selectb = buffer.list.getFirst();
			current = 0;
			for(int j=0; j< num;j++){
				selectb.seek(current);
				if(selectb.readBoolean()){
					String[] entry = new String[cmd.attnumber];
					for(int m=0; m<cmd.attnumber ;m++){
			          if(cmd.atttype[m]==1){
				          selectb.read();
				          entry[m]=String.valueOf(selectb.readInt());
			          }
			          else if(cmd.atttype[m]==2){
				          selectb.read();
				          entry[m]=String.valueOf(selectb.readFloat());
			          }
			          else if(cmd.atttype[m]==3){
				          int len = selectb.read()*2;
				          byte[] name = new byte[len];
				          selectb.read(name,cmd.attlength[m]);
				          try{
				          	 entry[m]=new String(name, "UTF16");
				          }catch(Exception e){
				        	  System.out.println("RecordManager + getLine + 3");
				          }
			          }
					}
			          boolean correct = true;
			          for(int ii=0; ii<cmd.opnumber; ii++){
			        	  int th=-1;
			      		  for(int q=0; q<cmd.attnumber;q++)
			      			if(cmd.opatt[ii].equalsIgnoreCase(cmd.attribute[q])){
			      				th = q;
			      				break;
			      			}
			      		  correct = correct&&recordright(entry[th], cmd.op2[ii], cmd.atttype[th], cmd.opcode[ii]);
			          }
			          if(correct){
			        	  count++;
			        	  if(count==1){
								for(int m=0; m<cmd.attnumber ;m++){
								    System.out.print(cmd.attribute[m]);
								    System.out.print("\t");
								}
								System.out.print("\n");

⌨️ 快捷键说明

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