?? recordmanager.java
字號(hào):
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); //總的記錄個(gè)數(shù)
rantable.writeLong(0); //塊的個(gè)數(shù)
rantable.writeInt(length);//每個(gè)記錄的長(zhǎng)度
rantable.writeInt(num);//每個(gè)塊多少個(gè)記錄
rantable.writeLong(1024);//第一個(gè)空位置地址
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; //總個(gè)多少記錄
long blocknumber=0;//總共多少個(gè)塊
int num=0;//每個(gè)塊有多少記錄
int length=0; //每條記錄的長(zhǎng)度
long freepos=0;
int current=0;
long count = 0;//查詢(xún)的結(jié)果數(shù)
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);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -