Example #1
0
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;
}
Example #2
0
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;
}