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 @@ ...@@ -31,22 +31,6 @@
#include "Storages.h" #include "Storages.h"
#include "UniXML.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) void testTable1(void)
{ {
char *chr=(char*)malloc(20); char *chr=(char*)malloc(20);
...@@ -58,10 +42,9 @@ void testTable1(void) ...@@ -58,10 +42,9 @@ void testTable1(void)
for(i=0;i<t->size;i++) for(i=0;i<t->size;i++)
{ {
chr[0]=i; chr[0]=i;
val=itoa(i,10); sprintf(val,"%d",i);
t->AddRow(chr,val); t->AddRow(chr,val);
} }
//printf("elements with values=keys added\nvalues from keys 25-59\n");
printf("elements with values=keys added:\n"); printf("elements with values=keys added:\n");
for(i=0;i<40;i++) for(i=0;i<40;i++)
{ {
...@@ -74,15 +57,13 @@ void testTable1(void) ...@@ -74,15 +57,13 @@ void testTable1(void)
chr[0]=i; chr[0]=i;
t->DelRow(chr); t->DelRow(chr);
} }
//printf("elements with keys from 40 to 60 deleted\n");
printf("elements with keys from 9 to 14 deleted\n"); printf("elements with keys from 9 to 14 deleted\n");
for(i=9;i<15;i++) for(i=9;i<15;i++)
{ {
chr[0]=i; chr[0]=i;
val=itoa(i+40,10); sprintf(val,"%d",i+40);
t->AddRow(chr,val); 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"); printf("elements with keys from 9 to 14 with values=key+40 added, all elements:\n");
for(i=0;i<40;i++) for(i=0;i<40;i++)
{ {
...@@ -94,64 +75,71 @@ void testTable1(void) ...@@ -94,64 +75,71 @@ void testTable1(void)
void testTable2(void) void testTable2(void)
{ {
char *chr=(char*)malloc(20);
char *val=(char*)malloc(40); char *val=(char*)malloc(40);
TableBlockStorage *t; 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; int i;
printf("testTable\nsize = %d\n",t->block_size); 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++) for(i=1;i<11;i++)
{ {
chr[0]=i; sprintf(val,"%d",i);
val=itoa(i,10);
t->AddRow((char*)&i,val); t->AddRow((char*)&i,val);
} }
printf("current block = %d, elements with values=keys added:\n",t->cur_block); 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); if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
} }
printf("\ncurrent block = %d\n",t->cur_block); printf("\ncurrent block = %d\n",t->cur_block);
for(i=1;i<8;i++) for(i=1;i<8;i++)
{ {
chr[0]=i; sprintf(val,"%d",i+10);
val=itoa(i+10,10);
t->AddRow((char*)&i,val); t->AddRow((char*)&i,val);
} }
for(i=8;i<11;i++) for(i=8;i<11;i++)
{ {
chr[0]=i;
t->DelRow((char*)&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); if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
} }
printf("\ncurrent block = %d\n",t->cur_block); printf("\ncurrent block = %d\n",t->cur_block);
for(i=3;i<11;i++) for(i=3;i<11;i++)
{ {
chr[0]=i; sprintf(val,"%d",i+40);
val=itoa(i+40,10);
t->AddRow((char*)&i,val); 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); if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
} }
printf("\ncurrent block = %d\n",t->cur_block); printf("\ncurrent block = %d\n",t->cur_block);
chr[0]=10;
strcpy(val,"new block"); strcpy(val,"new block");
i=9;
t->AddRow((char*)&i,val); 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); if(t->FindKeyValue((char*)&i,val)!=0) printf("%s, ",val);
} }
printf("\ncurrent block = %d\n",t->cur_block); 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) void testJournal1(void)
...@@ -160,15 +148,25 @@ void testJournal1(void) ...@@ -160,15 +148,25 @@ void testJournal1(void)
int i; int i;
char *str = (char*)malloc(30); char *str = (char*)malloc(30);
printf("journal test 1\n"); 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); printf("size = %d\n",j->size);
for(i=1;i<40000;i++) for(i=1;i<40000;i++)
{ {
str = itoa(i,10); sprintf(str,"%d",i);
j->AddRow(str); j->AddRow(str);
} }
printf("\n20 elements from 10-th:\n"); printf("\n20 elements from 10-th:\n");
j->ViewRows(10,20); 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"); printf("\n20 elements from 10-th after deleting first 20:\n");
for(i=0;i<20;i++) for(i=0;i<20;i++)
{ {
...@@ -178,12 +176,13 @@ void testJournal1(void) ...@@ -178,12 +176,13 @@ void testJournal1(void)
printf("\nfirst 20 after adding 10 elements\n"); printf("\nfirst 20 after adding 10 elements\n");
for(i=1;i<11;i++) for(i=1;i<11;i++)
{ {
str = itoa(i,10); sprintf(str,"%d",i);
j->AddRow(str); j->AddRow(str);
} }
j->ViewRows(0,20); j->ViewRows(0,20);
printf("\nthe same after reopen:\n"); 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); j->ViewRows(0,20);
printf("\n"); printf("\n");
j->ExportToXML("Xml.xml"); j->ExportToXML("Xml.xml");
...@@ -194,18 +193,19 @@ void testJournal2(void) ...@@ -194,18 +193,19 @@ void testJournal2(void)
CycleStorage *j; CycleStorage *j;
int i,k; int i,k;
char *str = (char*)malloc(30); 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("journal test 2 - checking number of iterations to find head/tail\n");
printf("size = %d\n\n",j->size); printf("size = %d\n\n",j->size);
printf("iterations = %d\n",j->iter); printf("iterations = %d\n",j->iter);
//j->ViewRows(10,20);
for(i=0;i<20;i++) for(i=0;i<20;i++)
{ {
for(k=1000;k<3000;k++) for(k=1000;k<3000;k++)
{ {
str = itoa(k,10); sprintf(str,"%d",k);
j->AddRow(str); 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("iterations = %d\n",j->iter);
} }
printf("\n"); printf("\n");
...@@ -214,69 +214,6 @@ void testJournal2(void) ...@@ -214,69 +214,6 @@ void testJournal2(void)
int main(int args, char **argv) 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(); testTable1();
testTable2(); testTable2();
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "UniXML.h" #include "UniXML.h"
#define key_size 20 #define key_size 20
...@@ -38,7 +39,12 @@ struct StorageAttr ...@@ -38,7 +39,12 @@ struct StorageAttr
{ {
int k_size, inf_size,size,block_number; int k_size, inf_size,size,block_number;
int lim, seekpos; int lim, seekpos;
}; } __attribute__((__packed__));
struct CycleStorageAttr
{
int size, inf_size, seekpos;
} __attribute__((__packed__));
struct TableStorageElem struct TableStorageElem
{ {
...@@ -84,6 +90,7 @@ class TableBlockStorage ...@@ -84,6 +90,7 @@ class TableBlockStorage
private: bool CopyToNextBlock(); private: 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 AddRow(char* key, char* val); bool AddRow(char* key, char* val);
bool DelRow(char* key); bool DelRow(char* key);
char* FindKeyValue(char* key, char* val); char* FindKeyValue(char* key, char* val);
...@@ -96,13 +103,16 @@ class CycleStorage ...@@ -96,13 +103,16 @@ class CycleStorage
int head,tail; int head,tail;
public: public:
int size, iter; int size, iter;
CycleStorage();
CycleStorage(const char* name, int inf_sz, int sz, int seek); CycleStorage(const char* name, int inf_sz, int sz, int seek);
~CycleStorage(); ~CycleStorage();
int AddRow(char* str); bool Open(const char* name, int inf_sz, int sz, int seek);
int DelRow(int row); bool Create(const char* name, int inf_sz, int sz, int seek);
int DelAllRows(void); bool AddRow(char* str);
int ViewRows(int beg, int num); bool DelRow(int row);
int ExportToXML(const char* name); bool DelAllRows(void);
bool ViewRows(int beg, int num);
bool ExportToXML(const char* name);
}; };
#endif #endif
...@@ -60,35 +60,9 @@ TableBlockStorage::TableBlockStorage() ...@@ -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) 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)) if(!Open(name, key_sz, inf_sz, sz, block_num, block_lim, seek))
{ Create(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;
}
} }
TableBlockStorage::~TableBlockStorage() TableBlockStorage::~TableBlockStorage()
...@@ -128,17 +102,32 @@ bool TableBlockStorage::CopyToNextBlock(void) ...@@ -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) 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+"); 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; k_size=key_sz;
inf_size=inf_sz; inf_size=inf_sz;
seekpos=seek;
lim=block_lim; lim=block_lim;
int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size; size=(sz-sizeof(StorageAttr))/(full_size);
size=(sz-24)/(full_size);
block_number=block_num; block_number=block_num;
block_size=size/block_num; block_size=size/block_num;
size=block_size*block_num; size=block_size*block_num;
max=-1; max=-1;
int i; int i;
...@@ -147,48 +136,91 @@ bool TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, i ...@@ -147,48 +136,91 @@ bool TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, i
{ {
mem[i]=(TableBlockStorageElem*)malloc(full_size); 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); 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+=sizeof(StorageAttr);
for(i=0;i<block_num;i++)
{ {
seekpos+=24; fseek(file,seekpos+i*block_size*(full_size),0);
for(i=0;i<block_num;i++) fread(t,(full_size),1,file);
if(t->count>=0)
{ {
fseek(file,seekpos+i*block_size*(full_size),0); cur_block=i;
fread(t,(full_size),1,file); break;
if(t->count>=0)
{
cur_block=i;
break;
}
}
fseek(file,seekpos+(cur_block*block_size)*(full_size),0);
for(i=0;i<block_size;i++)
{
fread(mem[i],(full_size),1,file);
if(mem[i]->count>max) max=mem[i]->count;
} }
} }
else fseek(file,seekpos+(cur_block*block_size)*(full_size),0);
for(i=0;i<block_size;i++)
{ {
return false; fread(mem[i],(full_size),1,file);
if(mem[i]->count>max) max=mem[i]->count;
} }
return true; 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);
}
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++)
{
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;
}
bool TableBlockStorage::AddRow(char* key, char* value) bool TableBlockStorage::AddRow(char* key, char* value)
{ {
int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size; int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
...@@ -225,7 +257,6 @@ bool TableBlockStorage::AddRow(char* key, char* value) ...@@ -225,7 +257,6 @@ bool TableBlockStorage::AddRow(char* key, char* value)
bool TableBlockStorage::DelRow(char* key) bool TableBlockStorage::DelRow(char* key)
{ {
int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size; int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(full_size);
int i; int i;
if(file==NULL) return false; 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