Databaseconnectionclasses  0.5.3
hk_datasource.h
1 // ****************************************************************************
2 // copyright (c) 2000-2005 Horst Knorr <hk_classes@knoda.org>
3 // This file is part of the hk_classes library.
4 // This file may be distributed and/or modified under the terms of the
5 // GNU Library Public License version 2 as published by the Free Software
6 // Foundation and appearing in the file COPYING included in the
7 // packaging of this file.
8 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
9 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
10 // ****************************************************************************
11 #ifndef HK_DATASOURCE
12 #define HK_DATASOURCE
13 //#include <hk_definitions.h>
14 #include "hk_data.h"
15 #include <list>
16 #include <utility>
17 #include <algorithm>
18 #include "hk_column.h"
19 using namespace std;
20 
21 class hk_database;
22 class hk_dsvisible;
23 class hk_presentation;
24 class hk_qbe;
25 class hk_actionquery;
45 class hk_datasource:public hk_data
46 {
47  friend class hk_column;
48  friend class hk_dsvisible;
49  friend class hk_database;
50  friend class hk_presentation;
51  public:
52  virtual ~hk_datasource();
59  virtual void set_name(const hk_string& n,bool registerchange=true);
60  virtual hk_string name(void);
61  enum enum_tablemodes {mode_normal,mode_createtable,mode_altertable,mode_disabled,mode_insertrow,mode_deleterow,mode_unknown};
68  enum_tablemodes mode(void);
74  void setmode_insertrow(void);
79  void delete_actualrow(enum_interaction c=interactive);
83  void setmode_normal(void);
84 
89  void setmode_createtable(void);
90 
96  void setmode_altertable(void);
97 
102  hk_column* new_column(void);
103 
109  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);
114  bool delete_column(const hk_string& col);
119  bool create_table_now(void);
125  bool alter_table_now(void);
126 
127 
128 
129  bool create_view_now(void);
130  bool alter_view_now(void);
131 
139  virtual bool goto_row(unsigned long r);
140  bool while_goto_row(void) const;
141 
147  bool goto_first(void);
153  bool goto_last(void);
159  bool goto_next(void);
165  bool goto_previous(void);
169  bool goto_random(void);
173  unsigned long row_position(void);
177  unsigned long max_rows(void);
187  enum enum_accessmode {standard,batchread,batchwrite};
188  bool set_accessmode(enum_accessmode);
189  enum_accessmode accessmode(void) const;
190 
198  bool enable(void);
199  bool while_enabling(void) const;
203  bool disable(void);
204  bool while_disabling(void) const;
210  bool set_enabled(bool e);
214  bool is_enabled(void) const;
219  bool is_readonly(void) const;
223  void set_readonly(bool r);
229  list<hk_column*>* columns(void);
230  list<hk_string>* columnnames(void);
235  hk_column* column_by_name(const hk_string& c);
244  hk_column* column_by_name(const hk_string& c, int colnumber);
250  int columnname_occurances(const hk_string& colname);
254  int columnname_occurance(hk_column*);
255 
266  bool set_sql(const hk_string& s,bool rawsql=false,bool registerchange=true);
267 virtual bool set_query(hk_qbe*,bool registerchange=true);
268  hk_string sql(void) const;
269  bool is_rawsql(void);
273  hk_string backendsql(void) const;
274  typedef class
275  {
276  public:
277  hk_string name;
278  bool unique;
279  list<hk_string> fields;
280  } indexclass;
284  list<indexclass>* indices(void);
285  bool index_exists(const hk_string&);
290  bool drop_index(const hk_string& i);
299  bool create_index(const hk_string& name,bool unique, list<hk_string>& fields);
304  bool alter_index(const hk_string& name,bool unique,list<hk_string>& fields);
308  enum enum_dependingmodes {depending_nohandle,depending_standard,depending_change,depending_delete,depending_changedelete};
322  enum_dependingmodes dependingmode(void);
335  bool set_depending_on(hk_datasource* d,bool react_on_data_changes=false,enum_dependingmodes mode=depending_standard);
336  hk_datasource* depending_on(void);
337 
338  void set_depending_on_is_left_join(bool, bool registerchange=true);
339  bool depending_on_is_left_join(void);
343  bool depending_on_react_on_data_changes(void);
347  list<hk_string>* depending_on_thisfields(void);
351  list<hk_string>* depending_on_masterfields(void);
359  bool set_depending_on_presentationdatasource(long d,bool react_on_data_changes=false,enum_dependingmodes mode=depending_standard,bool registerchange=true);
360  long depending_on_presentationdatasource(void);
368  void add_depending_fields(const hk_string& this_ds_field, const hk_string& master_ds_field,bool registerchange=true);
372  void clear_depending_fields(bool registerchange=true);
378  bool store_changed_data(enum_interaction c=interactive);
379  void set_ignore_changed_data(void);
380  bool ignore_changed_data(void) const;
390  void set_filter(const hk_string& f,bool registerchange=true);
391  hk_string filter(void);
396  void set_temporaryfilter(const hk_string&f);
397  hk_string temporaryfilter(void);
398  void set_use_temporaryfilter(bool use);
399  bool use_temporaryfilter(void);
400 /*
401 *hk_classes internal use only, don't use the function set_internalfilter
402 */
403  void set_internalfilter(const hk_string&f);
404  hk_string internalfilter(void);
405  void set_use_internalfilter(bool use);
406  bool use_internalfilter(void);
407 
408 
414  void clear_filter(bool registerchange=true);
423  void set_sorting(const hk_string& s,bool registerchange=true);
424  hk_string sorting(void);
425  void set_temporarysorting(const hk_string& s);
426  hk_string temporarysorting(void);
427  void set_use_temporarysorting(bool use);
428  bool use_temporarysorting(void);
429 
435  void clear_sorting(bool registerchange=true);
443  void set_automatic_data_update(bool u);
444  bool is_automatic_data_update(void);
445 
446  void set_sqldelimiter(const hk_string&);
450  void set_datetimeformat(const hk_string& datetime,const hk_string& date,const hk_string& time)
451  {
452  p_datetimeformat=datetime;
453  p_dateformat=date;
454  p_timeformat=time;
455  }
456  hk_string dateformat(void)const {return p_dateformat;}
457  hk_string datetimeformat(void)const {return p_datetimeformat;}
458  hk_string timeformat(void)const {return p_timeformat;}
459  hk_database* database(void);
496  void savedata(ostream& s,bool saveall=true);
500  void loaddata(xmlNodePtr definition,bool loadsql=true);
505 // bool savequerytofile(void);
510 // bool loadqueryfromfile(void);
516  long presentationnumber(void) const {return p_dscounter;}
521  bool datasource_used(void) const;
522 #ifdef HK_DEBUG
523 
527  virtual void dump_data() ;
528 #endif
529 
532  bool ask_name(void);
536 virtual bool delete_rows(unsigned long from,unsigned long to,bool check_depending_datasources=true,enum_interaction c=interactive);
541  void transaction_begin(hk_string name="");
546  void transaction_commit(hk_string name="");
552  void transaction_rollback(hk_string name="");
553 
558  void set_blockvisiblesignals(bool v);
559  bool blockvisiblesignals(void);
564  void set_blockserversignals(bool);
565  bool blockserversignals(void);
570  void set_blockdatasourcesignals(bool);
571  bool blockdatasourcesignals(void);
575  void save_datasourcedefinition(ostream& s);
579  bool load_datasourcedefinition(xmlNodePtr definition,bool use_xmltablename=true ,bool ask=true);
580 hk_presentation* presentation(void);
584  void set_position(int x,int y, bool registerchange=true);
588  void set_size(int width,int height, bool registerchange=true);
589  int x(void) const;
590  int y(void) const;
591  int width(void) const;
592  int height(void) const;
593  void set_designsize(int w,int h,bool registerchange=true);
594  int designwidth() const;
595  int designheight() const;
596  void automatic_position_datasource(void);
597 
598 list<hk_datasource*>* dependinglist(void);
602  bool previous_enable_problems(void) const;
603 
604 list <referentialclass>* referenceslist(void);
608 bool add_reference(const referentialclass&);
609 bool drop_reference(const hk_string&);
610 
611 
612 hk_string fieldorigin(const hk_string&);
613 hk_string totalfieldorigin(const hk_string&);
614 void reset_changed_data(void);
615 bool has_changed(void) const;
619 hk_string systemcolumnname(const hk_string& n);
620 
621 static void set_enablefunction(voidfunction*, long counter);
622 
623  bool depending_on_datasource_deleterow_ok(void);
624  bool depending_on_datasource_before_delete_row(void);
625  bool depending_on_datasource_updaterow_ok(void);
626  bool check_store_changed_data();
627  void set_progressdialog(progress_dialogtype* progressdialog);
628  progress_dialogtype* progressdialog(void)const;
629  void set_progressinterval(int);
630  int progressinterval(void) const;
631 
632 
633 
634 
635 
636 
637  protected:
644  void column_remove(hk_column* col);
645  void visible_add(hk_dsvisible* v);
646  void visible_remove(hk_dsvisible* v);
647  virtual void driver_specific_transaction_begin(hk_string);
648  virtual void driver_specific_transaction_commit(hk_string);
649  virtual void driver_specific_transaction_rollback(hk_string);
650  virtual unsigned long driver_specific_max_rows(void){return 0;}
651  virtual bool driver_specific_set_accessmode(enum_accessmode){return true;}
652  virtual bool driver_specific_batch_enable(void){return false;}
653  virtual bool driver_specific_batch_disable(void){return false;}
654  virtual bool driver_specific_batch_goto_next(void){return false;}
655  virtual bool driver_specific_batch_goto_previous(void){return false;}
660  virtual bool driver_specific_enable(void){return false;}
661  virtual bool driver_specific_disable(void){return false;}
668  virtual list<hk_column*>* driver_specific_columns(void){return NULL;}
669  virtual bool driver_specific_goto_row(unsigned long r);
670  virtual hk_column* driver_specific_new_column(void){return NULL;}
671  virtual bool driver_specific_update_data(void){return true;}
672  virtual bool driver_specific_delete_data_at(unsigned long){return true;}
673  virtual bool driver_specific_insert_data(void){return true;}
674  virtual bool driver_specific_create_table_now(void){return false;}
675  virtual bool driver_specific_alter_table_now(void){return false;}
676  virtual bool driver_specific_create_view_now(void);
677  virtual bool driver_specific_alter_view_now(void);
678 
679  virtual void driver_specific_before_drop_table(void){}
680  virtual void filelist_changes(listtype t);
681  virtual list<indexclass>* driver_specific_indices(void){return NULL;}
682  virtual bool driver_specific_drop_index(const hk_string& i);
683  virtual bool driver_specific_create_index(const hk_string& name,bool unique,list<hk_string>& fields);
684  virtual void before_connection_disconnects(void);
685  virtual void before_source_vanishes(void);
690  virtual bool driver_specific_load_view(){return false;}
691  virtual void driver_specific_create_viewsql(){}// used for ds_view
692  virtual bool driver_specific_add_reference(const referentialclass &);
693  virtual bool driver_specific_drop_reference(const hk_string& );
694  virtual void driver_specific_referenceslist(void);
695  void depending_ds_add(hk_datasource* d);
696  void depending_ds_remove(hk_datasource* d);
697  void depending_on_datasource_row_change(bool take_changed_data=false);
698  void depending_on_datasource_data_has_changed(void);
699  void depending_on_datasource_after_store_changed_data(void);
700  void depending_on_datasource_insertmode(void);
701  void depending_on_datasource_before_update_row(void);
702  void depending_on_datasource_after_update_row(void);
703  void reload_data(bool take_changed_data=false);
704  void create_actual_row_where_statement(void);
705  hk_string create_row_where_statement_at(unsigned long int position,bool withwhere=true);
706  void create_new_sql_statement(bool take_changed_data=false);
707  hk_string whole_datasource_where_statement(bool take_changed_data=false);
708  void print_sql(void);
709 
710  bool p_enabled;
711  bool p_readonly;
712  bool p_primary_key_used;
713  bool p_ignore_changed_data;
714  void clear_columnlist(void);
715  void clear_modecolumnlists(void);
716  void clear_visiblelist(void);
717  void parse_sql(void);
718  virtual bool update_row(enum_interaction c=interactive);
719  virtual bool insert_row(enum_interaction c=interactive);
720  virtual bool delete_row(enum_interaction c=interactive);
721  unsigned long p_counter; // actual row number
722  hk_database* p_database;
723  list<hk_column*>* p_columns;
724  typedef class
725  {
726  public:
727  hk_string name;
728  hk_string newname;
730  long size;
731  hk_string defaultvalue;
732  bool primary;
733  bool notnull;
735 
736  list<class_altercolumns> p_altercolumns;
737  list<hk_string> p_deletecolumns;
738  list<hk_column*> p_newcolumns;
739  list<hk_string> depending_this_fields;
740  list<hk_string> depending_master_fields;
741 
742  typedef class fieldoriginclass
743  {
744  public:
745  hk_string fieldname;
746  hk_string alias;
748  {
749  }
750  bool operator=(const fieldoriginclass& o)
751  {
752  fieldname=o.fieldname;
753  alias=o.alias;
754  return true;
755  }
756  };
757 
761  typedef class
762  {
763  public:
764  hk_string
765  select_part,
766  from_part,
767  where_part,
768  groupby_part,
769  having_part,
770  orderby_part ;
771  list <fieldoriginclass> fieldpart;
772  list <pair<hk_string,hk_string> > tablepart;
774 
775 
776 
777  struct_parsed_sql* p_parsed_sql;
778  void parse_fieldpart(void);
779  void parse_tablepart(void);
780  hk_string p_sql;
781  hk_string p_viewsql;
782  hk_string p_actual_row_where;
783  bool p_automatic_data_update;
784  hk_actionquery* p_actionquery;
785  hk_string p_datetimeformat;
786  hk_string p_dateformat;
787  hk_string p_timeformat;
788  hk_string p_sql_delimiter;
789  hk_string p_true;
790  hk_string p_false;
791  bool p_depending_on_is_left_join;
792 
793  bool p_tablesql_set;
794  void set_has_changed(void);
795  void set_has_not_changed(void);
796  hk_string delimit_identifier(const hk_string&);
797  static voidfunction* p_enablefunction;// a function that will be called during enable
798  // used from the GUI, example: KDE should call processEvents to refresh display
799  static long p_enablefunctioncounter;
800  void inform_before_row_change(void);
801  void inform_visible_objects_batch_goto_next(void);
802  void inform_visible_objects_batch_goto_previous(void);
803  void inform_visible_objects_before_store_changed_data(void);
804  void inform_visible_objects_after_store_changed_data(void);
805  void inform_visible_objects_row_change(void);
806  void inform_visible_objects_row_add(void);
807  void inform_visible_objects_row_delete(void);
808  void inform_visible_objects_before_insert_row(void);
809  void inform_before_enable(void);
810  void inform_before_disable(void);
811  void inform_visible_objects_ds_disable(void);
812  void inform_visible_objects_ds_enable(void);
813  void inform_depending_ds_goto_row(void);
814  void inform_depending_ds_store_data(void);
815  void inform_depending_ds_data_has_changed(void);
816  void inform_depending_ds_after_store_changed_data(void);
817  void inform_depending_ds_before_update_row(void);
818  void inform_depending_ds_after_update_row(void);
819  void inform_depending_ds_disable(void);
820  void inform_depending_ds_enable(void);
821  void inform_depending_ds_insertmode(void);
822  void inform_visible_objects_new_columns_created(void);
823  void inform_visible_objects_before_columns_deleted(void);
824  void inform_visible_objects_insertmode(void);
825  void inform_when_table_structure_changes(void);
826  void inform_when_indexlist_changes(void);
827  void execute_visible_object_script_before_update(void);
828  void execute_visible_object_script_after_update(void);
829  void execute_visible_object_before_row_change(void);
830  void execute_visible_object_after_row_change(void);
831  void execute_visible_object_before_delete(void);
832  void execute_visible_object_after_delete(void);
833  void execute_visible_object_before_insert(void);
834  void execute_visible_object_after_insert(void);
835 
836 
837  list<hk_datasource*> p_dependinglist;
838  enum_tablemodes p_mode;
839  list<referentialclass> p_references;
840  hk_string new_referencename(const referentialclass&);
841  bool is_newreferencename(const hk_string&);
842  hk_string replace_dates(const hk_string&);
843 
844  private:
845  hk_string p_original_sql;
846  unsigned long p_length;
847  bool p_has_changed;
848  list<hk_dsvisible*> p_visibles;
849  hk_datasource* p_depending_on_datasource;
850  bool p_depending_on_datasource_react_on_changed_data;
851  void mark_visible_objects_as_not_handled(void);
852  void set_columns_tableorigin(void);
853  hk_string columntablepart(const hk_string&);
854  hk_presentation* p_presentation;
855 // unique number given from a hk_presentation object
856  long p_dscounter;
857 
858  hk_datasourceprivate* p_private;
859 }
860 
861 
862 ;
863 #endif
enum_accessmode
Definition: hk_datasource.h:187
represents a particular database on the SQL Server
Definition: hk_database.h:48
void set_name(const hk_string &n)
Definition: hk_presentation.cpp:684
enum_columntype
Definition: hk_column.h:93
virtual void driver_specific_after_copy_table()
Definition: hk_datasource.h:689
base class for visible widgets without column data connection
Definition: hk_dsvisible.h:31
virtual list< hk_column * > * driver_specific_columns(void)
Definition: hk_datasource.h:668
void set_size(unsigned int x, unsigned int y, unsigned int w, unsigned int h, bool registerchange=true)
Definition: hk_visible.cpp:159
enum_interaction
Definition: hk_class.h:60
Definition: hk_datasource.cpp:31
Definition: hk_datasource.h:724
Definition: hk_definitions.h:226
virtual void loaddata(xmlNodePtr definition)
Definition: hk_presentation.cpp:306
void before_source_vanishes(void)
Definition: hk_presentation.cpp:452
virtual void savedata(ostream &s)
Definition: hk_presentation.cpp:277
enum_dependingmodes
Definition: hk_datasource.h:308
represents a resultquery or a table of a database.
Definition: hk_datasource.h:45
void set_datetimeformat(const hk_string &datetime, const hk_string &date, const hk_string &time)
Definition: hk_datasource.h:450
base class for multidatasource based classes like forms and reports
Definition: hk_presentation.h:40
Definition: hk_datasource.h:274
Definition: hk_datasource.h:761
long presentationnumber(void) const
Definition: hk_datasource.h:516
Definition: hk_qbe.h:18
virtual bool driver_specific_enable(void)
Definition: hk_datasource.h:660
Base class for all kind of queries.
Definition: hk_data.h:26
Action query (i.e. ALTER TABLE) with no result.
Definition: hk_actionquery.h:29
Definition: hk_datasource.h:742
represents one column of a datasource.
Definition: hk_column.h:34
bool p_casesensitive
Definition: hk_datasource.h:642
void set_designsize(unsigned int width, unsigned int height, bool registerchange=true)
Definition: hk_presentation.cpp:480