Commit 7d6e4068 authored by Ivan Donchevskiy's avatar Ivan Donchevskiy

Added heading to the part of file with CycleStorage, also tested CycleStorage…

Added heading to the part of file with CycleStorage, also tested CycleStorage and TableBlockStorage working together.
parent da402413
......@@ -31,22 +31,6 @@
#include "Storages.h"
#include "UniXML.h"
char* itoa(int val, int base)
{
static char buf[32] = {0};
int i = 30;
for(; val && i ; --i, val /= base)
buf[i] = "0123456789abcdef"[val % base];
return &buf[i+1];
}
void testTable1(void)
{
char *chr=(char*)malloc(20);
......@@ -58,10 +42,9 @@ void testTable1(void)
for(i=0;i<t->size;i++)
{
chr[0]=i;
val=itoa(i,10);
sprintf(val,"%d",i);
t->AddRow(chr,val);
}
//printf("elements with values=keys added\nvalues from keys 25-59\n");
printf("elements with values=keys added:\n");
for(i=0;i<40;i++)
{
......@@ -74,15 +57,13 @@ void testTable1(void)
chr[0]=i;
t->DelRow(chr);
}
//printf("elements with keys from 40 to 60 deleted\n");
printf("elements with keys from 9 to 14 deleted\n");
for(i=9;i<15;i++)
{
chr[0]=i;
val=itoa(i+40,10);
sprintf(val,"%d",i+40);
t->AddRow(chr,val);
}
//printf("elements with keys from 30 to 50 with values=key+40 added\nvalues from keys 25-59\n");
printf("elements with keys from 9 to 14 with values=key+40 added, all elements:\n");
for(i=0;i<40;i++)
{
......@@ -94,64 +75,71 @@ void testTable1(void)
void testTable2(void)
{
char *chr=(char*)malloc(20);
char *val=(char*)malloc(40);
TableBlockStorage *t;
t = new TableBlockStorage("blocktableint.test", 4, 40, 20000, 5,28,0);
t = new TableBlockStorage("big_file.test", 4, 40, 20000, 5,28,0);
int i;
printf("testTable\nsize = %d\n",t->block_size);
for(i=1;i<20;i++)
{
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
for(i=1;i<11;i++)
{
chr[0]=i;
val=itoa(i,10);
sprintf(val,"%d",i);
t->AddRow((char*)&i,val);
}
printf("current block = %d, elements with values=keys added:\n",t->cur_block);
for(i=1;i<11;i++)
for(i=1;i<20;i++)
{
chr[0]=i;
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
for(i=1;i<8;i++)
{
chr[0]=i;
val=itoa(i+10,10);
sprintf(val,"%d",i+10);
t->AddRow((char*)&i,val);
}
for(i=8;i<11;i++)
{
chr[0]=i;
t->DelRow((char*)&i);
}
for(i=1;i<11;i++)
for(i=1;i<20;i++)
{
chr[0]=i;
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
for(i=3;i<11;i++)
{
chr[0]=i;
val=itoa(i+40,10);
sprintf(val,"%d",i+40);
t->AddRow((char*)&i,val);
}
for(i=1;i<11;i++)
for(i=1;i<20;i++)
{
chr[0]=i;
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
chr[0]=10;
strcpy(val,"new block");
i=9;
t->AddRow((char*)&i,val);
for(i=1;i<40;i++)
for(i=1;i<20;i++)
{
chr[0]=i;
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
t->Open("big_file.test", 4, 40, 20000, 5,28,0);
i=11;
sprintf(val,"%d",i);
//t->AddRow((char*)&i,val);
for(i=1;i<20;i++)
{
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n",t->cur_block);
}
void testJournal1(void)
......@@ -160,15 +148,25 @@ void testJournal1(void)
int i;
char *str = (char*)malloc(30);
printf("journal test 1\n");
j = new CycleStorage("journal.test",30,1000000,0);
j = new CycleStorage("big_file.test",30,1000000,20000);
printf("size = %d\n",j->size);
for(i=1;i<40000;i++)
{
str = itoa(i,10);
sprintf(str,"%d",i);
j->AddRow(str);
}
printf("\n20 elements from 10-th:\n");
j->ViewRows(10,20);
printf("test of 2 classes working in 1 file together\n");
TableBlockStorage *t = new TableBlockStorage("big_file.test", 4, 40, 20000, 5,28,0);
char *val = (char*)malloc(40);
for(i=1;i<20;i++)
{
if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
}
printf("\ncurrent block = %d\n\n",t->cur_block);
printf("\n20 elements from 10-th after deleting first 20:\n");
for(i=0;i<20;i++)
{
......@@ -178,12 +176,13 @@ void testJournal1(void)
printf("\nfirst 20 after adding 10 elements\n");
for(i=1;i<11;i++)
{
str = itoa(i,10);
sprintf(str,"%d",i);
j->AddRow(str);
}
j->ViewRows(0,20);
printf("\nthe same after reopen:\n");
j = new CycleStorage("journal.test",30,2000000,0);
j = new CycleStorage();
j->Open("big_file.test",30,1000000,20000);
j->ViewRows(0,20);
printf("\n");
j->ExportToXML("Xml.xml");
......@@ -194,18 +193,19 @@ void testJournal2(void)
CycleStorage *j;
int i,k;
char *str = (char*)malloc(30);
j = new CycleStorage("journal.test",30,1000000,0);
j = new CycleStorage("big_file.test",30,1000000,20000);
printf("journal test 2 - checking number of iterations to find head/tail\n");
printf("size = %d\n\n",j->size);
printf("iterations = %d\n",j->iter);
//j->ViewRows(10,20);
for(i=0;i<20;i++)
{
for(k=1000;k<3000;k++)
{
str = itoa(k,10);
sprintf(str,"%d",k);
j->AddRow(str);
}
j = new CycleStorage("journal.test",30,2000000,0);
j->Open("big_file.test",30,1000000,20000);
printf("iterations = %d\n",j->iter);
}
printf("\n");
......@@ -214,69 +214,6 @@ void testJournal2(void)
int main(int args, char **argv)
{
/*if(args<2)
{
printf("Correct usage: jrntest [command] [param]\n");
printf(" commands:\n add - add row with text = param\n delete - delete row with number = param\n view - view param2 from row = param1 \n toxml - export journal to XML file with name = param\n del_all - delete all journal\n q or quit - exit\n\n");
return 0;
}
CycleStorage *j = new CycleStorage(argv[1],99,1000,0);
printf("commands:\nadd\ndelete\nview\ntoxml\ndel_all\nenter q or quit to exit\n\n");
char* com=new char[8];
char* str=new char[99];
int num,count;
strcpy(com,"qwerty");
while(strcmp(com,"q")&&strcmp(com,"quit"))
{
scanf("%s",com);
if(!strcmp(com,"add"))
{
printf("string to add: ");
if(scanf("%99s",str)>0)
{
j->AddRow(str);
printf("\n");
}
}
else if(!strcmp(com,"delete"))
{
printf("number of string to delete: ");
if(scanf("%d",&num)>0)
{
j->DelRow(num);
printf("\n");
}
}
else if(!strcmp(com,"view"))
{
printf("start number and count (0 0 for all): ");
if(scanf("%d%d",&num,&count)>1)
{
j->ViewRows(num,count);
printf("\n");
}
}
else if(!strcmp(com,"del_all"))
{
printf("are you sure? (y/n) ");
if(scanf("%s",str)>0)
if(!strcmp(str,"y"))
{
j->DelAllRows();
printf("\n");
}
}
else if(!strcmp(com,"toxml"))
{
printf("enter file name: ");
if(scanf("%25s",str)>0)
{
j->ExportToXML(str);
printf("\n");
}
}
else printf("commands:\nadd\ndelete\nview\ntoxml\ndel_all\nenter q or quit to exit\n\n");
}*/
testTable1();
testTable2();
......
......@@ -30,6 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "UniXML.h"
#define key_size 20
......@@ -38,7 +39,12 @@ struct StorageAttr
{
int k_size, inf_size,size,block_number;
int lim, seekpos;
};
} __attribute__((__packed__));
struct CycleStorageAttr
{
int size, inf_size, seekpos;
} __attribute__((__packed__));
struct TableStorageElem
{
......@@ -84,6 +90,7 @@ class TableBlockStorage
private: 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);
bool AddRow(char* key, char* val);
bool DelRow(char* key);
char* FindKeyValue(char* key, char* val);
......@@ -96,13 +103,16 @@ class CycleStorage
int head,tail;
public:
int size, iter;
CycleStorage();
CycleStorage(const char* name, int inf_sz, int sz, int seek);
~CycleStorage();
int AddRow(char* str);
int DelRow(int row);
int DelAllRows(void);
int ViewRows(int beg, int num);
int ExportToXML(const char* name);
bool Open(const char* name, int inf_sz, int sz, int seek);
bool Create(const char* name, int inf_sz, int sz, int seek);
bool AddRow(char* str);
bool DelRow(int row);
bool DelAllRows(void);
bool ViewRows(int beg, int num);
bool ExportToXML(const char* name);
};
#endif
......@@ -30,29 +30,47 @@
#include "Storages.h"
CycleStorage::CycleStorage()
{
file=NULL;
size=0;
inf_size=0;
seekpos=0;
head=tail=-1;
}
CycleStorage::CycleStorage(const char* name, int inf_sz, int sz, int seek)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_sz);
if(!Open(name,inf_sz, sz, seek))
Create(name,inf_sz, sz, seek);
}
CycleStorage::~CycleStorage()
{
fclose(file);
}
bool CycleStorage::Open(const char* name, int inf_sz, int sz, int seek)
{
if(file!=NULL) fclose(file);
file = fopen(name, "r+");
size=sz/(sizeof(CycleStorageElem)+inf_sz);
int l=-1,r=size,mid;
iter=0;
if(file==NULL) return false;
seekpos=seek;
CycleStorageAttr *csa = new CycleStorageAttr();
if(fseek(file,seekpos,0)==0) fread(csa,sizeof(CycleStorageAttr),1,file);
else return false;
if((csa->size!=((sz-sizeof(CycleStorageAttr))/(sizeof(CycleStorageElem)+inf_sz)))||(csa->inf_size!=inf_sz)||(csa->seekpos!=seek)) return false;
size=(sz-sizeof(CycleStorageAttr))/(sizeof(CycleStorageElem)+inf_sz);
inf_size=inf_sz;
if(file==NULL)
{
file = fopen(name,"w");
for(int i=0;i<size;i++) fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
fclose(file);
file = fopen(name,"r+");
seekpos=0;
head=-1;
tail=-1;
}
else
{
seekpos=seek;
fseek(file,seekpos,0);
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_sz);
int l=-1,r=size,mid;
iter=0;
seekpos+=sizeof(CycleStorageAttr);
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if(jrn->status==0)
{
......@@ -128,20 +146,53 @@ CycleStorage::CycleStorage(const char* name, int inf_sz, int sz, int seek)
tail=head-1;
if(tail<0) tail=size-1;
}
}
return true;
}
CycleStorage::~CycleStorage()
bool CycleStorage::Create(const char* name, int inf_sz, int sz, int seek)
{
fclose(file);
if(file!=NULL) fclose(file);
file = fopen(name, "r+");
if(file==NULL)
{
FILE*f=fopen(name,"w");
fclose(f);
file = fopen(name, "r+");
}
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_sz);
size=(sz-sizeof(CycleStorageAttr))/(sizeof(CycleStorageElem)+inf_sz);
iter=0;
inf_size=inf_sz;
seekpos=seek;
CycleStorageAttr *csa = new CycleStorageAttr();
csa->inf_size=inf_size;
csa->size=size;
csa->seekpos=seekpos;
fseek(file,seekpos,0);
fwrite(csa,sizeof(CycleStorageAttr),1,file);
seekpos+=sizeof(CycleStorageAttr);
for(int i=0;i<size;i++) fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
int emp = sz-size*(sizeof(CycleStorageElem)+inf_size)-sizeof(CycleStorageAttr);
if(emp>0)
{
char* empty= new char[emp];
fwrite(empty,emp,1,file);
}
head=tail=-1;
return true;
}
int CycleStorage::AddRow(char* str)
bool CycleStorage::AddRow(char* str)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,k;
if(file!=NULL)
{
if(file==NULL) return false;
if(head==-1)
{
fseek(file,seekpos,0);
......@@ -151,7 +202,7 @@ int CycleStorage::AddRow(char* str)
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
head=0;
tail=0;
return 0;
return true;
}
if(head==tail)
{
......@@ -161,7 +212,7 @@ int CycleStorage::AddRow(char* str)
jrn->status=2;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
tail=1;
return 0;
return true;
}
fseek(file,seekpos+tail*(sizeof(CycleStorageElem)+inf_size),0);
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
......@@ -184,7 +235,7 @@ int CycleStorage::AddRow(char* str)
*((char*)(jrn)+sizeof(CycleStorageElem)+k)=*(str+k);
jrn->status=2;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
return 0;
return true;
}
else
{
......@@ -202,19 +253,16 @@ int CycleStorage::AddRow(char* str)
else jrn->status=1;
fseek(file,seekpos+head*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
return 0;
}
return true;
}
return 1;
}
int CycleStorage::DelRow(int row)
bool CycleStorage::DelRow(int row)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i=(head+row)%size,j;
if( row >= size ) return 1;
if(file!=NULL)
{
if( row >= size ) return false;
if(file==NULL) return false;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if(jrn->status==1)
......@@ -222,24 +270,22 @@ int CycleStorage::DelRow(int row)
jrn->status=6;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
return 0;
return true;
}
if(jrn->status==2) j=3;
else if(jrn->status==4) j=5;
else return 1;
else return false;
fseek(file,seekpos+i*(sizeof(CycleStorageElem)+inf_size),0);
jrn->status=j;
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
}
return 1;
return true;
}
int CycleStorage::DelAllRows()
bool CycleStorage::DelAllRows()
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i;
if(file!=NULL)
{
if(file==NULL) return false;
fseek(file,seekpos,0);
if((tail>head)&&(tail!=size-1))
{
......@@ -264,18 +310,16 @@ int CycleStorage::DelAllRows()
}
}
head=tail=-1;
}
return 1;
return true;
}
int CycleStorage::ViewRows(int beg, int num)
bool CycleStorage::ViewRows(int beg, int num)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,j=(head+beg)%size,n=num,k;
if(num==0) n=size;
if(num>size) n=size;
if(file!=NULL)
{
if(file==NULL) return false;
fseek(file,seekpos+j*(sizeof(CycleStorageElem)+inf_size),0);
for(i=0;i<n;i++)
{
......@@ -293,17 +337,14 @@ int CycleStorage::ViewRows(int beg, int num)
}
j++;
}
return 0;
}
return 1;
return true;
}
int CycleStorage::ExportToXML(const char* name)
bool CycleStorage::ExportToXML(const char* name)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,j=head;
if(file!=NULL)
{
if(file==NULL) return false;
UniXML* f = new UniXML();
f->newDoc("!");
fseek(file,seekpos+j*(sizeof(CycleStorageElem)+inf_size),0);
......@@ -322,7 +363,5 @@ int CycleStorage::ExportToXML(const char* name)
j++;
}
f->save(name);
return 0;
}
return 1;
return true;
}
\ No newline at end of file
......@@ -60,35 +60,9 @@ TableBlockStorage::TableBlockStorage()
TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)
{
if(file!=NULL) fclose(file);
if(!Open(name, key_sz, inf_sz, sz, block_num, block_lim, seek))
{
int i,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(full_size);
StorageAttr *sa = (StorageAttr*)malloc(24);
sa->k_size=k_size;
sa->inf_size=inf_size;
sa->size=size;
sa->block_number=block_number;
sa->lim=lim;
sa->seekpos=seekpos;
cur_block=0;
fseek(file,seekpos,0);
fwrite(sa,24,1,file);
seekpos+=24;
for(i=0;i<size;i++)
{
if(i%block_size==0)
t->count=-5;
else t->count=-1;
fwrite(t,(full_size),1,file);
}
mem[0]->count=-5;
for(i=1;i<block_size;i++)
mem[i]->count=-1;
}
Create(name, key_sz, inf_sz, sz, block_num, block_lim, seek);
}
TableBlockStorage::~TableBlockStorage()
......@@ -128,17 +102,32 @@ bool TableBlockStorage::CopyToNextBlock(void)
bool TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)
{
if(file!=NULL) fclose(file);
file = fopen(name, "r+");
if(file==NULL) return false;
seekpos=seek;
StorageAttr *sa = new StorageAttr();
if(fseek(file,seekpos,0)==0) fread(sa,sizeof(StorageAttr),1,file);
else return false;
int full_size = sizeof(TableBlockStorageElem)+key_sz+inf_sz;
int tmpsize=(sz-sizeof(StorageAttr))/(full_size);
int tmpblock=tmpsize/block_num;
tmpsize=tmpblock*block_num;
if((sa->k_size!=key_sz)||(sa->inf_size!=inf_sz)||(sa->size!=tmpsize)||(sa->block_number!=block_num)||(sa->lim!=block_lim)||(sa->seekpos!=seek)) return false;
k_size=key_sz;
inf_size=inf_sz;
seekpos=seek;
lim=block_lim;
int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
size=(sz-24)/(full_size);
size=(sz-sizeof(StorageAttr))/(full_size);
block_number=block_num;
block_size=size/block_num;
size=block_size*block_num;
max=-1;
int i;
......@@ -147,24 +136,10 @@ bool TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, i
{
mem[i]=(TableBlockStorageElem*)malloc(full_size);
}
;
StorageAttr *sa = (StorageAttr*)malloc(24);
if(file==NULL)
{
file=fopen(name,"w+");
//fclose(file);
//file=fopen(name,"r+");
}
if(fseek(file,seekpos,0)==0) fread(sa,sizeof(StorageAttr),1,file);
else return false;
TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(full_size);
for(int k=0;k<k_size+inf_size;k++)
*((char*)(t)+sizeof(TableBlockStorageElem)+k)=0;
if((sa->k_size==k_size)&&(sa->inf_size==inf_size)&&(sa->size==size)&&(sa->block_number==block_number)&&(sa->lim==lim)&&(sa->seekpos==seekpos))
{
seekpos+=24;
seekpos+=sizeof(StorageAttr);
for(i=0;i<block_num;i++)
{
fseek(file,seekpos+i*block_size*(full_size),0);
......@@ -181,11 +156,68 @@ bool TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, i
fread(mem[i],(full_size),1,file);
if(mem[i]->count>max) max=mem[i]->count;
}
return true;
}
bool TableBlockStorage::Create(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)
{
if(file!=NULL) fclose(file);
file = fopen(name, "r+");
if(file==NULL)
{
FILE*f=fopen(name,"w");
fclose(f);
file = fopen(name, "r+");
}
k_size=key_sz;
inf_size=inf_sz;
seekpos=seek;
lim=block_lim;
int i,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(full_size);
size=(sz-sizeof(StorageAttr))/(full_size);
block_number=block_num;
block_size=size/block_num;
size=block_size*block_num;
max=-1;
mem = new TableBlockStorageElem*[block_size];
for(i=0;i<block_size;i++)
{
mem[i]=(TableBlockStorageElem*)malloc(full_size);
}
else
StorageAttr *sa = new StorageAttr();
sa->k_size=k_size;
sa->inf_size=inf_size;
sa->size=size;
sa->block_number=block_number;
sa->lim=lim;
sa->seekpos=seekpos;
cur_block=0;
fseek(file,seekpos,0);
fwrite(sa,sizeof(StorageAttr),1,file);
seekpos+=sizeof(StorageAttr);
for(i=0;i<size;i++)
{
return false;
if(i%block_size==0)
t->count=-5;
else t->count=-1;
fwrite(t,(full_size),1,file);
}
int emp = sz-size*full_size-sizeof(StorageAttr);
if(emp>0)
{
char* empty=new char[emp];
fwrite(empty,emp,1,file);
}
mem[0]->count=-5;
for(i=1;i<block_size;i++)
mem[i]->count=-1;
return true;
}
......@@ -225,7 +257,6 @@ bool TableBlockStorage::AddRow(char* key, char* value)
bool TableBlockStorage::DelRow(char* key)
{
int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(full_size);
int i;
if(file==NULL) return false;
......
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