?? recordmanager.java
字號:
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;
}
}
}
}
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 + -