inline int initBlockEntry(BlockEntry* blockEntry) { initSlice(&blockEntry->key_,20); initSlice(&blockEntry->value_,20); return 1; }
bool CuttingPhotos::initWithPhoto(const char* photo,unsigned int rows,unsigned int columns) { bool result;//初始化是否成功 if (Layer::init()) { _rows=rows; _columns=columns; if (initSlice(photo)) { initTouchEventlistener(); restart(); result=true; }else{ result=false; } }else{ result =false; } return result; }
void showBlockData(const Block* block) { size_t i; size_t offset = 0; Slice lastKey; BlockEntry blockEntry; initBlockEntry(&blockEntry); initSlice(&lastKey,20); do{ readBlockEntry(block,&blockEntry,&offset,&lastKey); showBlockEntry(&blockEntry); }while(offset < block->restart_offset); freeBlockEntry(&blockEntry); freeSlice(&lastKey); }
int segmentFix(Segment* segment,const Block* block,const Slice* key) { uint32_t low,mid,high; int result = -1; Slice midkey; initSlice(&midkey,20); low = 0; high = block->restartNum-1; while(low < high){ mid = low + high; mid = mid >> 1; printf("slow=%u,high=%u,mid=%u\n",low,high,mid); getBlockEntryKey(block->data_+block->restart_[mid],&midkey); result = compareKey(midkey,*key); if(result == 1){ high = mid; }else if(result == 2){ low = mid+1; mid = low; }else{ high = mid; low = mid; } } if(mid == 0){ printf("Waring: the first key of the block is bigger than key.\n"); } if(mid != 0){ mid--; } if(mid == (block->restartNum-1)){ segment->start_ = block->restart_[mid]; segment->size_ = block->restart_offset - block->restart_[mid]; }else{ segment->start_ = block->restart_[mid]; segment->size_ = block->restart_[mid+1] - block->restart_[mid]; } printf("Fixed finished!\nmid = %u,start_ = %u,size_ = %u\n",mid,segment->start_,segment->size_); midkey.size_ = 0; getBlockEntryKey(block->data_+segment->start_,&midkey); showKey(&midkey); printf("FIXFIX\n"); freeSlice(&midkey); return 1; }
/* * 读取sstable文件的Footer */ int readFooter(sequentialFile* psFile,Footer* pfooter) { unsigned char footerSpace[48]; long filesize; Slice r; initSlice(&r,20); int i; filesize = getFilesize(psFile); readSFile(48,filesize-48,psFile,footerSpace); setSlice(&r,footerSpace,48); decodeFooter(pfooter,&r); for(i = 0;i < 48;i++){ printXchar(r.data_[i]); } freeSlice(&r); printf("file size = %ld,footersize = %zd\n",filesize,r.size_); return 0; }
void showBlokRestart(const Block* block) { size_t i; size_t offset = 0; Slice lastKey; BlockEntry blockEntry; initBlockEntry(&blockEntry); initSlice(&lastKey,20); for(i = 0;i < block->restartNum;i++){ offset = 0; lastKey.size_ = 0; offset = block->restart_[i]; readBlockEntry(block,&blockEntry,&offset,&lastKey); showIndexBlockEntry(&blockEntry); } freeBlockEntry(&blockEntry); freeSlice(&lastKey); }
/* 成功则返回在segment中的偏移量,失败则返回1,应为offset不可能等于1 */ uint32_t scanSegment(const Block* block,const Segment* segment,DBhandle* dbhandle) { Slice lastKey; BlockEntry blockEntry; size_t tmp; size_t result; uint32_t offset = 0; unsigned char* b = block->data_ + segment->start_; printf("scanSegment:start_ = %u\n",segment->start_); initSlice(&lastKey,20); lastKey.size_ = 0; initBlockEntry(&blockEntry); while(offset < segment->size_){ tmp = decodeBlockEntry(&blockEntry,b+offset,&lastKey); //showBlockEntry(&blockEntry); printf("keysize = %zd,valuesize = %zd\n",blockEntry.key_.size_,blockEntry.value_.size_); //break; //showBlockEntry(&blockEntry); //showIndexBlockEntry(&blockEntry); result = compareKey(blockEntry.key_,dbhandle->key_); if(0 == result){ cpySlice(&dbhandle->value_,&blockEntry.value_); freeSlice(&lastKey); freeBlockEntry(&blockEntry); return offset; }else if(1 == result){ printf("Waring:Not Found!\n"); freeSlice(&lastKey); freeBlockEntry(&blockEntry); return 1; } offset += tmp; } freeSlice(&lastKey); freeBlockEntry(&blockEntry); return 1; }
/* * 批量读取block数据 */ int readAllBlock(sequentialFile* psFile,Block* blockArray,const Block* dataIndexBlock) { printf("Read All Block.\n"); //printf("%s(%d)-<%s>: ",__FILE__, __LINE__, __FUNCTION__); uint32_t i = 0; BlockHandle blockHandle; BlockEntry blockEntry; unsigned char* data; Slice lastKey; initSlice(&lastKey,20); initBlockEntry(&blockEntry); for(i = 0;i < dataIndexBlock->restartNum;i++){ data =(unsigned char*) (dataIndexBlock->data_+dataIndexBlock->restart_[i]); decodeBlockEntry(&blockEntry,data,&lastKey); decodeBlockHandle(&blockHandle,&blockEntry.value_); readBlock(psFile,&blockArray[i],blockHandle); //showBlock(&blockArray[i]); } freeBlockEntry(&blockEntry); freeSlice(&lastKey); return 0; }
void initEntrykey(Entrykey* entrykey){ entrykey->sharedkeylen = 0; entrykey->entrysize = 0; initSlice(&entrykey->nosharedkey,20); }
int main() { FILE* fp; size_t i = 0; size_t offset; fp = fopen("src.ldb","r"); if(fp == NULL){ printf("error!\n"); return 1; } unsigned char a[] = "src.ldb"; unsigned char b[] = "1-959-250-4279"; //"1-114-560-9305"; Slice filename; Slice lastKey;/* 用于存储最后一次读取到的key */ Slice srckey; /* 存储要查找、删除、修改、添加的key */ DBhandle dbhandle; Footer footer; Block dataIndexBlock; Block* blockArray; BlockEntry blockEntry; initSlice(&filename,10); initSlice(&lastKey,20); initBlockEntry(&blockEntry); initDBhandle(&dbhandle); setSlice(&dbhandle.key_,b,22); setSlice(&filename,a,strlen((char*)a)); sequentialFile* psFile = (sequentialFile*)malloc(sizeof(sequentialFile)); setSequentialFile(psFile,fp,&filename); readFooter(psFile,&footer); showFooter(&footer); /* 读取data index block,存储在dataBlock中 */ readBlock(psFile,&dataIndexBlock,footer.dataIndexHandle); blockArray = (Block*)malloc(sizeof(Block)*dataIndexBlock.restartNum); if(blockArray == NULL){ printf("error:blockArray is NULL.\n"); return 1; } readAllBlock(psFile,blockArray,&dataIndexBlock); /*设置操作为Read*/ dbhandle.type = 1; dbcmd(blockArray,&dataIndexBlock,&dbhandle); /* * 至此,所有的block都已经读取到内存中,data block的内容存储在blockarray中, * data block的索引信息存储在dataIndexBlock中 */ /* * */ //showBlokRestart(&dataIndexBlock); for(i = 0;i < dataIndexBlock.restartNum;i++){ //showBlockData(&(blockArray[i])); } freeBlockEntry(&blockEntry); freeDBhandle(&dbhandle); fclose(fp); printf("Hello World!\n"); return 0; }