~twindb-dev/undrop-for-innodb/trunk

« back to all changes in this revision

Viewing changes to c_parser.c

  • Committer: Aleksandr Kuzminsky
  • Date: 2014-10-19 02:53:31 UTC
  • mfrom: (23.1.2 undrop-for-innodb)
  • Revision ID: aleks@twindb.com-20141019025331-67xmdj87vs4uimkx
-l option is added to output LOAD DATA instruction in file; fixed compiler warnings; fixed parser bugs related to size of multibyte strings

Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
int use_filter_id = 0;
90
90
 
91
91
FILE* f_result;
 
92
FILE* f_sql;
92
93
 
93
94
extern int load_table(char*);
94
95
 
95
96
inline void error(char *msg) {
96
 
    printf("Error: %s\n", msg);
97
 
    exit(1);
 
97
  fprintf(stderr, "Error: %s\n", msg);
 
98
  exit(1);
98
99
}
99
100
 
100
101
 
612
613
        }
613
614
        fprintf(f_result, ", Records list: %s", is_page_valid? "Valid": "Invalid");
614
615
        expected_records_inheader = mach_read_from_2(page + PAGE_HEADER + PAGE_N_RECS);
615
 
        fprintf(f_result, ", Expected records: (%u %lu)", expected_records, expected_records_inheader);
 
616
        fprintf(f_result, ", Expected records: (%u %u)", expected_records, expected_records_inheader);
616
617
        fprintf(f_result, "\n");
617
618
        if (debug) printf("Starting offset: %lu (%lX). Checking %d table definitions.\n", offset, offset, table_definitions_cnt);
618
619
        
692
693
        while ((read_bytes = read(fn, page, UNIV_PAGE_SIZE)) == UNIV_PAGE_SIZE) {
693
694
        pos = lseek(fn, 0, SEEK_CUR);
694
695
        
695
 
        if (pos % (UNIV_PAGE_SIZE * 10) == 0) {
696
 
            fprintf(stderr, "-- %.2f%% done\n", 100.0 * pos / st.st_size);
 
696
        if (pos % (UNIV_PAGE_SIZE * 512) == 0) {
 
697
            fprintf(f_sql, "-- %.2f%% done\n", 100.0 * pos / st.st_size);
697
698
        }
698
699
 
699
700
            if (deleted_pages_only) {
746
747
          "    -f <InnoDB page(s)> -- InnoDB page or directory with pages(all pages should have same index_id)\n"
747
748
          "    -t <table.sql> -- CREATE statement of a table\n"
748
749
          "    -o <file> -- Save dump in this file. Otherwise print to stdout\n"
 
750
          "    -l <file> -- Save SQL statements in this file. Otherwise print to stderr\n"
749
751
          "    -h  -- Print this help\n"
750
752
          "    -d  -- Process only those pages which potentially could have deleted records (default = NO)\n"
751
753
          "    -D  -- Recover deleted rows only (default = NO)\n"
770
772
        struct stat st;
771
773
        char src[256] = "";
772
774
 
773
 
        char buffer[16*1024];
 
775
        char buffer[BUFSIZ];
774
776
        setvbuf(stdout, buffer, _IOFBF, sizeof(buffer));
775
777
 
776
778
        f_result = stdout;
 
779
        f_sql = stderr;
777
780
        char result_file[1024];
778
 
        while ((ch = getopt(argc, argv, "t:456hdDUVf:T:b:p:o:i:")) != -1) {
 
781
        char sql_file[1024];
 
782
        while ((ch = getopt(argc, argv, "t:456hdDUVf:T:b:p:o:i:l:")) != -1) {
779
783
                switch (ch) {
780
784
                        case 'd':
781
785
                                deleted_pages_only = 1;
798
802
                                strncpy(path_ibdata, optarg, sizeof(path_ibdata));
799
803
                external_in_ibdata = 1;
800
804
                                break;
 
805
            case 'l':
 
806
                strncpy(sql_file, optarg, sizeof(sql_file));
 
807
                if(NULL == (f_sql = fopen(sql_file, "w"))){
 
808
                    fprintf(stderr, "Can't open file %s for writing\n", sql_file);
 
809
                    exit(-1);
 
810
                }
 
811
                break;
801
812
                        case 't':
802
813
                if(load_table(optarg) != 0){
803
814
                    fprintf(stderr, "Failed to parse table structure\n");
882
893
                close(fn);
883
894
                }
884
895
        table_def_t *table = &(table_definitions[0]);
885
 
        fprintf(stderr, "SET FOREIGN_KEY_CHECKS=0;\n");
886
 
        fprintf(stderr, "LOAD DATA LOCAL INFILE '");
 
896
        fprintf(f_sql, "SET FOREIGN_KEY_CHECKS=0;\n");
 
897
        fprintf(f_sql, "LOAD DATA LOCAL INFILE '");
887
898
        if(f_result == stdout){
888
 
                fprintf(stderr, "%s/dumps/%s/%s", getenv("PWD"), dump_prefix, table->name);
 
899
                fprintf(f_sql, "%s/dumps/%s/%s", getenv("PWD"), dump_prefix, table->name);
889
900
                }
890
901
        else{
891
 
                fprintf(stderr, "%s", result_file);
 
902
                fprintf(f_sql, "%s", result_file);
892
903
                }
893
 
        fprintf(stderr, "' REPLACE INTO TABLE `%s` FIELDS TERMINATED BY '\\t' OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY '%s\\t' ", table->name, table->name);
 
904
        fprintf(f_sql, "' REPLACE INTO TABLE `%s` FIELDS TERMINATED BY '\\t' OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY '%s\\t' ", table->name, table->name);
894
905
        int i = 0;
895
906
        int comma = 0;
896
907
        int has_set = 0;
897
 
        fprintf(stderr, "(");
 
908
        fprintf(f_sql, "(");
898
909
        for(i = 0; i < table->fields_count; i++) {
899
910
                if(table->fields[i].type == FT_INTERNAL) continue;
900
 
                if(comma) fprintf(stderr, ", ");
 
911
                if(comma) fprintf(f_sql, ", ");
901
912
                switch(table->fields[i].type){
902
913
                        case FT_BLOB:
903
914
                        case FT_BIN:
904
 
                                fprintf(stderr, "@var_%s", table->fields[i].name);
 
915
                                fprintf(f_sql, "@var_%s", table->fields[i].name);
905
916
                                has_set = 1;
906
917
                                break;
907
918
                        case FT_BIT:
908
 
                                fprintf(stderr, "@var_%s", table->fields[i].name);
 
919
                                fprintf(f_sql, "@var_%s", table->fields[i].name);
909
920
                                has_set = 1;
910
921
                                break;
911
922
                        default:
912
 
                                fprintf(stderr, "`%s`", table->fields[i].name);
 
923
                                fprintf(f_sql, "`%s`", table->fields[i].name);
913
924
                        }
914
925
                comma = 1;
915
926
                }
916
 
        fprintf(stderr, ")");
 
927
        fprintf(f_sql, ")");
917
928
        comma = 0;
918
929
        if(has_set){
919
 
                fprintf(stderr, "\nSET\n");
 
930
                fprintf(f_sql, "\nSET\n");
920
931
                for(i = 0; i < table->fields_count; i++) {
921
932
                        if(table->fields[i].type == FT_INTERNAL) continue;
922
933
                        switch(table->fields[i].type){
923
934
                                case FT_BLOB:
924
935
                                case FT_BIN:
925
 
                                        if(comma) fprintf(stderr, ",\n");
926
 
                                        fprintf(stderr, "    %s = UNHEX(@var_%s)", table->fields[i].name, table->fields[i].name);
 
936
                                        if(comma) fprintf(f_sql, ",\n");
 
937
                                        fprintf(f_sql, "    %s = UNHEX(@var_%s)", table->fields[i].name, table->fields[i].name);
927
938
                                        comma = 1;
928
939
                                        break;
929
940
                                case FT_BIT:
930
 
                                        if(comma) fprintf(stderr, ",\n");
931
 
                                        fprintf(stderr, "    %s = CAST(@var_%s AS UNSIGNED)", table->fields[i].name, table->fields[i].name);
 
941
                                        if(comma) fprintf(f_sql, ",\n");
 
942
                                        fprintf(f_sql, "    %s = CAST(@var_%s AS UNSIGNED)", table->fields[i].name, table->fields[i].name);
932
943
                                        comma = 1;
933
944
                                        break;
934
945
                                default: break;
935
946
                                }
936
947
                        }
937
948
                }
938
 
        fprintf(stderr, ";\n");
 
949
        fprintf(f_sql, ";\n");
939
950
        if (!process_compact && !process_redundant) {
940
 
        printf("Error: Please, specify what format your datafile in. Use -4 for mysql 4.1 and below and -5 for 5.X+\n");
941
 
        usage();
 
951
          fprintf(stderr,"Error: Please, specify what format your datafile in. Use -4 for mysql 4.1 and below and -5 for 5.X+\n");
 
952
          usage();
942
953
        }
943
954
        
944
955
        return 0;