#ifndef __RECORDSET_H #define __RECORDSET_H #ifndef __RECTYPES_H #include #endif #ifndef __SHEET_H #include #endif struct TRecordset_column_info : public TObject { TString _name; int _width; TFieldtypes _type; }; /////////////////////////////////////////////////////////// // TVariant /////////////////////////////////////////////////////////// class TVariant : public TSortable { TFieldtypes _type; void* _ptr; protected: virtual TObject* dup() const { return new TVariant(*this); } void copy(const TVariant& var); public: TFieldtypes type() const { return _type; } bool is_null() const { return _type == _nullfld; } void set_null(); void set(const char* str); void set(const real& r); void set(const long n); void set(const TDate& d); TVariant& operator=(const TVariant& var) { copy(var); return *this; } TVariant& operator=(const char* str) { set(str); return *this; } TVariant& operator=(const real& r) { set(r); return *this; } TVariant& operator=(const long n) { set(n); return *this; } TVariant& operator=(const TDate& d) { set(d); return *this; } const TString& as_string() const; bool as_string(TString& str) const; real as_real() const; long as_int() const; TDate as_date() const; bool as_bool() const; COLOR as_color() const; void convert_to(TFieldtypes ft); virtual int compare(const TSortable& s) const; TVariant& add(const TVariant& var); TVariant& sub(const TVariant& var); TVariant() : _type(_nullfld), _ptr(NULL) { } TVariant(const char* str) : _type(_alfafld), _ptr(new TString(str)) { } TVariant(const real& num) : _type(_realfld), _ptr(new real(num)) { }; TVariant(const TDate& d) : _type(_datefld), _ptr(new TDate(d)) { }; TVariant(long num) : _type(_longfld), _ptr((void*)num) { }; TVariant(bool ok) : _type(_longfld), _ptr((void*)ok) { }; TVariant(const TVariant& var) : _type(_nullfld), _ptr(NULL) { copy(var); } virtual ~TVariant() { set_null(); } }; extern const TVariant NULL_VARIANT; /////////////////////////////////////////////////////////// // TRecordset /////////////////////////////////////////////////////////// enum TRecordsetExportFormat { fmt_unknown, fmt_html, fmt_text, fmt_silk, fmt_campo }; class TRecordset : public TObject { protected: bool save_as_html(const char* path); bool save_as_silk(const char* path); bool save_as_text(const char* path); bool save_as_campo(const char* path); public: // Absolutely needed methods virtual TRecnotype items() const pure; virtual bool move_to(TRecnotype pos) pure; virtual TRecnotype current_row() const pure; virtual bool move_first() { return move_to(0); } virtual bool move_prev() { return move_to(current_row()-1); } virtual bool move_next() { return move_to(current_row()+1); } virtual bool move_last() { return move_to(items()-1); } virtual bool bof() const { return current_row() <= 0; } virtual bool eof() const { return current_row() >= items(); } virtual unsigned int columns() const pure; virtual const TRecordset_column_info& column_info(unsigned int column) const pure; virtual const TVariant& get(unsigned int column) const pure; virtual const TString& query_text() const; virtual const TVariant& get(const char* column_name) const; virtual const TToken_string& sheet_head() const; virtual bool save_as(const char* path, TRecordsetExportFormat fmt = fmt_unknown); }; /////////////////////////////////////////////////////////// // TSQL_recordset /////////////////////////////////////////////////////////// class TSQL_recordset : public TRecordset { TString _sql; TRecnotype _firstrow, _pagesize, _items, _current_row; TArray _column; TArray _page; protected: void reset(); public: // TRecordset virtual TRecnotype items() const; virtual bool move_to(TRecnotype pos); virtual TRecnotype current_row() const { return _current_row; } virtual unsigned int columns() const; virtual const TRecordset_column_info& column_info(unsigned int c) const; virtual const TVariant& get(unsigned int column) const; const TString& query_text() const { return _sql; } public: void set(const char* sql); // Internal use only virtual int on_get_items(int argc, char** values, char** columns); const TArray* row(TRecnotype n); TSQL_recordset(const char* sql); virtual ~TSQL_recordset() { } }; /////////////////////////////////////////////////////////// // TRecordset_sheet /////////////////////////////////////////////////////////// class TRecordset_sheet : public TSheet { TRecordset& _query; protected: virtual void get_row(long r, TToken_string& row); virtual long get_items() const; public: TRecordset_sheet(TRecordset& sql); }; /////////////////////////////////////////////////////////// // Utility /////////////////////////////////////////////////////////// void get_sql_directory(TFilename& path); bool select_sql_file(TFilename& path, const char* ext); #endif