void mpl_tab_drv_open(MPL *mpl, int mode) { TABDCA *dca = mpl->dca; xassert(dca->id == 0); xassert(dca->link == NULL); xassert(dca->na >= 1); if (strcmp(dca->arg[1], "CSV") == 0) { dca->id = TAB_CSV; dca->link = csv_open_file(dca, mode); } else if (strcmp(dca->arg[1], "xBASE") == 0) { dca->id = TAB_XBASE; dca->link = dbf_open_file(dca, mode); } else if (strcmp(dca->arg[1], "ODBC") == 0 || strcmp(dca->arg[1], "iODBC") == 0) { dca->id = TAB_ODBC; dca->link = db_iodbc_open(dca, mode); } else if (strcmp(dca->arg[1], "MySQL") == 0) { dca->id = TAB_MYSQL; dca->link = db_mysql_open(dca, mode); } else xprintf("Invalid table driver `%s'\n", dca->arg[1]); if (dca->link == NULL) error(mpl, "error on opening table %s", mpl->stmt->u.tab->name); return; }
dbf_handle_t dbf_open(const char* tablename, const char* dir) { dbf_handle_t dbf = (dbf_handle_t)malloc(sizeof(dbf_file_t)); header_t header; col_desc_t col_desc; dbf->file = NULL; dbf->index = NULL; dbf->memo = NULL; if ((dbf->file = dbf_open_file(tablename, dir, TABLEFILE)) == NULL) { return (dbf_handle_t)ERROR; } dbf->name = strdup(tablename); // File structure: // header (32 bytes) // column descriptions (n * 32 bytes) // column description terminator (1 byte) // backlinks (263 bytes) // data // Read table header EWP(sfread(&header, sizeof(header_t), dbf->file), dbf_handle_t); if (header.version != MAGIC_FOXPRO && header.version != MAGIC_FOXPRO_AUTOINCREMENT) { set_error(ERR_DBF_BAD_VERSION, dbf, "version=%02x", header.version); return (dbf_handle_t)ERROR; } dbf->row_count = header.row_count; dbf->first_row = header.first_row; dbf->row_size = header.row_size; // Read column definitions dbf->col_count = (dbf->first_row - (sizeof(header_t) + BACKLINK_SECTION_SIZE + 1)) / sizeof(col_desc_t); dbf->cols = (column_t*)calloc(dbf->col_count, sizeof(column_t)); for (int i = 0; i < dbf->col_count; i++) { EWP(sfread(&col_desc, sizeof(col_desc_t), dbf->file), dbf_handle_t); strcpy(dbf->cols[i].name, col_desc.name); dbf->cols[i].type = col_desc.type; dbf->cols[i].offset = col_desc.offset; dbf->cols[i].size = col_desc.size; dbf->cols[i].decimals= col_desc.decimals; dbf->cols[i].binary = col_desc.flags & FLAG_FIELD_BINARY; } // Read memo header if (header.flags & FLAG_HAS_MEMO) { dbf->memo = dbf_open_memo(tablename, dir); } // Read index if (header.flags & FLAG_HAS_INDEX) { dbf->index = dbf_open_index(tablename, dir); } dbf->row = (char*)malloc(dbf->row_size); dbf->pos = -1; // Initial cursor position is just before the first row dbf->last_find_col_id = -1; dbf->last_find_value = NULL; return dbf; }