@@ -305,6 +305,86 @@ static void data_open_final(data_root_t *root) {
305305 zdb_verbose ("[+] data: active file: %s\n" , root -> datafile );
306306}
307307
308+ data_raw_t data_raw_get_real (int fd , off_t offset ) {
309+ data_raw_t raw ;
310+
311+ memset (& raw , 0x00 , sizeof (raw ));
312+
313+ // moving to the header offset
314+ lseek (fd , offset , SEEK_SET );
315+
316+ // 1. fetch fixed header object
317+ // 2. that fixed header first byte contains id length
318+ // 3. fetch id with correct length (from 2)
319+ // 4. fetch payload with correct length (from 2)
320+ // 5. TODO check checksum ?
321+
322+ zdb_debug ("[+] data: raw: fetching header from offset\n" );
323+ if (read (fd , & raw .header , sizeof (data_entry_header_t )) != sizeof (data_entry_header_t )) {
324+ zdb_warnp ("data: raw: incorrect data header read" );
325+ return raw ;
326+ }
327+
328+ if (raw .header .datalength > ZDB_DATA_MAX_PAYLOAD ) {
329+ zdb_verbose ("[-] data: raw: datalength from header too large\n" );
330+ return raw ;
331+ }
332+
333+ zdb_debug ("[+] data: raw: fetching id from header offset\n" );
334+ if (!(raw .id = malloc (raw .header .idlength ))) {
335+ zdb_warnp ("data: raw: id: malloc" );
336+ return raw ;
337+ }
338+
339+ if (read (fd , raw .id , raw .header .idlength ) != raw .header .idlength ) {
340+ zdb_warnp ("data: raw: incorrect id read" );
341+ return raw ;
342+ }
343+
344+ if (raw .header .flags & DATA_ENTRY_DELETED ) {
345+ zdb_debug ("[+] data: raw: entry deleted\n" );
346+ return raw ;
347+ }
348+
349+ zdb_debug ("[+] data: raw: fetching payload from header offset\n" );
350+ if (!(raw .payload .buffer = malloc (raw .header .datalength ))) {
351+ zdb_warnp ("data: raw: payload: malloc" );
352+ return raw ;
353+ }
354+
355+ if (read (fd , raw .payload .buffer , raw .header .datalength ) != raw .header .datalength ) {
356+ zdb_warnp ("data: raw: incorrect payload read" );
357+ return raw ;
358+ }
359+
360+ // this validate return object to be valid
361+ raw .payload .length = raw .header .datalength ;
362+
363+ return raw ;
364+ }
365+
366+ // fetch data full object from specific offset
367+ data_raw_t data_raw_get (data_root_t * root , fileid_t dataid , off_t offset ) {
368+ int fd ;
369+ data_raw_t raw ;
370+
371+ // initialize everything
372+ memset (& raw , 0x00 , sizeof (raw ));
373+
374+ zdb_debug ("[+] data: raw request: id %u, offset %lu\n" , dataid , offset );
375+
376+ // acquire data id fd
377+ if ((fd = data_grab_dataid (root , dataid )) < 0 )
378+ return raw ;
379+
380+ raw = data_raw_get_real (fd , offset );
381+
382+ // release dataid
383+ data_release_dataid (root , dataid , fd );
384+
385+ return raw ;
386+ }
387+
308388// jumping to the next id close the current data file
309389// and open the next id file, it will create the new file
310390size_t data_jump_next (data_root_t * root , fileid_t newid ) {
@@ -547,7 +627,7 @@ int data_entry_is_deleted(data_entry_header_t *entry) {
547627// was deleted
548628// this is needed in order to rebuild an index from data file and
549629// for compaction process
550- int data_delete (data_root_t * root , void * id , uint8_t idlength ) {
630+ int data_delete (data_root_t * root , void * id , uint8_t idlength , time_t timestamp ) {
551631 unsigned char * empty = (unsigned char * ) "" ;
552632
553633 data_request_t dreq = {
@@ -557,6 +637,7 @@ int data_delete(data_root_t *root, void *id, uint8_t idlength) {
557637 .idlength = idlength ,
558638 .flags = DATA_ENTRY_DELETED ,
559639 .crc = 0 ,
640+ .timestamp = timestamp ,
560641 };
561642
562643 zdb_debug ("[+] data: delete: insert empty flagged data\n" );
0 commit comments