这个文件我在今天分析学习的时候,一直有种似懂非懂的感觉,代码量700+的代码,最后开放给系统的就是一个process()方法。这里说的说的数据库检测,是针对key的检测,会用到,下面提到的结构体:
/* Data type to hold opcode with optional key name an success status */
/* 用于key的检测时使用,后续检测操作都用到了entry结构体 */
typedef struct {
//key的名字
char* key;
//类型
int type;
//是否是成功状态
char success;
} entry;
后续所涉及到的很多API都是与这个结构体相关,此代码最终检测的其实是一个叫dump.rdb的文件,在检测的后面还会加上循环冗余校验CRC64。下面亮出API:
int checkType(unsigned char t) /* 每当添加一个新的obj类型时,都要检测这个类型是否合理 */
int readBytes(void *target, long num) /* 在当前文件偏移量位置往后读取num个字节位置 */
int processHeader(void) /* 读取快照文件的头部,检测头部名称或版本号是否正确 */
int loadType(entry *e) /* 为entry赋上obj的Type */
int peekType() /* 弹出版本号 */
int processTime(int type) /* 去除用来表示时间的字节 */
uint32_t loadLength(int *isencoded) /* 分type读取长度 */
char *loadIntegerObject(int enctype) /* 根据当前整型的编码方式,获取数值,以字符形式返回 */
char* loadLzfStringObject() /* 获得解压后的字符串 */
char* loadStringObject() /* 获取当前文件信息字符串对象 */
int processStringObject(char** store) /* 将字符串对象赋给所传入的参数 */
double* loadDoubleValue() /* 文件中读取double类型值 */
int processDoubleValue(double** store) /* 对double类型进行赋予给参数 */
int loadPair(entry *e) /* 读取键值对 */
entry loadEntry() /* 获取entry的key结构体 */
void printCentered(int indent, int width, char* body) /* 输出界面对称的信息 */
void printValid(uint64_t ops, uint64_t bytes) /* 输出有效信息 */
void printSkipped(uint64_t bytes, uint64_t offset) /* 输出Skipped跳过bytes字节信息 */
void printErrorStack(entry *e) /* 输出错误栈的信息 */
void process(void) /* process方法是执行检测的主要方法 */
方法里面好多loadXXX()方法,这几个load方法的确比较有用,在这个检测文件中,编写者又很人性化的构造了error的结构体,用于模拟错误信息栈的输出。
/* Hold a stack of errors */
/* 错误信息结构体 */
typedef struct {
//具体的错误信息字符串
char error[16][1024];
//内部偏移量
size_t offset[16];
//错误信息等级
size_t level;
} errors_t;
static errors_t errors;
不同的level等级对应不同的出错信息。在API里有个比较关键的方法