hk_datasource.h

00001 // ****************************************************************************
00002 // copyright (c) 2000-2005 Horst Knorr <hk_classes@knoda.org>
00003 // This file is part of the hk_classes library.
00004 // This file may be distributed and/or modified under the terms of the
00005 // GNU Library Public License version 2 as published by the Free Software
00006 // Foundation and appearing in the file COPYING included in the
00007 // packaging of this file.
00008 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00009 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00010 // ****************************************************************************
00011 #ifndef HK_DATASOURCE
00012 #define HK_DATASOURCE
00013 //#include <hk_definitions.h>
00014 #include "hk_data.h"
00015 #include <list>
00016 #include <utility>
00017 #include <algorithm>
00018 #include "hk_column.h"
00019 using namespace std;
00020 
00021 class hk_database;
00022 class hk_dsvisible;
00023 class hk_presentation;
00024 class hk_qbe;
00025 class hk_actionquery;
00026 class hk_datasourceprivate;
00045 class hk_datasource:public hk_data
00046 {
00047     friend class hk_column;
00048     friend class hk_dsvisible;
00049     friend class hk_database;
00050     friend class hk_presentation;
00051     public:
00052         virtual     ~hk_datasource();
00059         virtual void    set_name(const hk_string& n,bool registerchange=true);
00060         virtual hk_string name(void);
00061         enum enum_tablemodes {mode_normal,mode_createtable,mode_altertable,mode_disabled,mode_insertrow,mode_deleterow,mode_unknown};
00068         enum_tablemodes mode(void);
00074         void    setmode_insertrow(void);
00079         void    delete_actualrow(enum_interaction c=interactive);
00083         void    setmode_normal(void);
00084 
00089         void    setmode_createtable(void);
00090 
00096         void setmode_altertable(void);
00097 
00102         hk_column* new_column(void);
00103 
00109         bool alter_column(const hk_string& col, const hk_string* name=NULL,hk_column::enum_columntype* newtype=NULL,long* size=NULL,const hk_string* defaultvalue=NULL,const bool* primary=NULL,const bool* notnull=NULL);
00114         bool delete_column(const hk_string& col);
00119         bool create_table_now(void);
00125         bool alter_table_now(void);
00126 
00127 
00128 
00129         bool create_view_now(void);
00130         bool alter_view_now(void);
00131 
00139         virtual bool    goto_row(unsigned long r);
00140                 bool    while_goto_row(void) const;
00141 
00147         bool    goto_first(void);
00153         bool    goto_last(void);
00159         bool    goto_next(void);
00165         bool    goto_previous(void);
00169         bool    goto_random(void);
00173         unsigned long row_position(void);
00177         unsigned long max_rows(void);
00187         enum enum_accessmode {standard,batchread,batchwrite};
00188         bool set_accessmode(enum_accessmode);
00189         enum_accessmode accessmode(void) const;
00190 
00198         bool    enable(void);
00199         bool    while_enabling(void) const;
00203         bool    disable(void);
00204         bool    while_disabling(void) const;
00210         bool    set_enabled(bool e);
00214         bool    is_enabled(void) const;
00219         bool    is_readonly(void) const;
00223         void    set_readonly(bool r);
00229         list<hk_column*>* columns(void);
00230         list<hk_string>* columnnames(void);
00235         hk_column* column_by_name(const hk_string& c);
00244         hk_column* column_by_name(const hk_string& c, int colnumber);
00250         int columnname_occurances(const hk_string& colname);
00254         int columnname_occurance(hk_column*);
00255 
00266         bool    set_sql(const hk_string& s,bool rawsql=false,bool registerchange=true);
00267 virtual bool    set_query(hk_qbe*,bool registerchange=true);
00268         hk_string   sql(void) const;
00269         bool    is_rawsql(void);
00273         hk_string   backendsql(void) const;
00274         typedef class
00275         {
00276             public:
00277                 hk_string  name;
00278                 bool    unique;
00279                 list<hk_string> fields;
00280         } indexclass;
00284         list<indexclass>* indices(void);
00285         bool index_exists(const hk_string&);
00290         bool    drop_index(const hk_string& i);
00299         bool    create_index(const hk_string& name,bool unique, list<hk_string>& fields);
00304         bool    alter_index(const hk_string& name,bool unique,list<hk_string>& fields);
00308         enum enum_dependingmodes {depending_nohandle,depending_standard,depending_change,depending_delete,depending_changedelete};
00322         enum_dependingmodes dependingmode(void);
00335         bool    set_depending_on(hk_datasource* d,bool react_on_data_changes=false,enum_dependingmodes mode=depending_standard);
00336         hk_datasource* depending_on(void);
00337         
00338         void set_depending_on_is_left_join(bool, bool registerchange=true);
00339         bool depending_on_is_left_join(void);
00343         bool depending_on_react_on_data_changes(void);
00347         list<hk_string>* depending_on_thisfields(void);
00351         list<hk_string>* depending_on_masterfields(void);
00359         bool   set_depending_on_presentationdatasource(long d,bool react_on_data_changes=false,enum_dependingmodes mode=depending_standard,bool registerchange=true);
00360         long    depending_on_presentationdatasource(void);
00368         void    add_depending_fields(const hk_string& this_ds_field, const hk_string& master_ds_field,bool registerchange=true);
00372         void    clear_depending_fields(bool registerchange=true);
00378         bool    store_changed_data(enum_interaction c=interactive);
00379         void    set_ignore_changed_data(void);
00380         bool   ignore_changed_data(void) const;
00390         void    set_filter(const hk_string& f,bool registerchange=true);
00391         hk_string filter(void);
00396         void set_temporaryfilter(const hk_string&f);
00397         hk_string temporaryfilter(void);
00398         void set_use_temporaryfilter(bool use);
00399         bool use_temporaryfilter(void);
00400 /*
00401 *hk_classes internal use only, don't use the function set_internalfilter
00402 */
00403         void set_internalfilter(const hk_string&f);
00404         hk_string internalfilter(void);
00405         void set_use_internalfilter(bool use);
00406         bool use_internalfilter(void);
00407 
00408 
00414         void    clear_filter(bool registerchange=true);
00423         void    set_sorting(const hk_string& s,bool registerchange=true);
00424         hk_string sorting(void);
00425         void set_temporarysorting(const hk_string& s);
00426         hk_string temporarysorting(void);
00427         void set_use_temporarysorting(bool use);
00428         bool use_temporarysorting(void);
00429 
00435         void    clear_sorting(bool registerchange=true);
00443         void    set_automatic_data_update(bool u);
00444         bool    is_automatic_data_update(void);
00445         
00446         void    set_sqldelimiter(const hk_string&);
00450         void    set_datetimeformat(const hk_string& datetime,const hk_string& date,const hk_string& time)
00451         {
00452             p_datetimeformat=datetime;
00453             p_dateformat=date;
00454             p_timeformat=time;
00455         }
00456         hk_string dateformat(void)const {return p_dateformat;}
00457         hk_string datetimeformat(void)const {return p_datetimeformat;}
00458         hk_string timeformat(void)const {return p_timeformat;}
00459         hk_database* database(void);
00496         void  savedata(ostream& s,bool saveall=true);
00500         void  loaddata(xmlNodePtr definition,bool loadsql=true);
00505 //      bool    savequerytofile(void);
00510 //      bool    loadqueryfromfile(void);
00516         long  presentationnumber(void) const {return p_dscounter;}
00521         bool  datasource_used(void) const;
00522 #ifdef HK_DEBUG
00523 
00527         virtual        void   dump_data() ;
00528 #endif
00529 
00532         bool ask_name(void);
00536 virtual        bool delete_rows(unsigned long from,unsigned long to,bool check_depending_datasources=true,enum_interaction c=interactive);
00541         void transaction_begin(hk_string name="");
00546         void transaction_commit(hk_string name="");
00552         void transaction_rollback(hk_string name="");
00553 
00558         void set_blockvisiblesignals(bool v);
00559         bool blockvisiblesignals(void);
00564         void set_blockserversignals(bool);
00565         bool blockserversignals(void);
00570         void set_blockdatasourcesignals(bool);
00571         bool blockdatasourcesignals(void);
00575         void save_datasourcedefinition(ostream& s);
00579         bool load_datasourcedefinition(xmlNodePtr definition,bool use_xmltablename=true ,bool ask=true);
00580 hk_presentation* presentation(void);
00584  void set_position(int x,int y, bool registerchange=true);
00588  void set_size(int width,int height, bool registerchange=true);
00589  int x(void) const;
00590  int y(void) const;
00591  int width(void) const;
00592  int height(void) const;
00593  void set_designsize(int w,int h,bool registerchange=true);
00594  int designwidth() const;
00595  int designheight() const;
00596  void   automatic_position_datasource(void);
00597 
00598 list<hk_datasource*>* dependinglist(void);
00602   bool previous_enable_problems(void) const;
00603 
00604 list <referentialclass>* referenceslist(void);
00608 bool  add_reference(const referentialclass&);
00609 bool  drop_reference(const hk_string&);
00610 
00611 
00612 hk_string fieldorigin(const hk_string&);
00613 hk_string totalfieldorigin(const hk_string&);
00614 void    reset_changed_data(void);
00615 bool has_changed(void) const;
00619 hk_string systemcolumnname(const hk_string& n);
00620 
00621 static void set_enablefunction(voidfunction*, long counter);
00622 
00623         bool   depending_on_datasource_deleterow_ok(void);
00624         bool   depending_on_datasource_before_delete_row(void);
00625         bool   depending_on_datasource_updaterow_ok(void);
00626         bool check_store_changed_data();
00627         void set_progressdialog(progress_dialogtype* progressdialog);
00628         progress_dialogtype* progressdialog(void)const;
00629         void set_progressinterval(int);
00630         int progressinterval(void) const;
00631 
00632     
00633     
00634     
00635     
00636     
00637     protected:
00642         bool p_casesensitive;
00643         hk_datasource(hk_database* db,hk_presentation* p=NULL);
00644         void    column_remove(hk_column* col);
00645         void    visible_add(hk_dsvisible* v);
00646         void    visible_remove(hk_dsvisible* v);
00647         virtual void driver_specific_transaction_begin(hk_string);
00648         virtual void driver_specific_transaction_commit(hk_string);
00649         virtual void driver_specific_transaction_rollback(hk_string);
00650         virtual unsigned long driver_specific_max_rows(void){return 0;}
00651         virtual bool driver_specific_set_accessmode(enum_accessmode){return true;}
00652         virtual bool driver_specific_batch_enable(void){return false;}
00653         virtual bool driver_specific_batch_disable(void){return false;}
00654         virtual bool driver_specific_batch_goto_next(void){return false;}
00655         virtual bool driver_specific_batch_goto_previous(void){return false;}
00660         virtual bool    driver_specific_enable(void){return false;}
00661         virtual bool    driver_specific_disable(void){return false;}
00668         virtual list<hk_column*>* driver_specific_columns(void){return NULL;}
00669         virtual bool    driver_specific_goto_row(unsigned long r);
00670         virtual hk_column* driver_specific_new_column(void){return NULL;}
00671         virtual bool    driver_specific_update_data(void){return true;}
00672         virtual bool    driver_specific_delete_data_at(unsigned long){return true;}
00673         virtual bool    driver_specific_insert_data(void){return true;}
00674         virtual bool    driver_specific_create_table_now(void){return false;}
00675         virtual bool    driver_specific_alter_table_now(void){return false;}
00676         virtual bool    driver_specific_create_view_now(void);
00677         virtual bool    driver_specific_alter_view_now(void);
00678 
00679         virtual void    driver_specific_before_drop_table(void){}
00680         virtual void    filelist_changes(listtype t);
00681         virtual list<indexclass>* driver_specific_indices(void){return NULL;}
00682         virtual bool    driver_specific_drop_index(const hk_string& i);
00683         virtual bool    driver_specific_create_index(const hk_string& name,bool unique,list<hk_string>& fields);
00684         virtual void before_connection_disconnects(void);
00685         virtual void before_source_vanishes(void);
00689         virtual void driver_specific_after_copy_table(){}
00690         virtual bool driver_specific_load_view(){return false;}
00691         virtual void driver_specific_create_viewsql(){}// used for ds_view
00692         virtual bool driver_specific_add_reference(const referentialclass &);
00693         virtual bool driver_specific_drop_reference(const hk_string& );
00694         virtual void driver_specific_referenceslist(void);
00695         void    depending_ds_add(hk_datasource* d);
00696         void    depending_ds_remove(hk_datasource* d);
00697         void    depending_on_datasource_row_change(bool take_changed_data=false);
00698         void    depending_on_datasource_data_has_changed(void);
00699         void    depending_on_datasource_after_store_changed_data(void);
00700         void    depending_on_datasource_insertmode(void);
00701         void   depending_on_datasource_before_update_row(void);
00702         void   depending_on_datasource_after_update_row(void);
00703         void    reload_data(bool take_changed_data=false);
00704         void    create_actual_row_where_statement(void);
00705         hk_string create_row_where_statement_at(unsigned long int position,bool withwhere=true);
00706         void    create_new_sql_statement(bool take_changed_data=false);
00707         hk_string whole_datasource_where_statement(bool take_changed_data=false);
00708         void print_sql(void);
00709 
00710         bool    p_enabled;
00711         bool    p_readonly;
00712         bool    p_primary_key_used;
00713         bool    p_ignore_changed_data;
00714         void    clear_columnlist(void);
00715         void    clear_modecolumnlists(void);
00716         void    clear_visiblelist(void);
00717         void    parse_sql(void);
00718         virtual bool    update_row(enum_interaction c=interactive);
00719         virtual bool    insert_row(enum_interaction c=interactive);
00720         virtual bool    delete_row(enum_interaction c=interactive);
00721         unsigned long   p_counter;                // actual row number
00722         hk_database*    p_database;
00723         list<hk_column*>*      p_columns;
00724         typedef class
00725         {
00726             public:
00727                 hk_string name;
00728                 hk_string newname;
00729                 hk_column::enum_columntype type;
00730                 long size;
00731                 hk_string defaultvalue;
00732                 bool primary;
00733                 bool notnull;
00734         } class_altercolumns;
00735 
00736         list<class_altercolumns>       p_altercolumns;
00737         list<hk_string>       p_deletecolumns;
00738         list<hk_column*>       p_newcolumns;
00739         list<hk_string> depending_this_fields;
00740         list<hk_string> depending_master_fields;
00741 
00742        typedef class fieldoriginclass
00743        {
00744          public:
00745          hk_string fieldname;
00746          hk_string alias;
00747          fieldoriginclass()
00748           {
00749           }
00750          bool operator=(const fieldoriginclass& o)
00751            {
00752              fieldname=o.fieldname;
00753              alias=o.alias;
00754              return true;
00755            }
00756        };
00757 
00761         typedef class
00762         {
00763             public:
00764                 hk_string
00765                     select_part,
00766                     from_part,
00767                     where_part,
00768                     groupby_part,
00769                     having_part,
00770                     orderby_part ;
00771                     list <fieldoriginclass> fieldpart;
00772                     list <pair<hk_string,hk_string> > tablepart;
00773         } struct_parsed_sql;
00774 
00775 
00776 
00777         struct_parsed_sql* p_parsed_sql;
00778         void parse_fieldpart(void);
00779         void parse_tablepart(void);
00780         hk_string   p_sql;
00781         hk_string   p_viewsql;
00782         hk_string  p_actual_row_where;
00783         bool    p_automatic_data_update;
00784         hk_actionquery* p_actionquery;
00785         hk_string p_datetimeformat;
00786         hk_string p_dateformat;
00787         hk_string p_timeformat;
00788         hk_string   p_sql_delimiter;
00789         hk_string       p_true;
00790         hk_string       p_false;
00791         bool   p_depending_on_is_left_join;
00792 
00793         bool    p_tablesql_set;
00794         void set_has_changed(void);
00795         void set_has_not_changed(void);
00796         hk_string delimit_identifier(const hk_string&);
00797         static voidfunction* p_enablefunction;// a  function that will be called during enable
00798         // used from the GUI, example: KDE should call processEvents to refresh display
00799         static long p_enablefunctioncounter;
00800         void    inform_before_row_change(void);
00801         void    inform_visible_objects_batch_goto_next(void);
00802         void    inform_visible_objects_batch_goto_previous(void);
00803         void    inform_visible_objects_before_store_changed_data(void);
00804         void    inform_visible_objects_after_store_changed_data(void);
00805         void    inform_visible_objects_row_change(void);
00806         void    inform_visible_objects_row_add(void);
00807         void    inform_visible_objects_row_delete(void);
00808         void    inform_visible_objects_before_insert_row(void);
00809         void    inform_before_enable(void);
00810         void    inform_before_disable(void);
00811         void    inform_visible_objects_ds_disable(void);
00812         void    inform_visible_objects_ds_enable(void);
00813         void    inform_depending_ds_goto_row(void);
00814         void    inform_depending_ds_store_data(void);
00815         void    inform_depending_ds_data_has_changed(void);
00816         void    inform_depending_ds_after_store_changed_data(void);
00817         void    inform_depending_ds_before_update_row(void);
00818         void    inform_depending_ds_after_update_row(void);
00819         void    inform_depending_ds_disable(void);
00820         void    inform_depending_ds_enable(void);
00821         void    inform_depending_ds_insertmode(void);
00822         void    inform_visible_objects_new_columns_created(void);
00823         void    inform_visible_objects_before_columns_deleted(void);
00824         void    inform_visible_objects_insertmode(void);
00825         void    inform_when_table_structure_changes(void);
00826         void    inform_when_indexlist_changes(void);
00827         void execute_visible_object_script_before_update(void);
00828         void execute_visible_object_script_after_update(void);
00829         void execute_visible_object_before_row_change(void);
00830         void execute_visible_object_after_row_change(void);
00831         void execute_visible_object_before_delete(void);
00832         void execute_visible_object_after_delete(void);
00833         void execute_visible_object_before_insert(void);
00834         void execute_visible_object_after_insert(void);
00835 
00836 
00837         list<hk_datasource*> p_dependinglist;
00838         enum_tablemodes p_mode;
00839         list<referentialclass> p_references;
00840         hk_string new_referencename(const referentialclass&);
00841         bool is_newreferencename(const hk_string&);
00842 
00843     private:
00844         hk_string   p_original_sql;
00845         unsigned long p_length;
00846         bool    p_has_changed;
00847         list<hk_dsvisible*> p_visibles;
00848         hk_datasource*  p_depending_on_datasource;
00849         bool    p_depending_on_datasource_react_on_changed_data;
00850         void    mark_visible_objects_as_not_handled(void);
00851         void set_columns_tableorigin(void);
00852         hk_string columntablepart(const hk_string&);
00853         hk_presentation* p_presentation;
00854 // unique number given from a hk_presentation object
00855         long    p_dscounter;
00856 
00857         hk_datasourceprivate* p_private;
00858 }
00859 
00860 
00861 ;
00862 #endif

Generated on Tue Nov 28 02:48:08 2006 for Databaseconnectionclasses by  doxygen 1.5.0