6467Fermer6469
robinHoodLe 11/02/2012 à 23:57
merde K&R pour moi c'était simplement une manière de mettre des accolades (manière ne me convenant pas cheeky donc je ne l'ai jamais lu)

et voila vous allez encore me traiter d’hérétique embarrassed

la concrètement je fait un utilitaire pouvant trifouiller les dump redis,
redis sauve l'intégralité des clef dans un fichier unique, donc on à tout ou rien :/
mon but est d'avoir de quoi refaire des fichier dump via des requêtes perso, et également dégager certaines clef des dump style dans mon cas le caches des pages de mes sites

dans un premier temps je bosse avec un format de fichier perso, dumpant moi même la base mais plus tard se sera depuis les vrai dump de redis, mais aucune doc n'existe faut reverser..

bref pour répondre vraiment à ta question, étant old school et hérétique je bosse à l'ancienne, juste de la mémoire et des pointeur
u32 nbkey = keys->elements; if(!nbkey){ printf("not any result."); return 1; } printf("%u keys found.",nbkey); char * header = (char*)malloc(nbkey*2056); // 2ko max for key name memset(header,0,nbkey*2056); u32 * p = (u32*)header; *p++ = 0x42424242; // magic *p++ = nbkey; // nbkeys u32 *koffset = p; p += nbkey; u16 *knamesz = (u16*)p; // keys name size u16 *ktype = &(knamesz[nbkey]); // keys type char *knames = (char*)&(ktype[nbkey]); char *keybuf = knames; for(u32 n=0;n<nbkey;n++) { koffset[n] = 0; // clear offset for now knamesz[n] = (u16)(keys->element[n]->len + 1); // write key name length (add the \0) strcpy(keybuf,keys->element[n]->str); // copie name, fill with 0 redisAppendCommand(c,"TYPE %s",keys->element[n]->str); // pipeline get key type //printf("\nkey %u : %s",n,keybuf); keybuf += knamesz[n]; } u32 diff = (keybuf-header); if(diff%4) diff += 4-(diff%4); koffset[0] = diff;

donc concrètement, ici je compte le nombre d'octet entre le début de mon fichier (en mémoire) et la fin de l'header, pour écrire tout ca dans une zone mémoire destiné a recueillir les offset depuis le début du fichier ou se trouve les données de chaque clefs de la base

en gros juste une soustraction de char*