Commit 72839840 authored by Ivan Donchevskiy's avatar Ivan Donchevskiy

Added ExportToXML to CycleStorage and edited TableStorage to work with different…

Added ExportToXML to CycleStorage and edited TableStorage to work with different parts of memory with rewriting old keys, some changes in JrnTest.cc
parent 54e0c695
......@@ -24,10 +24,12 @@
*/
// --------------------------------------------------------------------------
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "Storages.h"
#include "UniXML.h"
char* itoa(int val, int base)
{
......@@ -50,36 +52,39 @@ void testTable(void)
char *chr=(char*)malloc(20);
char *val=(char*)malloc(40);
TableStorage *t;
t = new TableStorage("table.test", 40, 6000, 0);
t = new TableStorage("table.test", 40, 1220, 0);
int i;
printf("testTable\nsize = %d\n",t->size);
for(i=0;i<t->size+5;i++)
for(i=0;i<t->size;i++)
{
chr[0]=i;
val=itoa(i,10);
if(t->AddRow(chr,val)==1) printf("elem number %d - no space in TableStorage\n",i);
t->AddRow(chr,val);
}
printf("elements with values=keys added\nvalues from keys 25-59\n");
for(i=25;i<60;i++)
//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++)
{
chr[0]=i;
if(t->FindKeyValue(chr,val)!=0) printf("%s, ",val);
}
printf("\n");
for(i=40;i<60;i++)
for(i=9;i<15;i++)
{
chr[0]=i;
t->DelRow(chr);
}
printf("elements with keys from 40 to 60 deleted\n");
for(i=30;i<50;i++)
//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);
if(t->AddRow(chr,val)==1) printf("elem number %d - no space in TableStorage\n",i);
t->AddRow(chr,val);
}
printf("elements with keys from 30 to 50 with values=key+40 added\nvalues from keys 25-59\n");
for(i=25;i<60;i++)
//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++)
{
chr[0]=i;
if(t->FindKeyValue(chr,val)!=0) printf("%s, ",val);
......@@ -119,6 +124,7 @@ void testJournal1(void)
j = new CycleStorage("journal.test",30,2000000,0);
j->ViewRows(0,20);
printf("\n");
j->ExportToXML("Xml.xml");
}
void testJournal2(void)
......@@ -132,7 +138,7 @@ void testJournal2(void)
printf("iterations = %d\n",j->iter);
for(i=0;i<20;i++)
{
for(k=0;k<2000;k++)
for(k=1000;k<3000;k++)
{
str = itoa(k,10);
j->AddRow(str);
......@@ -146,14 +152,13 @@ void testJournal2(void)
int main(int args, char **argv)
{
printf("args=%d\n",args);
if(args<2)
/*if(args<2)
{
printf("Correct usage: jrntest File_name\n");
return 0;
}
CycleStorage *j = new CycleStorage(argv[1],99,1000,0);
printf("commands:\nadd\ndelete\nview\ndel_all\nenter q or quit to exit\n\n");
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;
......@@ -198,11 +203,21 @@ int main(int args, char **argv)
printf("\n");
}
}
}
/*testTable();
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");
}*/
testTable();
testJournal1();
testJournal2();*/
testJournal2();
return 0;
}
\ No newline at end of file
......@@ -29,11 +29,13 @@
#include <stdio.h>
#include <string.h>
#include <UniXML.h>
#define key_size 20
struct TableStorageElem
{
char status;
char key[key_size];
} __attribute__((__packed__));
......@@ -46,6 +48,7 @@ class TableStorage
{
FILE *file;
int seekpos, inf_size;
int head;
public:
int size;
TableStorage(const char* name, int inf_sz, int sz, int seek);
......@@ -68,6 +71,7 @@ class CycleStorage
int DelRow(int row);
int DelAllRows(void);
int ViewRows(int beg, int num);
int ExportToXML(const char* name);
};
#endif
......@@ -75,9 +75,10 @@ public:
// , .
static const xmlChar* local2xml(std::string text);
// name node
// XML-
void newDoc(const std::string& root_node, std::string xml_ver="1.0");
// name node
static std::string getProp(xmlNode* node, const std::string name);
// name node
......
......@@ -263,6 +263,7 @@ int CycleStorage::DelAllRows()
fwrite(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
}
}
head=tail=-1;
}
return 1;
}
......@@ -295,4 +296,33 @@ int CycleStorage::ViewRows(int beg, int num)
return 0;
}
return 1;
}
int CycleStorage::ExportToXML(const char* name)
{
CycleStorageElem *jrn = (CycleStorageElem*)malloc(sizeof(CycleStorageElem)+inf_size);
int i,j=head;
if(file!=NULL)
{
UniXML* f = new UniXML();
f->newDoc("!");
fseek(file,seekpos+j*(sizeof(CycleStorageElem)+inf_size),0);
for(i=0;i<size;i++)
{
if(j==size)
{
j=0;
fseek(file,seekpos,0);
}
fread(jrn,(sizeof(CycleStorageElem)+inf_size),1,file);
if((jrn->status!=0)&&(jrn->status!=3)&&(jrn->status!=5)&&(jrn->status!=6))
{
f->createNext(f->cur,"!",((char*)(jrn)+sizeof(CycleStorageElem)));
}
j++;
}
f->save(name);
return 0;
}
return 1;
}
\ No newline at end of file
......@@ -35,17 +35,74 @@ TableStorage::TableStorage(const char* name, int inf_sz, int sz, int seek)
{
file = fopen(name, "r+");
inf_size=inf_sz;
int l=-1,r=size,mid;
size=sz/(sizeof(TableStorageElem)+inf_size);
TableStorageElem *t = (TableStorageElem*)malloc(sizeof(TableStorageElem)+inf_size);
if(file==NULL)
{
file = fopen(name,"w");
TableStorageElem *t = (TableStorageElem*)malloc(sizeof(TableStorageElem)+inf_size);
for(int i=0;i<size;i++) fwrite(t,(sizeof(TableStorageElem)+inf_size),1,file);
fclose(file);
file = fopen(name,"r+");
seekpos=0;
head=-1;
}
else
{
seekpos=seek;
fseek(file,seekpos,0);
fread(t,(sizeof(TableStorageElem)+inf_size),1,file);
if(t->status==0)
{
head=-1;
}
else if((t->status==1)||(t->status==6))
{
head=0;
}
else if((t->status==2)||(t->status==3))
{
while((t->status!=1)&&(t->status!=6)&&(r - l > 1))
{
mid = (l+r)/2;
fseek(file,seekpos+mid*(sizeof(TableStorageElem)+inf_size),0);
fread(t,(sizeof(TableStorageElem)+inf_size),1,file);
if((t->status==2)||(t->status==3))
l = mid;
else if((t->status==4)||(t->status==5))
r = mid;
else
{
r=mid;
break;
}
}
if(r<size)
head=r;
else head=size-1;
}
else
{
while((t->status!=1)&&(t->status!=6)&&(r - l > 1))
{
mid = (l+r)/2;
fseek(file,seekpos+mid*(sizeof(TableStorageElem)+inf_size),0);
fread(t,(sizeof(TableStorageElem)+inf_size),1,file);
if((t->status==2)||(t->status==3))
r = mid;
else if((t->status==4)||(t->status==5))
l = mid;
else
{
r=mid;
break;
}
}
if(r<size)
head=r;
else head=size-1;
}
}
else seekpos=seek;
}
TableStorage::~TableStorage()
......@@ -56,14 +113,27 @@ TableStorage::~TableStorage()
int TableStorage::AddRow(char* key, char* value)
{
TableStorageElem *tbl = (TableStorageElem*)malloc(sizeof(TableStorageElem)+inf_size);
int i,k;
int i,k,j,st;
if(file!=NULL)
{
fseek(file,seekpos,0);
if(head==-1)
{
fseek(file,seekpos,0);
tbl->status=1;
strcpy(tbl->key,key);
for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableStorageElem)+k)=*(value+k);
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
head=0;
return 0;
}
fseek(file,seekpos+head*(sizeof(TableStorageElem)+inf_size),0);
j=head;
for(i=0;i<size;i++)
{
fread(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
if(!strcmp(tbl->key,key))
if(tbl->status==0) break;
if(!strcmp(tbl->key,key)&&((tbl->status==2)||(tbl->status==4)||(tbl->status==1)))
{
for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableStorageElem)+k)=*(value+k);
......@@ -71,9 +141,46 @@ int TableStorage::AddRow(char* key, char* value)
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
return 0;
}
j++;
if(j>=size)
{
j=0;
fseek(file,seekpos,0);
}
}
fseek(file,seekpos,0);
for(i=0;i<size;i++)
fseek(file,seekpos+j*(sizeof(TableStorageElem)+inf_size),0);
if(j==head)
{
if((tbl->status==2)||(tbl->status==3)) st=2;
else st=4;
if(j==0)
if(st==2) st=4;
else st=2;
tbl->status=st;
strcpy(tbl->key,key);
for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableStorageElem)+k)=*(value+k);
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
j++;
if(j>=size)
{
j=0;
fseek(file,seekpos,0);
}
fread(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
if((tbl->status==3)||(tbl->status==5)) tbl->status=6;
else tbl->status=1;
fseek(file,seekpos+j*(sizeof(TableStorageElem)+inf_size),0);
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
head++;
if(head>=size) head=0;
return 0;
}
/*for(i=0;i<size;i++)
{
fread(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
if(tbl->key[0]==0)
......@@ -85,7 +192,7 @@ int TableStorage::AddRow(char* key, char* value)
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
return 0;
}
}
}*/
}
return 1;
}
......@@ -93,20 +200,30 @@ int TableStorage::AddRow(char* key, char* value)
int TableStorage::DelRow(char* key)
{
TableStorageElem *tbl = (TableStorageElem*)malloc(sizeof(TableStorageElem)+inf_size);
int i;
int i,j;
if(file!=NULL)
{
fseek(file,seekpos,0);
fseek(file,seekpos+head*(sizeof(TableStorageElem)+inf_size),0);
j=head;
for(i=0;i<size;i++)
{
fread(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
if(!strcmp(tbl->key,key))
if(!strcmp(tbl->key,key)&&((tbl->status==2)||(tbl->status==4)||(tbl->status==1)))
{
tbl->key[0]=0;
fseek(file,seekpos+i*(sizeof(TableStorageElem)+inf_size),0);
//tbl->key[0]=0;
if(tbl->status==1) tbl->status=6;
else if(tbl->status==2) tbl->status=3;
else tbl->status=5;
fseek(file,seekpos+j*(sizeof(TableStorageElem)+inf_size),0);
fwrite(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
return 0;
}
j++;
if(j>=size)
{
j=0;
fseek(file,seekpos,0);
}
}
}
return 1;
......@@ -122,7 +239,7 @@ char* TableStorage::FindKeyValue(char* key, char* val)
for(i=0;i<size;i++)
{
fread(tbl,(sizeof(TableStorageElem)+inf_size),1,file);
if(!strcmp(tbl->key,key))
if(!strcmp(tbl->key,key)&&((tbl->status==2)||(tbl->status==4)||(tbl->status==1)))
{
for(k=0;k<inf_size;k++)
*(val+k)=*((char*)(tbl)+sizeof(TableStorageElem)+k);
......
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