00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HK_DATASOURCE
00012 #define HK_DATASOURCE
00013
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
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
00510
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(){}
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;
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;
00798
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
00855 long p_dscounter;
00856
00857 hk_datasourceprivate* p_private;
00858 }
00859
00860
00861 ;
00862 #endif