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