Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <errno.h>
- int main(int argc, char * argv[])
- {
- FILE *myd_file;
- FILE *del_file;
- unsigned char *record=NULL;
- size_t reclength=0;
- unsigned long long offset=0;
- unsigned long long recnum=0;
- unsigned long long numdeleted=0;
- unsigned long long numpresent=0;
- if(argc != 4)
- {
- printf("usage: ./undeleter /path/to/original.MYD /path/to/recovered.MYD record_length\n");
- printf("example: to recover table history and place deleted records into a table called history_recovered, having record length of 42 (as shown in show table status:\n");
- printf("./undeleter /data/test/history.MYD /data/test/history_recovered.MYD 42\n\n");
- return 1;
- }
- myd_file=fopen(argv[1],"rb");
- if(NULL == myd_file)
- {
- printf("failed to open input table from file '%s', errno=%d\n",argv[1],errno);
- return 1;
- }
- del_file=fopen(argv[2],"wb");
- if(NULL == del_file)
- {
- printf("failed to open output table from file '%s', errno=%d\n",argv[2],errno);
- fclose(myd_file);
- return 1;
- }
- reclength=atoi(argv[3]);
- printf("allocating a block of memory for records, %lu bytes\n",reclength);
- record=(unsigned char*)calloc(reclength,1);
- if(NULL == record)
- {
- printf("failed to allocate memory for a single record block\n");
- fclose(myd_file);
- fclose(del_file);
- return 1;
- }
- printf("starting to read records\n");
- while(!feof(myd_file))
- {
- if(fread(record,reclength,1,myd_file) < 1)
- continue;
- if(record[0] == 0)
- {
- numdeleted++;
- record[0]=0xc0; //reset the delete flag
- printf("found deleted record at offset %lu\n",offset);
- if(fwrite(record,reclength,1,del_file) < 1)
- {
- printf("error trying to write record to '%s', errno=%d\n",argv[2],errno);
- }
- }
- else
- {
- numpresent++;
- }
- offset+=reclength;
- }
- fclose(myd_file);
- fclose(del_file);
- free(record);
- printf("-----------------\n");
- printf(" completed \n");
- printf("-----------------\n");
- printf("records copied into '%s': %lu\n",argv[2],numdeleted);
- printf("records present in '%s': %lu\n\n",argv[1],numpresent);
- printf("next steps:\n");
- printf("1. remove the MYI for '%s'\n",argv[2]);
- printf("2. make sure '%s' definition .frm is created without any unique or PK keys\n",argv[2]);
- printf("3. repair table <recovered table> use_frm\n");
- printf("\n\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement