Commit 30d0f9a7 authored by Ivan Donchevskiy's avatar Ivan Donchevskiy

/src/Various Add writefile functions to CycleStorage and TableBlockStorage

parent 7d6e4068
......@@ -87,7 +87,9 @@ class TableBlockStorage
TableBlockStorage();
TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek);
~TableBlockStorage();
private: bool CopyToNextBlock();
private:
void filewrite(TableBlockStorageElem* tbl,int seek, bool needflush=true);
bool CopyToNextBlock();
public:
bool Open(const char* name, int inf_sz, int key_sz, int sz, int block_num, int block_lim, int seek);
bool Create(const char* name, int inf_sz, int key_sz, int sz, int block_num, int block_lim, int seek);
......@@ -101,6 +103,7 @@ class CycleStorage
FILE *file;
int seekpos, inf_size;
int head,tail;
void filewrite(CycleStorageElem* jrn,int seek, bool needflush=true);
public:
int size, iter;
CycleStorage();
......
......@@ -50,6 +50,13 @@ CycleStorage::~CycleStorage()
fclose(file);
}
void CycleStorage::filewrite(CycleStorageElem* jrn,int seek,bool needflush)
{
fseek(file,seekpos+seek*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if(needflush) fflush(file);
}
bool CycleStorage::Open(const char* name, int inf_sz, int sz, int seek)
{
if(file!=NULL) fclose(file);
......@@ -173,15 +180,21 @@ bool CycleStorage::Create(const char* name, int inf_sz, int sz, int seek)
fseek(file,seekpos,0);
fwrite(csa,sizeof(CycleStorageAttr),1,file);
fflush(file);
seekpos+=sizeof(CycleStorageAttr);
for(int i=0;i<size;i++) fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
for(int i=0;i<size;i++)
{
filewrite(jrn,i,false);
}
fflush(file);
int emp = sz-size*(sizeof(CycleStorageElem)+inf_size)-sizeof(CycleStorageAttr);
if(emp>0)
{
char* empty= new char[emp];
fwrite(empty,emp,1,file);
fflush(file);
}
head=tail=-1;
......@@ -190,27 +203,25 @@ bool CycleStorage::Create(const char* name, int inf_sz, int sz, int seek)
bool CycleStorage::AddRow(char* str)
{
if(file==NULL) return false;
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,k;
if(file==NULL) return false;
if(head==-1)
{
fseek(file,seekpos,0);
jrn->status=1;
for(k=0;k<inf_size;k++)
*((char*)(jrn)+sizeof(CycleStorageElem)+k)=*(str+k);
jrn->status=1;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,0);
head=0;
tail=0;
return true;
}
if(head==tail)
{
fseek(file,seekpos+(sizeof(CycleStorageElem)+inf_size),0);
jrn->status=2;
for(k=0;k<inf_size;k++)
*((char*)(jrn)+sizeof(CycleStorageElem)+k)=*(str+k);
jrn->status=2;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,1);
tail=1;
return true;
}
......@@ -230,29 +241,25 @@ bool CycleStorage::AddRow(char* str)
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if(jrn->status==0)
{
fseek(file,seekpos+tail*(sizeof(CycleStorageElem)+inf_size),0);
jrn->status=2;
for(k=0;k<inf_size;k++)
*((char*)(jrn)+sizeof(CycleStorageElem)+k)=*(str+k);
jrn->status=2;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,tail);
return true;
}
else
{
head++;
if(head>=size) head=0;
fseek(file,seekpos+tail*(sizeof(CycleStorageElem)+inf_size),0);
jrn->status=i;
for(k=0;k<inf_size;k++)
*((char*)(jrn)+sizeof(CycleStorageElem)+k)=*(str+k);
jrn->status=i;
if(tail==0) fseek(file,seekpos,0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,tail);
fseek(file,seekpos+head*(sizeof(CycleStorageElem)+inf_size),0);
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if((jrn->status==3)||(jrn->status==5)) jrn->status=6;
else jrn->status=1;
fseek(file,seekpos+head*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,head);
return true;
}
}
......@@ -268,47 +275,34 @@ bool CycleStorage::DelRow(int row)
if(jrn->status==1)
{
jrn->status=6;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,i);
return true;
}
if(jrn->status==2) j=3;
else if(jrn->status==4) j=5;
else return false;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
jrn->status=j;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,i);
return true;
}
bool CycleStorage::DelAllRows()
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i;
if(file==NULL) return false;
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,j;
fseek(file,seekpos,0);
if((tail>head)&&(tail!=size-1))
{
i=1;
while(i!=0)
{
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
jrn->status=0;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
i=jrn->status;
}
}
for(i=0;i<size;i++)
{
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if(jrn->status!=0)
{
jrn->status=0;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
filewrite(jrn,i,false);
}
}
fflush(file);
head=tail=-1;
return true;
}
......
......@@ -70,9 +70,16 @@ TableBlockStorage::~TableBlockStorage()
fclose(file);
}
void TableBlockStorage::filewrite(TableBlockStorageElem* tbl,int seek, bool needflush)
{
fseek(file,seekpos+seek*(sizeof(TableBlockStorageElem)+k_size+inf_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+k_size+inf_size),1,file);
if(needflush) fflush(file);
}
bool TableBlockStorage::CopyToNextBlock(void)
{
int i,j,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;;
int i,j,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(full_size);
if(max==lim-1)
......@@ -86,14 +93,12 @@ bool TableBlockStorage::CopyToNextBlock(void)
if(mem[i]->count>=0)
{
mem[i]->count=++max;
fseek(file,seekpos+((cur_block+1)*block_size+j)*(full_size),0);
fwrite(mem[i],(full_size),1,file);
filewrite(mem[i],(cur_block+1)*block_size+j,false);
j++;
}
}
tbl->count=-5;
fseek(file,seekpos+cur_block*block_size*(full_size),0);
fwrite(tbl,(full_size),1,file);
filewrite(tbl,cur_block*block_size);
cur_block++;
}
}
......@@ -199,6 +204,7 @@ bool TableBlockStorage::Create(const char* name, int key_sz, int inf_sz, int sz,
cur_block=0;
fseek(file,seekpos,0);
fwrite(sa,sizeof(StorageAttr),1,file);
fflush(file);
seekpos+=sizeof(StorageAttr);
for(i=0;i<size;i++)
......@@ -206,14 +212,16 @@ bool TableBlockStorage::Create(const char* name, int key_sz, int inf_sz, int sz,
if(i%block_size==0)
t->count=-5;
else t->count=-1;
fwrite(t,(full_size),1,file);
filewrite(t,i,false);
}
fflush(file);
int emp = sz-size*full_size-sizeof(StorageAttr);
if(emp>0)
{
char* empty=new char[emp];
fwrite(empty,emp,1,file);
fflush(file);
}
mem[0]->count=-5;
for(i=1;i<block_size;i++)
......@@ -240,8 +248,7 @@ bool TableBlockStorage::AddRow(char* key, char* value)
mem[pos]->count=++max;
for(k=0;k<inf_size;k++)
*((char*)mem[pos]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fseek(file,seekpos+(cur_block*block_size+pos)*(full_size),0);
fwrite(mem[pos],(full_size),1,file);
filewrite(mem[pos],cur_block*block_size+pos);
return true;;
}
mem[empty]->count=++max;
......@@ -249,8 +256,7 @@ bool TableBlockStorage::AddRow(char* key, char* value)
*((char*)mem[empty]+sizeof(TableBlockStorageElem)+k)=*(key+k);
for(k=0;k<inf_size;k++)
*((char*)mem[empty]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fseek(file,seekpos+(cur_block*block_size+empty)*(full_size),0);
fwrite(mem[empty],(full_size),1,file);
filewrite(mem[empty],cur_block*block_size+empty);
return true;
}
......@@ -266,10 +272,9 @@ bool TableBlockStorage::DelRow(char* key)
if((*((char*)mem[i]+sizeof(TableBlockStorageElem))!=0)&&(mem[i]>=0))
if(KeyCompare((char*)mem[i],key,k_size))
{
fseek(file,seekpos+(cur_block*block_size+i)*(full_size),0);
mem[i]->count=++max;
*((char*)mem[i]+sizeof(TableBlockStorageElem))=0;
fwrite(mem[i],(full_size),1,file);
filewrite(mem[i],cur_block*block_size+i);
return true;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment