Commit bf56ea5e authored by Ivan Donchevskiy's avatar Ivan Donchevskiy Committed by Ivan Donchevskiy

Added seekpos (start position in file) to TableBlockStorage

parent 2c1a7417
...@@ -97,77 +97,61 @@ void testTable2(void) ...@@ -97,77 +97,61 @@ void testTable2(void)
char *chr=(char*)malloc(20); char *chr=(char*)malloc(20);
char *val=(char*)malloc(40); char *val=(char*)malloc(40);
TableBlockStorage *t; TableBlockStorage *t;
t = new TableBlockStorage("blocktable.test", 40, 20000, 5,40); t = new TableBlockStorage("blocktableint.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<16;i++) for(i=1;i<11;i++)
{ {
chr[0]=i; chr[0]=i;
val=itoa(i,10); val=itoa(i,10);
t->AddRow(chr,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<16;i++) for(i=1;i<11;i++)
{ {
chr[0]=i; chr[0]=i;
if(t->FindKeyValue(chr,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<16;i++) for(i=1;i<8;i++)
{ {
chr[0]=i; chr[0]=i;
val=itoa(i+10,10); val=itoa(i+10,10);
t->AddRow(chr,val); t->AddRow((char*)&i,val);
} }
for(i=1;i<16;i++) for(i=8;i<11;i++)
{ {
chr[0]=i; chr[0]=i;
if(t->FindKeyValue(chr,val)!=0) printf("%s, ",val); t->DelRow((char*)&i);
}
for(i=1;i<11;i++)
{
chr[0]=i;
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=20;i<30;i++) for(i=3;i<11;i++)
{ {
chr[0]=i; chr[0]=i;
val=itoa(i,10); val=itoa(i+40,10);
t->AddRow(chr,val); t->AddRow((char*)&i,val);
} }
for(i=1;i<40;i++) for(i=1;i<11;i++)
{ {
chr[0]=i; chr[0]=i;
if(t->FindKeyValue(chr,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]=30; chr[0]=10;
strcpy(val,"new block"); strcpy(val,"new block");
t->AddRow(chr,val); t->AddRow((char*)&i,val);
for(i=1;i<40;i++) for(i=1;i<40;i++)
{ {
chr[0]=i; chr[0]=i;
if(t->FindKeyValue(chr,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=9;i<15;i++)
{
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);
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++)
{
chr[0]=i;
if(t->FindKeyValue(chr,val)!=0) printf("%s, ",val);
}
printf("\n");*/
} }
void testJournal1(void) void testJournal1(void)
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +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
...@@ -67,16 +67,16 @@ class TableStorage ...@@ -67,16 +67,16 @@ class TableStorage
class TableBlockStorage class TableBlockStorage
{ {
FILE *file; int max,lim,seekpos;
int inf_size, k_size;
int max,lim;
TableBlockStorageElem** mem; TableBlockStorageElem** mem;
public: public:
FILE *file;
int inf_size, k_size;
int size,cur_block,block_size; int size,cur_block,block_size;
TableBlockStorage(); TableBlockStorage();
TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim); TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek);
~TableBlockStorage(); ~TableBlockStorage();
int Open(const char* name, int inf_sz, int key_sz, int sz, int block_num, int block_lim); int Open(const char* name, int inf_sz, int key_sz, int sz, int block_num, int block_lim, int seek);
int AddRow(char* key, char* val); int AddRow(char* key, char* val);
int DelRow(char* key); int DelRow(char* key);
char* FindKeyValue(char* key, char* val); char* FindKeyValue(char* key, char* val);
......
...@@ -53,13 +53,16 @@ TableBlockStorage::TableBlockStorage() ...@@ -53,13 +53,16 @@ TableBlockStorage::TableBlockStorage()
lim=0; lim=0;
cur_block=0; cur_block=0;
block_size=0; block_size=0;
seekpos=0;
file=NULL;
} }
TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim) TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)
{ {
file = fopen(name, "r+"); file = fopen(name, "r+");
k_size=key_sz; k_size=key_sz;
inf_size=inf_sz; inf_size=inf_sz;
seekpos=seek;
int i, full_size = sizeof(TableBlockStorageElem)+k_size+inf_size; int i, full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
max=-1; max=-1;
lim=block_lim; lim=block_lim;
...@@ -78,6 +81,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i ...@@ -78,6 +81,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i
{ {
file = fopen(name,"w"); file = fopen(name,"w");
cur_block=0; cur_block=0;
fseek(file,seekpos,0);
for(i=0;i<size;i++) for(i=0;i<size;i++)
{ {
if(i%block_size==0) if(i%block_size==0)
...@@ -95,7 +99,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i ...@@ -95,7 +99,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i
{ {
for(i=0;i<block_num;i++) for(i=0;i<block_num;i++)
{ {
fseek(file,i*block_size*(full_size),0); fseek(file,seekpos+i*block_size*(full_size),0);
fread(t,(full_size),1,file); fread(t,(full_size),1,file);
if(t->count>=0) if(t->count>=0)
{ {
...@@ -103,7 +107,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i ...@@ -103,7 +107,7 @@ TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, i
break; break;
} }
} }
fseek(file,(cur_block*block_size)*(full_size),0); fseek(file,seekpos+(cur_block*block_size)*(full_size),0);
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fread(mem[i],(full_size),1,file); fread(mem[i],(full_size),1,file);
...@@ -117,11 +121,12 @@ TableBlockStorage::~TableBlockStorage() ...@@ -117,11 +121,12 @@ TableBlockStorage::~TableBlockStorage()
fclose(file); fclose(file);
} }
int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim) int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim, int seek)
{ {
file = fopen(name, "r+"); file = fopen(name, "r+");
k_size=key_sz; k_size=key_sz;
inf_size=inf_sz; inf_size=inf_sz;
seekpos=seek;
int i,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size; int i,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
max=-1; max=-1;
lim=block_lim; lim=block_lim;
...@@ -144,7 +149,7 @@ int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, in ...@@ -144,7 +149,7 @@ int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, in
{ {
for(i=0;i<block_num;i++) for(i=0;i<block_num;i++)
{ {
fseek(file,i*block_size*(full_size),0); fseek(file,seekpos+i*block_size*(full_size),0);
fread(t,(full_size),1,file); fread(t,(full_size),1,file);
if(t->count>=0) if(t->count>=0)
{ {
...@@ -152,7 +157,7 @@ int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, in ...@@ -152,7 +157,7 @@ int TableBlockStorage::Open(const char* name, int key_sz, int inf_sz, int sz, in
break; break;
} }
} }
fseek(file,(cur_block*block_size)*(full_size),0); fseek(file,seekpos+(cur_block*block_size)*(full_size),0);
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fread(mem[i],(full_size),1,file); fread(mem[i],(full_size),1,file);
...@@ -180,23 +185,15 @@ int TableBlockStorage::AddRow(char* key, char* value) ...@@ -180,23 +185,15 @@ int TableBlockStorage::AddRow(char* key, char* value)
if(mem[i]->count>=0) if(mem[i]->count>=0)
{ {
mem[i]->count=++max; mem[i]->count=++max;
fseek(file,((cur_block+1)*block_size+j)*(full_size),0); fseek(file,seekpos+((cur_block+1)*block_size+j)*(full_size),0);
fwrite(mem[i],(full_size),1,file); fwrite(mem[i],(full_size),1,file);
j++; j++;
} }
} }
/*fseek(file,((cur_block+1)*block_size+j)*(full_size),0);
mem[j]->count=++max;
for(k=0;k<k_size;k++)
*((char*)mem[j]+sizeof(TableBlockStorageElem)+k)=*(key+k);
for(k=0;k<inf_size;k++)
*((char*)mem[j]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fwrite(mem[j],(sizeof(TableBlockStorageElem)+inf_size),1,file);*/
tbl->count=-5; tbl->count=-5;
fseek(file,cur_block*block_size*(full_size),0); fseek(file,seekpos+cur_block*block_size*(full_size),0);
fwrite(tbl,(full_size),1,file); fwrite(tbl,(full_size),1,file);
cur_block++; cur_block++;
//return 0;
} }
} }
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
...@@ -211,7 +208,7 @@ int TableBlockStorage::AddRow(char* key, char* value) ...@@ -211,7 +208,7 @@ int 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,(cur_block*block_size+pos)*(full_size),0); fseek(file,seekpos+(cur_block*block_size+pos)*(full_size),0);
fwrite(mem[pos],(full_size),1,file); fwrite(mem[pos],(full_size),1,file);
return 0; return 0;
} }
...@@ -220,7 +217,7 @@ int TableBlockStorage::AddRow(char* key, char* value) ...@@ -220,7 +217,7 @@ int 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,(cur_block*block_size+empty)*(full_size),0); fseek(file,seekpos+(cur_block*block_size+empty)*(full_size),0);
fwrite(mem[empty],(full_size),1,file); fwrite(mem[empty],(full_size),1,file);
return 0; return 0;
} }
...@@ -245,13 +242,13 @@ int TableBlockStorage::DelRow(char* key) ...@@ -245,13 +242,13 @@ int TableBlockStorage::DelRow(char* key)
if(mem[i]->count>=0) if(mem[i]->count>=0)
{ {
mem[i]->count=++max; mem[i]->count=++max;
fseek(file,((cur_block+1)*block_size+j)*(full_size),0); fseek(file,seekpos+((cur_block+1)*block_size+j)*(full_size),0);
fwrite(mem[i],(full_size),1,file); fwrite(mem[i],(full_size),1,file);
j++; j++;
} }
} }
tbl->count=-5; tbl->count=-5;
fseek(file,cur_block*block_size*(full_size),0); fseek(file,seekpos+cur_block*block_size*(full_size),0);
fwrite(tbl,(full_size),1,file); fwrite(tbl,(full_size),1,file);
cur_block++; cur_block++;
} }
...@@ -261,7 +258,7 @@ int TableBlockStorage::DelRow(char* key) ...@@ -261,7 +258,7 @@ int 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,(cur_block*block_size+i)*(full_size),0); 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); fwrite(mem[i],(full_size),1,file);
...@@ -277,7 +274,6 @@ char* TableBlockStorage::FindKeyValue(char* key, char* val) ...@@ -277,7 +274,6 @@ char* TableBlockStorage::FindKeyValue(char* key, char* val)
int i,k; int i,k;
if(file!=NULL) if(file!=NULL)
{ {
//fseek(file,cur_block*block_size*(full_size),0);
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
//fread(tbl,(full_size),1,file); //fread(tbl,(full_size),1,file);
......
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