#ifndef __ODBCRSET_H
#define __ODBCRSET_H

#ifndef __RECSET_H
#include <recset.h>
#endif

class TODBC_recordset : public TRecordset
{
  TString _dsn, _usr, _pwd, _dir;
  TString _sql;

  TRecnotype _first_row, _pagesize, _items, _current_row, _cursor_pos;
  TArray _page;

  TArray _column;
  bool _columns_loaded;

protected:
  XVT_ODBC connection() const;
  void reset();
  const TArray* row(TRecnotype n);
  virtual void parsed_text(TString& sql) const;

public: 
  virtual TRecnotype items() const;
  virtual unsigned int columns() const;
  virtual const TRecordset_column_info& column_info(unsigned int c) const;
  virtual bool move_to(TRecnotype pos);
  virtual TRecnotype current_row() const;
  virtual void requery();
  virtual const TString& query_text() const;
  virtual const TString& driver_version() const;

  virtual const TVariant& get(unsigned int c) const;
  virtual const TVariant& get(const char* name) const;

  // Callbacks
  int on_get_items(int argc, char** values, char** columns);
  int on_get_columns(int argc, char** values, char** columns);
  int on_get_rows(int argc, char** values, char** columns);

  void set(const char* sql);
  long exec(const char* sql);

  bool connect(const char* dsn, const char* usr = "", const char* pwd = "", const char* dir = "");

  const TString& dsn() const { return _dsn; }

  TODBC_recordset(const char* sql);
  virtual ~TODBC_recordset();
};

#endif