Daniel Kasak

Changes for version 2.30

  • Added support for multi-column primary keys Added support for sequences Added support for Netezza Added partial support for Oracle ( I didn't get much time to test it out ) Added support for prefixing widget names with a string ( helps separate multiple instances with common field names ) Added ability to skip primary keys in update statements Added GtkBuilder support 7 years worth of other stuff I don't quite remember Ported to Gtk3 ( coming soon )
  • Version 2.2, not released ( oops ) Look for an SQL alias widget before checking for the primary key in apply() Use $widget->set_value() for Gtk2::SpinButton, or some strange stuff happens to invisible widgets Warn if set_widget_value() fails for combos because a value wan't in the model Fixed some recursion in changed() for on_changed and on_initial_changed() callbacks
  • Version 2.1, released 01-Jul-2007
    • Added debugging messages for signal connection / disconnection Fixed bug in disconnecting signal from a textview's buffer Check if a combo has a model before trying to get an iter; warn if no model present Optimisation: don't keep calling $widget->get_model ... keep model around for re-use Add primary key detection for SQL Server ( and re-enables SQL Server support which was completely broken ) Fixed bug in disconnecting signal from a ComboBoxEntry's child entry widget Added setup_combo() for creating / refreshing combo models & setting up autocompletion Added 'Find' right-click menu item for ComboBoxEntry's children Added 'Refresh Combo' right-click menu item for ComboBoxEntry's children we have setup definitions for Added get_widget_value method and use it in apply method ( remove code duplication ) Added set_widget_value method and use it in paint method ( remove code duplication ) Renamed 'readonly' option to 'read_only' ( and added legacy support with warning ) Added data-driven record locking ( via data_lock_field ), lock() and unlock() methods 'tab-forward' when an Enter key is pressed instead of leaving the focus in the current field Fixed rare off-by-one error in fetch_new_slice() that was creating invalid SQL Added record_status_label_set() to handle setting the record status label, and added some more colour Fixed nuking of where object in constructor Added reset_record_status() to reset 'changed' flag ( so Gtk2::Ex::DBI considers the record synchronised ) Added more error handling in constructor ( die with a descriptive error if we're missing something ) Removed duplicate set_record_spinner_range() in query() Added support for pass_through queries that return a recordset ( including stored procedures ) - read_only Added 'status_label' key to allow you to specify a label ( by name ) to use to indicate the record status Don't include identity columns in insert / update SQL ( fixes SQL Server updates ) Added 'record_spinner' key to allow you to specify a SpinButton ( by name ) to use as the record spinner Added ability to pass a new where object to setup_combo Added 'widgets' hash, to store metadata about fields Added support for using SQL aliases ( select field as alternative_field ) and binding to the alias Suppress more non-fatal warnings when quiet mode is activated Added support for custom 'before_apply' function, which can block the apply method Dump $local_sql to console via warn() if query() fails and debug is set Added support for using a set of SpinButtons to create 1 TimeSpinner ( experimental ) Replaced padding code with sprintf() Added friendly_table_name key to override $self->{sql}->{from} in GUI errors Added date_only input formatter Added currency input formatter Added date_dd-mm-yyyy input formatter Added parser for SQL Server default definitions INCOMPATIBLE CHANGE: get_column_value() now returns an ARRAY if multi_select is turned on Populate the widgets hash and the sql_to_widget_map hash with details of the primary key after detection Added date_dd-mm-yyyy output formatter Disable 'find' menu item in right-click menu of widgets for pass-through queries Don't require a formname - if one isn't passed, get the 1st window title from the Glade XML object Added currency output_formatter Imported more robust primary key detection from Gtk2::Ex::Datasheet::DBI Don't set the changed flag if we're in read_only mode Added 'type' key to widgets hash and automatically set up input / output formatters based on type Added sum_widgets() Fixed bug in inserting a record when we're at the end of the keyset Simplified apply() and improved debugging output Strip dollar signs from values in formatter_number() - we add our own if requested Added DBD::SQLite support Added original_value()
    • Patches from DLB: Add support for Postgres: Set search path in constructor when Postgres driver detected Add support for Postgres in last_insert_id()
  • Version 2.0, released 19-Dec-2005
    • Overhaul SQL clause handling - now all SQL-related stuff is in the 'sql' hash ( see docs ) Added support for placeholders in where clause Added legacy mode to support 1.x requests Added find tool ( right-click in a widget and select 'find', or call find_dialog() ) for user searches Added detection of primary key from column_info() ( MySQL only at present ) Added destroy method, which destroys all signal handlers we've created, then destroys itself Don't modify $self->{sql}->{select} in fetch_new_slice - assemble $local_sql and modify that Added missing 'order by' string to fetch_new_slice ... I was wondering what was up with that :) Change suspicious signal_connect calls to signal_connect_after ( avoid GtkEntry focus-out-event error ) Remove unnecessary signal_handler_block() and signal_handler_unblock() calls before set_record_spinner_range() Delete records in $self->{records} before querying ( fixes display of 'stale' records if query() returns no records ) Fixed rare bug in display of 'stale' record if there's only 1 record, and it gets deleted Added method undo(), which is a synonym of revert() Updated documentation & cleaned up POD somewhat
  • Version 1.3, released 16-Sep-2005
    • Dialog question asking user whether to apply if window is closed with unapplied changes to recordset Added support for placeholders in sql_where clause ( avoid SQL injection ) Fixed setting of calculated field if result of calculation is 0 Fixed dialog description of DBI error message if apply fails Fixed bug in trying to block non-existant signal when setting a primary key retrieved from an insert Replaced remaining 0s and 1s to FALSEs and TRUEs
  • Version 1.2, released 15-Aug-2005
    • Set default values from database field definitions when inserting a new record ( ie onscreen ) Create a key in our records hash for each field when inserting a new record ( avoids Perl warnings about uninitialised values ) Removed set_defaults() - incorporated into assemble_new_record() Added more eval{} stuff around DB interaction, with Gtk2::Ex::Dialog::ErrorMsg warnings when things fail Gtk2::Ex::DBI->new() returns FALSE if initial query fails
  • Version 1.1, released 02-Aug-2005
    • Ask user if they want to apply changes to current record before requerying ( ie don't simply apply without asking ) Add $sth->finish commands throughout to make things more SQLServer friendly when using DBD::ODBC with FreeTDS INCOMPATIBLE CHANGE: Automatically move to a new position when the record spinner is clicked Add missing $self->paint_calculated call at the end of $self->paint Added debug key to dump some info to the terminal Added calculator dialog to right-click menu of Gtk2::Entry widgets Withdrew claim that we work with SQL Server ( see man page ) Removed unnecessary documentation of internal functions Removed support for Gnome2::DateEdit, which is not suitable for database use due to it's handling of NULL values See http://bugzilla.gnome.org/show_bug.cgi?id=169787
  • Version 1.0, released 10-Jun-2005
    • Removed broken last_insert_id code - everything now uses select @@IDENTITY Cache the fieldlist array in $self->{fieldlist} so we don't have to query the DB every time we need a field list
  • Version 0.9, released 11-May-2005
    • Add checks to get rid of ( some ) warnings about 'Use of uninitialized value' in various places Moved set_active_iter_for_broken_combo_box to run on 'changed' signal of combo's child instead of 'focus_out_event' Removed $widget->get_child->set_text("") from set_active_iter_for_broken_combo_box ... WTF was that for? Fixed a bug in 'delete' method that was deleting the wrong record from the *in-memory* recordset ( DB data was OK ) Add insertion marker to primary key of *in-memory* recordset if there are no records ( otherwise users must first insert() before entering data ) Updated TODO
  • Version 0.8, released 10-Mar-2005
    • INCOMPATIBLE CHANGE: don't call on_current while we're constructing ourself - external code won't be able to 'see' us yet Added constructor_done flag to indicate whether we have been returned to the calling code yet You should manually call the on_current code immediately *after* the object constructor ... when your Gtk2::Ex::DBI object will be available Added method of running external code before applying changes to the current record ( on_apply - similar to on_current ) Apply changes to the current record before requerying ( query method ) Properly handle empty recordsets in count method Append primary key to sql_select if necessary in fetch_new_slice method Added 'quiet' flag to silence warnings such as missing widgets Added 'use strict' directive and fixed up issues this raised Added demo application - a dream database ( distributed separately - see download page on website ) Use 'make dist' to create distributable package instead of manually creating archive - thanks Ofey Updated website to make better use of space - also thanks to Ofey for suggestion to clean it up
  • Version 0.7, released 10-Feb-2005
    • Rewrote 'insert into' syntax in 'apply' method to be more DB-neutral Completed support for MS SQL server ( and most likely Sybase ... maybe even others ) via DBD::ODBC
  • Version 0.6, released 18-Jan-2005
    • MAJOR CHANGE: Implemented selecting of partial recordsets ( slices ) instead of simply selecting the whole recordset at once Dramatically improves performance on low-memory machines, and in cases of large recordsets INCOMPATIBLE CHANGE: The min / max values that are passed to the record spinner are now the recordset position PLUS ONE ( ie starts at 1 now instead of 0 ) Update the range of the record spinner when inserting / deleting Added workaround for http://bugzilla.gnome.org/show_bug.cgi?id=156017 Added support for default values. TODO: Support for fetching default values from DB Server Added support for Gtk2::CheckButton Broke out last_insert_id functionality into it's own method Fixed logic problem in 'move' method if there are no records ( don't try to move to position -1 ) Added ( dodgy ) workaround for http://bugzilla.gnome.org/show_bug.cgi?id=52372 - we bail out :) Documentation additions / cleanups Got website back online at http://entropy.homelinux.org after a large outage ( I was in Cambodia for a month, and someone stole my hostname after it expired )
  • Version 0.5, released 22-Nov-2004
    • Reformatted all indentation & removed a lot of whitespace ( big change, I know ). Now looks outstanding in ActiveState's Komodo :) Removed attempted locking of fields if 'read_only' is set. Only worked for a few widgets, and I don't see much point anyway - 'apply' method still honours 'read_only' status Fixed support for Gtk2::TextView - now we connect to TextBuffer's 'changed' signal Added support for DBI's last_insert_id() method. This brings us one step closer to supporting DB servers other than MySQL. Still requires some *very* small additions ( eg last_insert_id() on Postgres requires some arguments to be passed ) Volunteers? I don't use Postgres Added POD documentation - some formatting issues, not enough time to figure out what's up
  • Version 0.4, released 22-Oct-2004
    • Fixed 2 *nasty* bugs in apply method that were preventing the fieldlist from being processed and applied to DB Server or in-memory recordset Added 'delete' method
  • Version 0.3, released 14-Oct-2004
    • Added DATE-ONLY support for Gnome2::DateEdit ( only tested with MySQL's yyyy-mm-dd format ... BEWARE !!! ) Added 'order by' support 'revert' method now deletes the current record from the *in-memory* recordset if we are currently inserting a new record
    • Added dependancy*** : Gtk2::Ex::Dialogs - used instead of my own ( admittedly dodgy ) msgbox() function Added 'fieldlist' method, which returns a list of fields ( taken from the DB server ) 'apply' and 'paint' methods now use $self->fieldlist which is far more robust than looking at the current position's fieldlist ( in some cases will only contain the primary key ) Removed dependance on 'stuff.pm'. Moved date_from_GtkCalendar and date_to_GtkCalendar functionality back into Gtk2::Ex::DBI ( maybe should be another package? ) Added ExtUtils::MakeMaker support for installation
  • Version 0.2, released 06-Sep-2004
    • Renamed from gtk2-gladexml_DBI_helper to Gtk2::Ex::DBI Added support for Gtk2::TextView Added missing event support for Gtk2::Calendar More comments and documentation Remove fieldlist requirement from 'new' method. Fieldlist is assembled on-the-fly Fixed error if no on_current sub defined Deal with NULL date values when painting form Fixed bug where fields weren't getting their respective 'changed' signal connected if the initial query returned no results Added initial support for calculated fields Better handling of zero values ( don't use undef just because a zero is encountered )
  • Version 0.1, released 04-Jul-2004
    • First Version :) Basic querying Form painting Database updating External callbacks
Show More


  • Gtk2::Ex::DBI - Bind a Gtk2::GladeXML - generated window to a DBI data source