ulint process_ibrec(page_t *page, rec_t *rec, table_def_t *table, ulint *offsets) { ulint data_size; int i; // Print table name if (debug) { printf("Processing record %p from table '%s'\n", rec, table->name); rec_print_new(stdout, rec, offsets); } else { printf("%s\t", table->name); } data_size = rec_offs_data_size(offsets); for(i = 0; i < table->fields_count; i++) { ulint len; byte *field = rec_get_nth_field(rec, offsets, i, &len); if (table->fields[i].type == FT_INTERNAL) continue; if (debug) printf("Field #%i @ %p: length %lu, value: ", i, field, len); if (len == UNIV_SQL_NULL) { printf("NULL"); } else { print_field_value(field, len, &(table->fields[i])); } if (i < table->fields_count - 1) printf("\t"); if (debug) printf("\n"); } printf("\n"); return data_size; // point to the next possible record's start }
inline ibool check_for_a_record(page_t *page, rec_t *rec, table_def_t *table, ulint *offsets) { ulint offset, data_size; int flag; // Check if given origin is valid offset = rec - page; if (offset < record_extra_bytes + table->min_rec_header_len) return FALSE; if (debug) printf("ORIGIN=OK "); flag = rec_get_deleted_flag(rec, page_is_comp(page)); if (debug) printf("DELETED=0x%X ", flag); // Skip non-deleted records if (deleted_records_only && flag == 0) return FALSE; // Skip deleted records if (undeleted_records_only && flag != 0) return FALSE; // Get field offsets for current table if (process_compact && !ibrec_init_offsets_new(page, rec, table, offsets)) return FALSE; if (process_redundant && !ibrec_init_offsets_old(page, rec, table, offsets)) return FALSE; if (debug) printf("OFFSETS=OK "); // Check the record's data size data_size = rec_offs_data_size(offsets); if (data_size > table->data_max_size) { if (debug) printf("DATA_SIZE=FAIL(%lu > %ld) ", (long int)data_size, (long int)table->data_max_size); return FALSE; } if (data_size < table->data_min_size) { if (debug) printf("DATA_SIZE=FAIL(%lu < %lu) ", (long int)data_size, (long int)table->data_min_size); return FALSE; } if (debug) printf("DATA_SIZE=OK "); // Check fields sizes if (!check_fields_sizes(rec, table, offsets)) return FALSE; if (debug) printf("FIELD_SIZES=OK "); // This record could be valid and useful for us return TRUE; }