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

📄 recordmanager.java

📁 用JAVA实现的miniSQL
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
    		num = recordfile.readInt();
    		freepos = recordfile.readLong();
    		recordfile.close();
    	}catch (Exception e){
    		System.out.println("RecordManager + deleteRecord + 1");
    		return 0;
    	}
    	if(cmd.opnumber==0){
    		File newfile = new File("new$"+cmd.table);
    		try{
        		newfile.createNewFile();
        		RandomAccessFile rantable = new RandomAccessFile(newfile, "rw");
        		rantable.writeLong(0); //总的记录个数
        		rantable.writeLong(0); //块的个数
        		rantable.writeInt(length);//每个记录的长度
        		rantable.writeInt(num);//每个块多少个记录
        		rantable.writeLong(1024);//第一个空位置地址
        		rantable.close();
        	}catch(Exception e){
        		System.out.println("RecordManager + deleteRecord + 2");
        		return 0;
        	}
        	File table = new File(cmd.table);
        	table.delete();
        	newfile.renameTo(table);
        	for(int i=0;i<cmd.attnumber; i++){
        		if(cmd.attindex[i]!=null){
        			File oldindex = new File(cmd.attindex[i]);
        			int indextype = 0;
        			int indexlen = 0;
        			File newindex = new File("new$"+cmd.attindex[i]);
        			try{
        			    RandomAccessFile raf = new RandomAccessFile(oldindex, "rws");
        			    raf.readLong();
        			    indextype = raf.read();
        			    indexlen = raf.read();
        			    raf.close();
                        oldindex.delete();
                        newindex.createNewFile();
                        RandomAccessFile nraf = new RandomAccessFile(newindex,"rws");
                        nraf.writeLong(0);
                		nraf.write(indextype);
                		nraf.write(indexlen);
                		nraf.writeLong(0);
                		nraf.writeInt(0);
                		nraf.writeLong(0);
                		nraf.writeLong(1024);
                		nraf.close();
                		newindex.renameTo(oldindex);
        			}catch(Exception e){
        				System.out.println("RecordManager + deleteRecord + 3");
        				return 0;
        			}
        		}
        	}
        	return -2;
    	}
    	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){
                	return 0;
                }
                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()){
    				selectb.seek(offset);
    				selectb.write(0);
    				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 0;
    				        }
    			        }
    				}
    				for(int j=0;j<cmd.attnumber;j++){
    					if(cmd.attindex[j]!=null)
    						if(!indexmanager.delete(cmd.attindex[j],entry[j],cmd.atttype[j]))
    							return 0;
    				}
    				return 1;
    			}
    		    return 0;
    		}
    		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 + deleteRecord + 4");
        				        	  return 0;
        				          }
        			          }
        					}
        			          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++;
                                  selectb.seek(current);
                                  selectb.write(0);
                                  for(int jj=0;jj<cmd.attnumber;jj++){
                  					if(cmd.attindex[jj]!=null)
                  						indexmanager.delete(cmd.attindex[jj],entry[jj],cmd.atttype[jj]);
                  				 }
              				  }
        			       }
        				current = current + length;
        		       }
    			  }
        		  return (int)count;
    		  }
    	}
    	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 + deleteRecord + 5");
        				            return 0;
        				        }
        			         }
        				}
        			         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++;
        	        			selectb.seek(current);
        	        			selectb.write(0);
        	        			for(int jj=0;jj<cmd.attnumber;jj++){
                  					if(cmd.attindex[jj]!=null)
                  						indexmanager.delete(cmd.attindex[jj],entry[jj],cmd.atttype[jj]);
                  				 }
        			         }
        		           }
        			    current = current + length;
        				}
        			}
        		return (int)count;
    	}
    	
    	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]);
    	    	for(int j= 0 ; j< list.size();j++)
    	    	     deleteaddressRecord(cmd, list.get(j).longValue());
    	    	return list.size();
    	    }
    	    else{
    	    	return deleteLine(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]);
    				for(int j=0;j<list.size();j++){
    					deleteaddressRecord(cmd, list.get(j).longValue());
    				}
        	    	return list.size();
    			}
    			else{
    				return deleteLine(cmd);
    			}
    		}
    		else{
    			return deleteLine(cmd);
    		}
    	}
    	else{
    		return deleteLine(cmd);
    	}
    }
    public int deleteLine(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");
    		return 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()){
					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++;
			        	  selectb.seek(current);
			        	  selectb.write(0);
			        	  for(int jj=0;jj<cmd.attnumber;jj++){
			      		    if(cmd.attindex[jj]!=null)
			      				indexmanager.delete(cmd.attindex[jj],entry[jj],cmd.atttype[jj]);
			      		  }
			          }
				   }
			       current = current + length;
			   }
		   }
		   return (int)count;
    }
    public void deleteaddressRecord(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);
		String[] entry = new String[cmd.attnumber];
        selectb.seek(offset);
        selectb.write(0);
		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 + deleteaddressRecord + 4");
	          }
          }
		}
		for(int jj=0;jj<cmd.attnumber;jj++){
		    if(cmd.attindex[jj]!=null)
				indexmanager.delete(cmd.attindex[jj],entry[jj],cmd.atttype[jj]);
		}
    }
    public boolean quit(){
    	buffer.quit();
    	return true;
    }	 
    public void deleteBlock(String table){
    	buffer.deleteBlock(table);
    }
}

⌨️ 快捷键说明

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