Commit 2c1a7417 authored by Ivan Donchevskiy's avatar Ivan Donchevskiy Committed by Ivan Donchevskiy

/src/Various /Utilities/JrnTests TableBlockStorage.cc now can work with keys of…

/src/Various /Utilities/JrnTests TableBlockStorage.cc now can work with keys of any type, test for it is also corrected (eterbug 4115)
parent 7cc28edd
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#define Storages_H_ #define Storages_H_
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <UniXML.h> #include <UniXML.h>
...@@ -42,7 +43,7 @@ struct TableStorageElem ...@@ -42,7 +43,7 @@ struct TableStorageElem
struct TableBlockStorageElem struct TableBlockStorageElem
{ {
int count; int count;
char key[key_size]; //char key[key_size];
} __attribute__((__packed__)); } __attribute__((__packed__));
struct CycleStorageElem struct CycleStorageElem
...@@ -67,12 +68,15 @@ class TableStorage ...@@ -67,12 +68,15 @@ class TableStorage
class TableBlockStorage class TableBlockStorage
{ {
FILE *file; FILE *file;
int inf_size; int inf_size, k_size;
int max,lim; int max,lim;
TableBlockStorageElem** mem;
public: public:
int size,cur_block,block_size; int size,cur_block,block_size;
TableBlockStorage(const char* name, 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);
~TableBlockStorage(); ~TableBlockStorage();
int Open(const char* name, int inf_sz, int key_sz, int sz, int block_num, int block_lim);
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);
......
...@@ -30,20 +30,50 @@ ...@@ -30,20 +30,50 @@
#include "Storages.h" #include "Storages.h"
bool KeyCompare(char* key1, char* key2, int cnt)
{
bool fl=true;
for(int i=0;i<cnt;i++)
{
if(*(key1+sizeof(TableBlockStorageElem)+i)!=*(key2+i))
{
fl=false;
break;
}
}
return fl;
}
TableBlockStorage::TableBlockStorage(const char* name, int inf_sz, int sz, int block_num, int block_lim) TableBlockStorage::TableBlockStorage()
{
size=0;
k_size=0;
inf_size=0;
max=-1;
lim=0;
cur_block=0;
block_size=0;
}
TableBlockStorage::TableBlockStorage(const char* name, int key_sz, int inf_sz, int sz, int block_num, int block_lim)
{ {
file = fopen(name, "r+"); file = fopen(name, "r+");
k_size=key_sz;
inf_size=inf_sz; inf_size=inf_sz;
int i; int i, full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
max=-1; max=-1;
lim=block_lim; lim=block_lim;
size=sz/(sizeof(TableBlockStorageElem)+inf_size); size=sz/(full_size);
block_size=size/block_num; block_size=size/block_num;
size=block_size*block_num; size=block_size*block_num;
TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(sizeof(TableBlockStorageElem)+inf_size); TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(full_size);
for(int k=0;k<inf_size;k++) for(int k=0;k<k_size+inf_size;k++)
*((char*)(t)+sizeof(TableBlockStorageElem)+k)=0; *((char*)(t)+sizeof(TableBlockStorageElem)+k)=0;
mem = new TableBlockStorageElem*[block_size];
for(i=0;i<block_size;i++)
{
mem[i]=(TableBlockStorageElem*)malloc(full_size);
}
if(file==NULL) if(file==NULL)
{ {
file = fopen(name,"w"); file = fopen(name,"w");
...@@ -53,8 +83,11 @@ TableBlockStorage::TableBlockStorage(const char* name, int inf_sz, int sz, int b ...@@ -53,8 +83,11 @@ TableBlockStorage::TableBlockStorage(const char* name, int inf_sz, int sz, int b
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,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(t,(full_size),1,file);
} }
mem[0]->count=-5;
for(i=1;i<block_size;i++)
mem[i]->count=-1;
fclose(file); fclose(file);
file = fopen(name,"r+"); file = fopen(name,"r+");
} }
...@@ -62,19 +95,19 @@ TableBlockStorage::TableBlockStorage(const char* name, int inf_sz, int sz, int b ...@@ -62,19 +95,19 @@ TableBlockStorage::TableBlockStorage(const char* name, int inf_sz, int sz, int b
{ {
for(i=0;i<block_num;i++) for(i=0;i<block_num;i++)
{ {
fseek(file,i*block_size*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,i*block_size*(full_size),0);
fread(t,(sizeof(TableBlockStorageElem)+inf_size),1,file); fread(t,(full_size),1,file);
if(t->count>=0) if(t->count>=0)
{ {
cur_block=i; cur_block=i;
break; break;
} }
} }
fseek(file,(cur_block*block_size)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,(cur_block*block_size)*(full_size),0);
for(i=0;i<block_size;i++); for(i=0;i<block_size;i++)
{ {
fread(t,(sizeof(TableBlockStorageElem)+inf_size),1,file); fread(mem[i],(full_size),1,file);
if(t->count>max) max=t->count; if(mem[i]->count>max) max=mem[i]->count;
} }
} }
} }
...@@ -84,71 +117,111 @@ TableBlockStorage::~TableBlockStorage() ...@@ -84,71 +117,111 @@ 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)
{
file = fopen(name, "r+");
k_size=key_sz;
inf_size=inf_sz;
int i,full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
max=-1;
lim=block_lim;
size=sz/(full_size);
block_size=size/block_num;
size=block_size*block_num;
TableBlockStorageElem *t = (TableBlockStorageElem*)malloc(full_size);
for(int k=0;k<k_size+inf_size;k++)
*((char*)(t)+sizeof(TableBlockStorageElem)+k)=0;
mem = new TableBlockStorageElem*[block_size];
for(i=0;i<block_size;i++)
{
mem[i]=(TableBlockStorageElem*)malloc(full_size);
}
if(file==NULL)
{
return 1;
}
else
{
for(i=0;i<block_num;i++)
{
fseek(file,i*block_size*(full_size),0);
fread(t,(full_size),1,file);
if(t->count>=0)
{
cur_block=i;
break;
}
}
fseek(file,(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;
}
}
return 0;
}
int TableBlockStorage::AddRow(char* key, char* value) int TableBlockStorage::AddRow(char* key, char* value)
{ {
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(sizeof(TableBlockStorageElem)+inf_size); int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(full_size);
int i=0,pos=-1,empty=-1,k,j; int i=0,pos=-1,empty=-1,k,j;
if(file!=NULL) if(file!=NULL)
{ {
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0);
if(max==lim-1) if(max==lim-1)
{ {
if((cur_block+2)*block_size<size) if((cur_block+2)*block_size<=size)
{ {
max=-1; max=-1;
j=0; j=0;
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fseek(file,(cur_block*block_size+i)*(sizeof(TableBlockStorageElem)+inf_size),0); if(mem[i]->count>=0)
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file);
if(tbl->count>=0)
{ {
tbl->count=++max; mem[i]->count=++max;
fseek(file,((cur_block+1)*block_size+j)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,((cur_block+1)*block_size+j)*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[i],(full_size),1,file);
j++; j++;
} }
} }
fseek(file,((cur_block+1)*block_size+j)*(sizeof(TableBlockStorageElem)+inf_size),0); /*fseek(file,((cur_block+1)*block_size+j)*(full_size),0);
tbl->count=++max; mem[j]->count=++max;
strcpy(tbl->key,key); for(k=0;k<k_size;k++)
*((char*)mem[j]+sizeof(TableBlockStorageElem)+k)=*(key+k);
for(k=0;k<inf_size;k++) for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableBlockStorageElem)+k)=*(value+k); *((char*)mem[j]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[j],(sizeof(TableBlockStorageElem)+inf_size),1,file);*/
tbl->count=-5; tbl->count=-5;
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,cur_block*block_size*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(tbl,(full_size),1,file);
cur_block++; cur_block++;
return 0; //return 0;
} }
} }
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); if((*((char*)mem[i]+sizeof(TableBlockStorageElem))!=0)&&(mem[i]>=0))
if((tbl->key[0]!=0)&&(tbl->count>=0)) if(KeyCompare((char*)mem[i],key,k_size))
if(!strcmp(tbl->key,key))
pos = i; pos = i;
if((tbl->count<0)&&(empty<0)) empty=i; if((mem[i]->count<0)&&(empty<0)) empty=i;
} }
if(pos>=0) if(pos>=0)
{ {
fseek(file,(cur_block*block_size+pos)*(sizeof(TableBlockStorageElem)+inf_size),0); mem[pos]->count=++max;
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file);
tbl->count=++max;
for(k=0;k<inf_size;k++) for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableBlockStorageElem)+k)=*(value+k); *((char*)mem[pos]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fseek(file,(cur_block*block_size+pos)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,(cur_block*block_size+pos)*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[pos],(full_size),1,file);
return 0; return 0;
} }
fseek(file,(cur_block*block_size+empty)*(sizeof(TableBlockStorageElem)+inf_size),0); mem[empty]->count=++max;
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); for(k=0;k<k_size;k++)
tbl->count=++max; *((char*)mem[empty]+sizeof(TableBlockStorageElem)+k)=*(key+k);
strcpy(tbl->key,key);
for(k=0;k<inf_size;k++) for(k=0;k<inf_size;k++)
*((char*)(tbl)+sizeof(TableBlockStorageElem)+k)=*(value+k); *((char*)mem[empty]+sizeof(TableBlockStorageElem)+k_size+k)=*(value+k);
fseek(file,(cur_block*block_size+empty)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,(cur_block*block_size+empty)*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[empty],(full_size),1,file);
return 0; return 0;
} }
return 1; return 1;
...@@ -156,46 +229,42 @@ int TableBlockStorage::AddRow(char* key, char* value) ...@@ -156,46 +229,42 @@ int TableBlockStorage::AddRow(char* key, char* value)
int TableBlockStorage::DelRow(char* key) int TableBlockStorage::DelRow(char* key)
{ {
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(sizeof(TableBlockStorageElem)+inf_size); int full_size = sizeof(TableBlockStorageElem)+k_size+inf_size;
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(full_size);
int i,j; int i,j;
if(file!=NULL) if(file!=NULL)
{ {
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0);
if(max==lim-1) if(max==lim-1)
{ {
if((cur_block+2)*block_size<size) if((cur_block+2)*block_size<=size)
{ {
max=-1; max=-1;
j=0; j=0;
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fseek(file,(cur_block*block_size+i)*(sizeof(TableBlockStorageElem)+inf_size),0); if(mem[i]->count>=0)
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file);
if(tbl->count>=0)
{ {
tbl->count=++max; mem[i]->count=++max;
fseek(file,((cur_block+1)*block_size+j)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,((cur_block+1)*block_size+j)*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[i],(full_size),1,file);
j++; j++;
} }
} }
tbl->count=-5; tbl->count=-5;
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,cur_block*block_size*(full_size),0);
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(tbl,(full_size),1,file);
cur_block++; cur_block++;
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0);
} }
} }
for(i=0;i<block_size;i++) for(i=0;i<block_size;i++)
{ {
fread(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); if((*((char*)mem[i]+sizeof(TableBlockStorageElem))!=0)&&(mem[i]>=0))
if((tbl->key[0]!=0)&&(tbl->count>=0)) if(KeyCompare((char*)mem[i],key,k_size))
if(!strcmp(tbl->key,key))
{ {
fseek(file,(cur_block*block_size+i)*(sizeof(TableBlockStorageElem)+inf_size),0); fseek(file,(cur_block*block_size+i)*(full_size),0);
tbl->count=++max; mem[i]->count=++max;
tbl->key[0]=0; *((char*)mem[i]+sizeof(TableBlockStorageElem))=0;
fwrite(tbl,(sizeof(TableBlockStorageElem)+inf_size),1,file); fwrite(mem[i],(full_size),1,file);
return 0; return 0;
} }
} }
...@@ -205,19 +274,18 @@ int TableBlockStorage::DelRow(char* key) ...@@ -205,19 +274,18 @@ int TableBlockStorage::DelRow(char* key)
char* TableBlockStorage::FindKeyValue(char* key, char* val) char* TableBlockStorage::FindKeyValue(char* key, char* val)
{ {
TableBlockStorageElem *tbl = (TableBlockStorageElem*)malloc(sizeof(TableBlockStorageElem)+inf_size);
int i,k; int i,k;
if(file!=NULL) if(file!=NULL)
{ {
fseek(file,cur_block*block_size*(sizeof(TableBlockStorageElem)+inf_size),0); //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,(sizeof(TableBlockStorageElem)+inf_size),1,file); //fread(tbl,(full_size),1,file);
if((tbl->key[0]!=0)&&(tbl->count>=0)) if((*((char*)mem[i]+sizeof(TableBlockStorageElem))!=0)&&(mem[i]>=0))
if(!strcmp(tbl->key,key)) if(KeyCompare((char*)mem[i],key,k_size))
{ {
for(k=0;k<inf_size;k++) for(k=0;k<inf_size;k++)
*(val+k)=*((char*)(tbl)+sizeof(TableBlockStorageElem)+k); *(val+k)=*((char*)mem[i]+sizeof(TableBlockStorageElem)+k_size+k);
return val; return val;
} }
} }
......
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