tags:

views:

69

answers:

1

I'm doing a school project about maintaining a personal Database. but my tutors didn't explained the practice, they explained the theory(Data structures and such) not how to code in c.

We where given a certain amount of tables, indexes and consults they wanted to solved and we are to program the data structures that run behind.

I chose a hash-table to keep the data and b+trees for the secondary indexes.


Well the b+ trees I can keep them in RAM but the hash table I must be able to maintain it in the hard disk. So I'm using the fwrite() function to keep it in disk. But I found a problem. I don't know how to write the entire bucket into disk with a single fwrite instruction (This is one of the few requirements I was given).


the code I have for initializing the structure

FILE * file;
file = fopen ( "HistoriasClinicas.bin" , "wb" );
for(i=0;i<amountOfBuckets;i++)
    fwrite (Bucket , getpagesize() ,1 , file );
fclose (file);

And this are my structures

typedef struct Hist_clin_s{
struct
{
    char codPaciente[7];
} X;
struct
{
    char codMedico[7];
    int fecha;
    char Observacion[151];
} Y;
int ptro;
}Hist_Clin;



typedef struct balde_s{
Hist_Clin *hcs;
char *waste; //Waste to make the bucket reach the page size.
}Bucket;

The problem that I'm experiencing is that when I try to write a bucket. the bucket size is only 8(cos of the 2 pointers) but I can't make those two pointer vectors[] because I have to calculate those values once the program has already started. And for what I read, there isn't a way to resize vectors, because they change place in the memory.

The only solution I can think of is to load the whole bucket into a char array(kind of a buffer) and then write it to memory.

Any ideas?

+3  A: 

What you're doing is generally called serialization, if that helps you Google more info.

Now, in this case, your first struct:

typedef struct balde_s{
    Hist_Clin *hcs;
    char *waste; //Waste to make the bucket reach the page size.
}Bucket;

Is made up of 2 pointers. Pointers won't necessarily be valid over a save-load cycle (you can usually count on them not to be), so you don't need to save those. Instead, you'll want to write the contents of those two structs to the file. Luckily, you almost made this easy for yourself. You know the address (from the pointer), so just use:

fwrite( (void*)something.hcs, sizeof(Hist_Clin), 1, file);

which will write n bytes (the size of one record), starting at the given pointer.

peachykeen
and what can i do about the waste?Because the entire idea is to write a whole page(bucket in this case) to disk.
maty_nz
I'm not sure what you mean. The code example I gave will write one Hist_Clin structure and all the data it contains to file. No data before or after will be written, so it's a relatively clean, waste-free method. You may have to resort to paging the file or using some kind of file-as-memory function to access the data. Without seeing a more complete example, I'm not sure how it would need done.
peachykeen
Isn't struct reserved? ;)
Nyan
@Nyan: Fixed. ;)
peachykeen
exactly. I was Taught that to minimize the access to disk I had to write an entire page(I think that is called block, not sure about the translation) to disk at once, the waste I show there is how much am i Missing to fill a page, and it only contains garbage.
maty_nz
If you know you have more than one Hist_Clin in a row in memory, than you could just start from the position of the first and multiply the sizeof by the count. That would dump an entire group at once.My method was writing a block (if you take Hist_Clin as a block) to disk. Writing an entire memory page seems a bit much.However, the file may be buffered. I'm not positive as far as FILEs go, but I know fstreams are buffered in memory and only occasionally written to disk. If you can create a memory buffer for writing or the file is already buffered, that would minimize disk reads/writes.
peachykeen
ok, thanks a lot, I finally decided for serialization. I'm using a char * buffer. to store everything and the write it.
maty_nz