#ifndef __ODBCRSET_H #define __ODBCRSET_H #ifndef __RECSET_H #include #endif #ifndef __TSDB_H #include #endif enum TODBC_driver { ODBC_generic, ODBC_mssql, ODBC_access, ODBC_mysql}; 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; bool _loaded; protected: XVT_ODBC connection() const; void reset(); const TArray* row(TRecnotype n); virtual void parsed_text(TString& sql) const; TODBC_driver _driver; 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); long begin(); long commit(); bool connect(const char* dsn, const char* usr = "", const char* pwd = "", const char* dir = ""); bool set_log_file(const char* fn); const TODBC_driver driver() { return _driver; } int compare_key(const TISAM_recordset& dbfset); int compare_rec(const TISAM_recordset& dbfset); int create_rec(const TISAM_recordset& dbfset); void update_rec(const TISAM_recordset& dbfset); void remove_rec(const TISAM_recordset& dbfset); const TString& dsn() const { return _dsn; } TODBC_recordset(const char* sql, const bool freezed = false); virtual ~TODBC_recordset(); }; class TDB_recordset : public TRecordset { SSimple_query * _rec; TString _sql; TString _dsn, _usr, _pwd, _drv; TRecnotype _current_row; TString_array _row, _column; bool _is_loaded; TRecnotype _items; unsigned _ncolumns; protected: // Parsa la stringa di connessione contenuta nella query bool set_connection(const char * conn_str) const; bool connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db) const; bool connect(const char * db, const char * user, const char * pass, const char * tipo_db) const; static TT_driver str_to_driver(const char* tipo_db); bool set_loaded(); void unset_loaded(); public: void freeze(const bool on = true); void reset(); bool set(const char* sql); bool move_to(TRecnotype pos) override; // Pure bool move_next() override; void requery() override; // da impl. Pure bool is_connected() const; unsigned columns() const override; // Pure TRecnotype items() const override; // Pure TRecnotype current_row() const override { return _current_row; } // Pure // Con il valore di default viene restituita la riga alla pos. attuale const TString_array get_row(TRecnotype n = -1); const TString_array get_next_row(); const TString& query_text() const override { return _sql; } const TString& driver_version() const override { return _rec->sq_get_client_v(); }; const TVariant& get(unsigned int column) const override; // Pure const TVariant& get(const char* name) const override; // Pure const TRecordset_column_info& column_info(unsigned int column) const override; // Pure // Ritorna la connessione attuale const TVariant& active_connection() const; bool exec(const char* sql); bool commit() const; TDB_recordset(const char * sql, bool freezed = false); ~TDB_recordset(); }; #endif