if(dl->tgt_check && !set_chunk_valid(dl))
return false;
- for(zckChunk *chk = dl->range->index.first; chk; chk = chk->next) {
- if(dl->dl_chunk_data == chk->start) {
- int count = 0;
- for(zckChunk *tgt_chk = dl->zck->index.first; tgt_chk;
- tgt_chk = tgt_chk->next, count++) {
- if(tgt_chk->valid == 1)
- continue;
- if(chk->comp_length == tgt_chk->comp_length &&
- memcmp(chk->digest, tgt_chk->digest,
- chk->digest_size) == 0) {
- dl->tgt_check = tgt_chk;
- dl->tgt_number = count;
- if(!hash_init(dl->zck, &(dl->zck->check_chunk_hash),
- &(dl->zck->chunk_hash_type)))
- return 0;
- dl->write_in_chunk = chk->comp_length;
- if(!seek_data(dl->zck,
- dl->zck->data_offset + tgt_chk->start,
- SEEK_SET))
- return 0;
- chk = NULL;
- tgt_chk = NULL;
- break;
- }
- }
- }
- if(!chk)
+ if(dl->range->index.current == NULL)
+ dl->range->index.current = dl->range->index.first;
+ for(zckChunk *chk = dl->range->index.current; chk; chk = chk->next) {
+ if(dl->dl_chunk_data != chk->start)
+ continue;
+
+ int count = 0;
+ zckChunk *tgt_chk = chk->src;
+ if(tgt_chk->valid == 1)
+ continue;
+ if(chk->comp_length == tgt_chk->comp_length &&
+ memcmp(chk->digest, tgt_chk->digest,
+ chk->digest_size) == 0) {
+ dl->tgt_check = tgt_chk;
+ dl->tgt_number = count;
+ if(!hash_init(dl->zck, &(dl->zck->check_chunk_hash),
+ &(dl->zck->chunk_hash_type)))
+ return 0;
+ dl->write_in_chunk = chk->comp_length;
+ if(!seek_data(dl->zck,
+ dl->zck->data_offset + tgt_chk->start,
+ SEEK_SET))
+ return 0;
+ dl->range->index.current = chk->next;
+ chk = NULL;
+ tgt_chk = NULL;
break;
+ }
}
}
int wb2 = 0;
}
if(add_index)
if(!index_new_chunk(zck, &(info->index), idx->digest, idx->digest_size,
- end-start+1, end-start+1, false)) {
+ end-start+1, end-start+1, idx, false)) {
free(new);
return NULL;
}
if(index->first == NULL) {
index->first = item;
} else {
- zckChunk *tmp = index->first;
- while(tmp->next)
- tmp = tmp->next;
- tmp->next = item;
+ index->last->next = item;
}
+ index->last = item;
index->count += 1;
index->length += item->comp_length;
return true;
return true;
}
-bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest, int digest_size,
- size_t comp_size, size_t orig_size, bool finished) {
+bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest,
+ int digest_size, size_t comp_size, size_t orig_size,
+ zckChunk *src, bool finished) {
VALIDATE_BOOL(zck);
if(index == NULL) {
index->digest_size = digest_size;
chk->comp_length = comp_size;
chk->length = orig_size;
+ chk->src = src;
return finish_chunk(index, chk, digest, finished, zck);
}
size_t comp_length;
size_t length;
struct zckChunk *next;
+ struct zckChunk *src;
zckCtx *zck;
UT_hash_handle hh;
} zckChunk;
int hash_type;
size_t digest_size;
zckChunk *first;
+ zckChunk *last;
+ zckChunk *current;
zckChunk *ht;
} zckIndex;
bool index_create(zckCtx *zck)
__attribute__ ((warn_unused_result));
bool index_new_chunk(zckCtx *zck, zckIndex *index, char *digest, int digest_size,
- size_t comp_size, size_t orig_size, bool valid)
+ size_t comp_size, size_t orig_size, zckChunk *src, bool valid)
__attribute__ ((warn_unused_result));
bool index_add_to_chunk(zckCtx *zck, char *data, size_t comp_size,
size_t orig_size)