Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

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);
00340         bool depending_on_react_on_data_changes(void);
00344         list<hk_string>* depending_on_thisfields(void);
00348         list<hk_string>* depending_on_masterfields(void);
00356         bool   set_depending_on_presentationdatasource(long d,bool react_on_data_changes=false,enum_dependingmodes mode=depending_standard,bool registerchange=true);
00357         long    depending_on_presentationdatasource(void);
00365         void    add_depending_fields(const hk_string& this_ds_field, const hk_string& master_ds_field,bool registerchange=true);
00369         void    clear_depending_fields(bool registerchange=true);
00375         bool    store_changed_data(enum_interaction c=interactive);
00376         void    set_ignore_changed_data(void);
00377         bool   ignore_changed_data(void) const;
00387         void    set_filter(const hk_string& f,bool registerchange=true);
00388         hk_string filter(void);
00393         void set_temporaryfilter(const hk_string&f);
00394         hk_string temporaryfilter(void);
00395         void set_use_temporaryfilter(bool use);
00396         bool use_temporaryfilter(void);
00397 /*
00398 *hk_classes internal use only, don't use the function set_internalfilter
00399 */
00400         void set_internalfilter(const hk_string&f);
00401         hk_string internalfilter(void);
00402         void set_use_internalfilter(bool use);
00403         bool use_internalfilter(void);
00404 
00405 
00411         void    clear_filter(bool registerchange=true);
00420         void    set_sorting(const hk_string& s,bool registerchange=true);
00421         hk_string sorting(void);
00422         void set_temporarysorting(const hk_string& s);
00423         hk_string temporarysorting(void);
00424         void set_use_temporarysorting(bool use);
00425         bool use_temporarysorting(void);
00426 
00432         void    clear_sorting(bool registerchange=true);
00440         void    set_automatic_data_update(bool u);
00441         bool    is_automatic_data_update(void);
00442         void    set_sqldelimiter(const hk_string&);
00446         void    set_datetimeformat(const hk_string& datetime,const hk_string& date,const hk_string& time)
00447         {
00448             p_datetimeformat=datetime;
00449             p_dateformat=date;
00450             p_timeformat=time;
00451         }
00452 
00453         hk_database* database(void);
00490         void  savedata(ostream& s,bool saveall=true);
00494         void  loaddata(const hk_string& definition,bool loadsql=true);
00499 //      bool    savequerytofile(void);
00504 //      bool    loadqueryfromfile(void);
00510         long  presentationnumber(void) const {return p_dscounter;}
00515         bool  datasource_used(void) const;
00516 #ifdef HK_DEBUG
00517 
00521         virtual        void   dump_data() ;
00522 #endif
00523 
00526         bool ask_name(void);
00530         bool delete_rows(unsigned long from,unsigned long to,bool check_depending_datasources=true,bool ask=true);
00535         void transaction_begin(hk_string name="");
00540         void transaction_commit(hk_string name="");
00546         void transaction_rollback(hk_string name="");
00547 
00552         void set_blockvisiblesignals(bool v);
00553         bool blockvisiblesignals(void);
00558         void set_blockserversignals(bool);
00559         bool blockserversignals(void);
00564         void set_blockdatasourcesignals(bool);
00565         bool blockdatasourcesignals(void);
00569         void save_datasourcedefinition(ostream& s);
00573         bool load_datasourcedefinition(const hk_string& definition,bool use_xmltablename=true ,bool ask=true);
00574 hk_presentation* presentation(void);
00578  void set_position(int x,int y, bool registerchange=true);
00582  void set_size(int width,int height, bool registerchange=true);
00583  int x(void) const;
00584  int y(void) const;
00585  int width(void) const;
00586  int height(void) const;
00587  void set_designsize(int w,int h,bool registerchange=true);
00588  int designwidth() const;
00589  int designheight() const;
00590  void   automatic_position_datasource(void);
00591 
00592 list<hk_datasource*>* dependinglist(void);
00596   bool previous_enable_problems(void) const;
00597 
00598 list <referentialclass>* referenceslist(void);
00599 
00600 bool  add_reference(const referentialclass&);
00601 bool  drop_reference(const hk_string&);
00602 
00603 
00604 hk_string fieldorigin(const hk_string&);
00605 hk_string totalfieldorigin(const hk_string&);
00606 void    reset_changed_data(void);
00607 bool has_changed(void) const;
00611 hk_string systemcolumnname(const hk_string& n);
00612 
00613 static void set_enablefunction(voidfunction*, long counter);
00614 
00615         bool   depending_on_datasource_deleterow_ok(void);
00616         bool   depending_on_datasource_before_delete_row(void);
00617         bool   depending_on_datasource_updaterow_ok(void);
00618     protected:
00623         bool p_casesensitive;
00624         hk_datasource(hk_database* db,hk_presentation* p=NULL);
00625         void    column_remove(hk_column* col);
00626         void    visible_add(hk_dsvisible* v);
00627         void    visible_remove(hk_dsvisible* v);
00628         virtual void driver_specific_transaction_begin(hk_string);
00629         virtual void driver_specific_transaction_commit(hk_string);
00630         virtual void driver_specific_transaction_rollback(hk_string);
00631         virtual unsigned long driver_specific_max_rows(void){return 0;}
00632         virtual bool driver_specific_set_accessmode(enum_accessmode){return true;}
00633         virtual bool driver_specific_batch_enable(void){return false;}
00634         virtual bool driver_specific_batch_disable(void){return false;}
00635         virtual bool driver_specific_batch_goto_next(void){return false;}
00636         virtual bool driver_specific_batch_goto_previous(void){return false;}
00641         virtual bool    driver_specific_enable(void){return false;}
00642         virtual bool    driver_specific_disable(void){return false;}
00649         virtual list<hk_column*>* driver_specific_columns(void){return NULL;}
00650         virtual bool    driver_specific_goto_row(unsigned long r);
00651         virtual hk_column* driver_specific_new_column(void){return NULL;}
00652         virtual bool    driver_specific_update_data(void){return true;}
00653         virtual bool    driver_specific_delete_data_at(unsigned long){return true;}
00654         virtual bool    driver_specific_insert_data(void){return true;}
00655         virtual bool    driver_specific_create_table_now(void){return false;}
00656         virtual bool    driver_specific_alter_table_now(void){return false;}
00657         virtual bool    driver_specific_create_view_now(void);
00658         virtual bool    driver_specific_alter_view_now(void);
00659 
00660         virtual void    driver_specific_before_drop_table(void){}
00661         virtual void    filelist_changes(listtype t);
00662         virtual list<indexclass>* driver_specific_indices(void){return NULL;}
00663         virtual bool    driver_specific_drop_index(const hk_string& i);
00664         virtual bool    driver_specific_create_index(const hk_string& name,bool unique,list<hk_string>& fields);
00665         virtual void before_connection_disconnects(void);
00666         virtual void before_source_vanishes(void);
00670         virtual void driver_specific_after_copy_table(){}
00671         virtual bool driver_specific_load_view(){return false;}
00672         virtual void driver_specific_create_viewsql(){}// used for ds_view
00673         virtual bool driver_specific_add_reference(const referentialclass &);
00674         virtual bool driver_specific_drop_reference(const hk_string& );
00675         virtual void driver_specific_referenceslist(void);
00676         void    depending_ds_add(hk_datasource* d);
00677         void    depending_ds_remove(hk_datasource* d);
00678         void    depending_on_datasource_row_change(bool take_changed_data=false);
00679         void    depending_on_datasource_data_has_changed(void);
00680         void    depending_on_datasource_after_store_changed_data(void);
00681         void    depending_on_datasource_insertmode(void);
00682         void   depending_on_datasource_before_update_row(void);
00683         void   depending_on_datasource_after_update_row(void);
00684         void    reload_data(bool take_changed_data=false);
00685         void    create_actual_row_where_statement(void);
00686         hk_string create_row_where_statement_at(unsigned long int position,bool withwhere=true);
00687         void    create_new_sql_statement(bool take_changed_data=false);
00688         hk_string whole_datasource_where_statement(bool take_changed_data=false);
00689         void print_sql(void);
00690 
00691         bool    p_enabled;
00692         bool    p_readonly;
00693         bool    p_primary_key_used;
00694         bool    p_ignore_changed_data;
00695         void    clear_columnlist(void);
00696         void    clear_modecolumnlists(void);
00697         void    clear_visiblelist(void);
00698         void    parse_sql(void);
00699         virtual bool    update_row(enum_interaction c=interactive);
00700         virtual bool    insert_row(enum_interaction c=interactive);
00701         virtual bool    delete_row(enum_interaction c=interactive);
00702         unsigned long   p_counter;                // actual row number
00703         hk_database*    p_database;
00704         list<hk_column*>*      p_columns;
00705         typedef class
00706         {
00707             public:
00708                 hk_string name;
00709                 hk_string newname;
00710                 hk_column::enum_columntype type;
00711                 long size;
00712                 hk_string defaultvalue;
00713                 bool primary;
00714                 bool notnull;
00715         } class_altercolumns;
00716 
00717         list<class_altercolumns>       p_altercolumns;
00718         list<hk_string>       p_deletecolumns;
00719         list<hk_column*>       p_newcolumns;
00720         list<hk_string> depending_this_fields;
00721         list<hk_string> depending_master_fields;
00722 
00723        typedef class fieldoriginclass
00724        {
00725          public:
00726          hk_string fieldname;
00727          hk_string alias;
00728          fieldoriginclass()
00729           {
00730           }
00731          bool operator=(const fieldoriginclass& o)
00732            {
00733              fieldname=o.fieldname;
00734              alias=o.alias;
00735              return true;
00736            }
00737        };
00738 
00742         typedef class
00743         {
00744             public:
00745                 hk_string
00746                     select_part,
00747                     from_part,
00748                     where_part,
00749                     groupby_part,
00750                     having_part,
00751                     orderby_part ;
00752                     list <fieldoriginclass> fieldpart;
00753                     list <pair<hk_string,hk_string> > tablepart;
00754         } struct_parsed_sql;
00755 
00756 
00757 
00758         struct_parsed_sql* p_parsed_sql;
00759         void parse_fieldpart(void);
00760         void parse_tablepart(void);
00761         hk_string   p_sql;
00762         hk_string   p_viewsql;
00763         hk_string  p_actual_row_where;
00764         bool    p_automatic_data_update;
00765         hk_actionquery* p_actionquery;
00766         hk_string p_datetimeformat;
00767         hk_string p_dateformat;
00768         hk_string p_timeformat;
00769         hk_string   p_sql_delimiter;
00770         hk_string       p_true;
00771         hk_string       p_false;
00772 
00773         bool    p_tablesql_set;
00774         void set_has_changed(void);
00775         void set_has_not_changed(void);
00776         hk_string delimit_identifier(const hk_string&);
00777         static voidfunction* p_enablefunction;// a  function that will be called during enable
00778         // used from the GUI, example: KDE should call processEvents to refresh display
00779         static long p_enablefunctioncounter;
00780         void    inform_before_row_change(void);
00781         void    inform_visible_objects_batch_goto_next(void);
00782         void    inform_visible_objects_batch_goto_previous(void);
00783         void    inform_visible_objects_before_store_changed_data(void);
00784         void    inform_visible_objects_after_store_changed_data(void);
00785         void    inform_visible_objects_row_change(void);
00786         void    inform_visible_objects_row_add(void);
00787         void    inform_visible_objects_row_delete(void);
00788         void    inform_visible_objects_before_insert_row(void);
00789         void    inform_before_enable(void);
00790         void    inform_before_disable(void);
00791         void    inform_visible_objects_ds_disable(void);
00792         void    inform_visible_objects_ds_enable(void);
00793         void    inform_depending_ds_goto_row(void);
00794         void    inform_depending_ds_store_data(void);
00795         void    inform_depending_ds_data_has_changed(void);
00796         void    inform_depending_ds_after_store_changed_data(void);
00797         void    inform_depending_ds_before_update_row(void);
00798         void    inform_depending_ds_after_update_row(void);
00799         void    inform_depending_ds_disable(void);
00800         void    inform_depending_ds_enable(void);
00801         void    inform_depending_ds_insertmode(void);
00802         void    inform_visible_objects_new_columns_created(void);
00803         void    inform_visible_objects_before_columns_deleted(void);
00804         void    inform_visible_objects_insertmode(void);
00805         void    inform_when_table_structure_changes(void);
00806         void    inform_when_indexlist_changes(void);
00807         void execute_visible_object_script_before_update(void);
00808         void execute_visible_object_script_after_update(void);
00809         void execute_visible_object_before_row_change(void);
00810         void execute_visible_object_after_row_change(void);
00811         void execute_visible_object_before_delete(void);
00812         void execute_visible_object_after_delete(void);
00813         void execute_visible_object_before_insert(void);
00814         void execute_visible_object_after_insert(void);
00815 
00816 
00817         list<hk_datasource*> p_dependinglist;
00818         enum_tablemodes p_mode;
00819 
00820 
00821     private:
00822 
00823         hk_string   p_original_sql;
00824         unsigned long p_length;
00825         bool    p_has_changed;
00826         list<hk_dsvisible*> p_visibles;
00827         hk_datasource*  p_depending_on_datasource;
00828         bool    p_depending_on_datasource_react_on_changed_data;
00829         void    mark_visible_objects_as_not_handled(void);
00830         void set_columns_tableorigin(void);
00831         hk_string columntablepart(const hk_string&);
00832         hk_presentation* p_presentation;
00833 // unique number given from a hk_presentation object
00834         long    p_dscounter;
00835 
00836         hk_datasourceprivate* p_private;
00837 }
00838 
00839 
00840 ;
00841 #endif

Generated on Tue Sep 13 00:58:20 2005 for Databaseconnectionclasses by  doxygen 1.4.4