Update Query

This commit is contained in:
Timothy Warren 2012-11-08 14:40:55 -05:00
parent b24ce9e9c2
commit 7e39611141

View File

@ -1,235 +1,235 @@
<?php <?php
/** /**
* OpenSQLManager * OpenSQLManager
* *
* Free Database manager for Open Source Databases * Free Database manager for Open Source Databases
* *
* @package OpenSQLManager * @package OpenSQLManager
* @author Timothy J. Warren * @author Timothy J. Warren
* @copyright Copyright (c) 2012 * @copyright Copyright (c) 2012
* @link https://github.com/aviat4ion/OpenSQLManager * @link https://github.com/aviat4ion/OpenSQLManager
* @license http://philsturgeon.co.uk/code/dbad-license * @license http://philsturgeon.co.uk/code/dbad-license
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
namespace OpenSQLManager; namespace OpenSQLManager;
/** /**
* Widget for adding / Editing Connections * Widget for adding / Editing Connections
* *
* @package OpenSQLManager * @package OpenSQLManager
* @subpackage Widgets * @subpackage Widgets
*/ */
class Connection_Manager extends \wxFrame { class Connection_Manager extends \wxFrame {
const TXT_CONN_NAME = 1; const TXT_CONN_NAME = 1;
const COMBO_DB_TYPE = 2; const COMBO_DB_TYPE = 2;
const FILE_DB_FILE = 3; const FILE_DB_FILE = 3;
const TXT_DB_NAME = 4; const TXT_DB_NAME = 4;
const TXT_DB_HOST = 5; const TXT_DB_HOST = 5;
const TXT_DB_PORT = 6; const TXT_DB_PORT = 6;
const TXT_DB_USER = 7; const TXT_DB_USER = 7;
const TXT_DB_PASS = 8; const TXT_DB_PASS = 8;
const BTN_TEST = 9; const BTN_TEST = 9;
const BTN_ADD = 10; const BTN_ADD = 10;
/** /**
* Array of fields for Connection Information manipulation * Array of fields for Connection Information manipulation
* *
* @var array * @var array
*/ */
protected $fields = array(); protected $fields = array();
/** /**
* Array of labels for Connection Information manipulation * Array of labels for Connection Information manipulation
* *
* @var array * @var array
*/ */
protected $labels = array(); protected $labels = array();
/** /**
* Create the window * Create the window
* *
* @param wxWindow * @param wxWindow
* @param mixed * @param mixed
*/ */
public function __construct($parent, $params = array()) public function __construct($parent, $params = array())
{ {
parent::__construct($parent, 32, "Connection Manager", wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxSTAY_ON_TOP | wxRESIZE_BORDER); parent::__construct($parent, 32, "Connection Manager", wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxSTAY_ON_TOP | wxRESIZE_BORDER);
// Save a reference to the settings class // Save a reference to the settings class
$this->settings =& Settings::get_instance(); $this->settings =& Settings::get_instance();
// Layout the window // Layout the window
$this->_layout($params); $this->_layout($params);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/** /**
* Layout fields on the form * Layout fields on the form
* *
* @param array * @param array
*/ */
protected function _layout($params) protected function _layout($params)
{ {
$container_sizer = new \wxBoxSizer(wxVERTICAL); $container_sizer = new \wxBoxSizer(wxVERTICAL);
// Use a table-like sizer // Use a table-like sizer
$sizer = new \wxFlexGridSizer(2, 5, 5); $sizer = new \wxFlexGridSizer(2, 5, 5);
$sizer->SetHGap(5); $sizer->SetHGap(5);
$sizer->SetVGap(5); $sizer->SetVGap(5);
$sizer->SetFlexibleDirection(wxBOTH); $sizer->SetFlexibleDirection(wxBOTH);
$sizer->AddGrowableCol(0, 1); $sizer->AddGrowableCol(0, 1);
$sizer->AddGrowableCol(1, 1); $sizer->AddGrowableCol(1, 1);
$db_types = $this->get_available_dbs(); $db_types = $this->get_available_dbs();
if ($db_types === FALSE) if ($db_types === FALSE)
{ {
error("No valid databases set up in PHP"); error("No valid databases set up in PHP");
return; return;
} }
// Create the controls // Create the controls
// label => control // label => control
$this->fields = array( $this->fields = array(
'Connection Name' => new \wxTextCtrl($this, self::TXT_CONN_NAME), 'Connection Name' => new \wxTextCtrl($this, self::TXT_CONN_NAME),
'Database Type' => $choice = new \wxChoice(), 'Database Type' => $choice = new \wxChoice(),
'Database File' => new \wxFilePickerCtrl($this, self::FILE_DB_FILE, wxEmptyString, "Select the database file", '*.*'), 'Database File' => new \wxFilePickerCtrl($this, self::FILE_DB_FILE, wxEmptyString, "Select the database file", '*.*'),
'Database Name' => new \wxTextCtrl($this, self::TXT_DB_NAME), 'Database Name' => new \wxTextCtrl($this, self::TXT_DB_NAME),
'Host' => new \wxTextCtrl($this, self::TXT_DB_HOST), 'Host' => new \wxTextCtrl($this, self::TXT_DB_HOST),
'Port' => new \wxTextCtrl($this, self::TXT_DB_PORT), 'Port' => new \wxTextCtrl($this, self::TXT_DB_PORT),
'User' => new \wxTextCtrl($this, self::TXT_DB_USER), 'User' => new \wxTextCtrl($this, self::TXT_DB_USER),
'Password' => new \wxTextCtrl($this, self::TXT_DB_PASS) 'Password' => new \wxTextCtrl($this, self::TXT_DB_PASS)
); );
$choice->Create($this, self::COMBO_DB_TYPE, wxDefaultPosition, wxDefaultSize, $db_types); $choice->Create($this, self::COMBO_DB_TYPE, wxDefaultPosition, wxDefaultSize, $db_types);
// Enable hiding/showing of controls based on choice // Enable hiding/showing of controls based on choice
$choice->Connect(wxEVT_COMMAND_CHOICE_SELECTED, array($this, 'change_db')); $choice->Connect(wxEVT_COMMAND_CHOICE_SELECTED, array($this, 'change_db'));
// Add the controls to the sizer // Add the controls to the sizer
$i = 1; $i = 1;
foreach ($this->fields as $lbl => $ctrl) foreach ($this->fields as $lbl => $ctrl)
{ {
// Add the label to the labels array for later manipulation // Add the label to the labels array for later manipulation
$this->labels[$lbl] = new \wxStaticText($this, $i, $lbl); $this->labels[$lbl] = new \wxStaticText($this, $i, $lbl);
$sizer->Add($this->labels[$lbl], 0, wxALIGN_LEFT); $sizer->Add($this->labels[$lbl], 0, wxALIGN_LEFT);
$sizer->Add($ctrl, 1, wxALIGN_RIGHT|wxEXPAND); $sizer->Add($ctrl, 1, wxALIGN_RIGHT|wxEXPAND);
$i++; $i++;
} }
// Test Connection Button // Test Connection Button
$test_button = new \wxButton($this, self::BTN_TEST, 'Test Connection'); $test_button = new \wxButton($this, self::BTN_TEST, 'Test Connection');
$test_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, array($this, 'test_conn')); $test_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, array($this, 'test_conn'));
// Add Connection Button // Add Connection Button
$add_button = new \wxButton($this, self::BTN_ADD, 'Add Connection'); $add_button = new \wxButton($this, self::BTN_ADD, 'Add Connection');
$add_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, array($this, 'add_conn')); $add_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, array($this, 'add_conn'));
// Add the buttons to the sizer // Add the buttons to the sizer
$sizer->Add($test_button, 1, wxEXPAND); $sizer->Add($test_button, 1, wxEXPAND);
$sizer->Add($add_button, 1, wxEXPAND); $sizer->Add($add_button, 1, wxEXPAND);
// Add the sizer to the window // Add the sizer to the window
// Add it inside of another sizer for padding. // Add it inside of another sizer for padding.
$container_sizer->Add($sizer, 1, wxALL|wxEXPAND, 10); $container_sizer->Add($sizer, 1, wxALL|wxEXPAND, 10);
$this->SetSizer($container_sizer); $this->SetSizer($container_sizer);
$this->Layout(); $this->Layout();
// Autosize the window to fit the controls // Autosize the window to fit the controls
$this->Fit(); $this->Fit();
$this->CenterOnScreen(wxBOTH); $this->CenterOnScreen(wxBOTH);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/** /**
* Get the list of available database types * Get the list of available database types
*
* return array
*/
protected function get_available_dbs()
{
$drivers = array("");
$pdo_drivers = \pdo_drivers();
// Add PDO drivers
foreach ($pdo_drivers as $d)
{
// Skip sqlite2 as opposed to sqlite3
if ($d === 'sqlite2' && (in_array('sqlite', $pdo_drivers) || in_array('sqlite3', $pdo_drivers)))
{
continue;
}
// Use the ibase_functions over PDO::Firebird
if ($d === 'firebird')
{
continue;
}
// Replace default capitalization with something that looks better.
$d = str_replace("sql", "SQL", $d);
$d = str_ireplace("pg", "Postgre", $d);
$d = str_ireplace("odbc", "ODBC", $d);
$d = ucfirst($d);
$drivers[] = $d;
}
// Add firebird support, if exists
if (function_exists('fbird_connect'))
{
$drivers[] = "Firebird";
}
sort($drivers);
return $drivers;
}
// --------------------------------------------------------------------------
/**
* Adds a connection to the connection manager
* *
* @param wxCommandEvent * return array
* @return void */
*/ protected function get_available_dbs()
public function add_conn($event) {
{ $drivers = array("");
$params = $this->_get_vals();
$pdo_drivers = \pdo_drivers();
if (empty($params->name))
{ // Add PDO drivers
error("You need a name for the connection"); foreach ($pdo_drivers as $d)
return; {
} // Skip sqlite2 as opposed to sqlite3
if ($d === 'sqlite2' && (in_array('sqlite', $pdo_drivers) || in_array('sqlite3', $pdo_drivers)))
$this->settings->add_db($params->name, $params); {
} continue;
}
// --------------------------------------------------------------------------
// Use the ibase_functions over PDO::Firebird
/** if ($d === 'firebird')
* Set defaults for new database type {
continue;
}
// Replace default capitalization with something that looks better.
$d = str_replace("sql", "SQL", $d);
$d = str_ireplace("pg", "Postgre", $d);
$d = str_ireplace("odbc", "ODBC", $d);
$d = ucfirst($d);
$drivers[] = $d;
}
// Add firebird support, if exists
if (function_exists('fbird_connect'))
{
$drivers[] = "Firebird";
}
sort($drivers);
return $drivers;
}
// --------------------------------------------------------------------------
/**
* Adds a connection to the connection manager
* *
* @param wxCommandEvent * @param wxCommandEvent
* @return void * @return void
*/ */
public function change_db($event) public function add_conn($event)
{ {
$params = $this->_get_vals();
if (empty($params->name))
{
error("You need a name for the connection");
return;
}
$this->settings->add_db($params->name, $params);
}
// --------------------------------------------------------------------------
/**
* Set defaults for new database type
*
* @param wxCommandEvent
* @return void
*/
public function change_db($event)
{
$db = strtolower($event->GetString()); $db = strtolower($event->GetString());
$sizer = $this->GetSizer(); $sizer = $this->GetSizer();
$fields =& $this->fields; $fields =& $this->fields;
// Set defaults // Set defaults
$this->_show(array( $this->_show(array(
'Host', 'Host',
@ -239,13 +239,13 @@ class Connection_Manager extends \wxFrame {
'Password' 'Password'
)); ));
$this->_hide(array('Database File')); $this->_hide(array('Database File'));
$fields['User']->SetValue(''); $fields['User']->SetValue('');
$fields['Port']->SetValue(''); $fields['Port']->SetValue('');
$fields['Password']->SetValue(''); $fields['Password']->SetValue('');
$fields['Database Name']->SetValue(''); $fields['Database Name']->SetValue('');
$fields['Host']->SetValue('127.0.0.1'); $fields['Host']->SetValue('127.0.0.1');
// Set db-specific defaults // Set db-specific defaults
switch($db) switch($db)
{ {
@ -253,12 +253,12 @@ class Connection_Manager extends \wxFrame {
$fields['User']->SetValue('root'); $fields['User']->SetValue('root');
$fields['Port']->SetValue('3306'); $fields['Port']->SetValue('3306');
break; break;
case "postgresql": case "postgresql":
$fields['User']->SetValue('postgres'); $fields['User']->SetValue('postgres');
$fields['Port']->SetValue('5432'); $fields['Port']->SetValue('5432');
break; break;
case "firebird": case "firebird":
$fields['User']->SetValue('sysdba'); $fields['User']->SetValue('sysdba');
$fields['Password']->SetValue('masterkey'); $fields['Password']->SetValue('masterkey');
@ -269,10 +269,10 @@ class Connection_Manager extends \wxFrame {
'Port' 'Port'
)); ));
break; break;
case "sqlite": case "sqlite":
$this->_show(array('Database File')); $this->_show(array('Database File'));
$this->_hide(array( $this->_hide(array(
'Database Name', 'Database Name',
'Port', 'Port',
@ -282,81 +282,81 @@ class Connection_Manager extends \wxFrame {
)); ));
break; break;
} }
// Resize the window to fit the controls // Resize the window to fit the controls
$sizer->Fit($this); $sizer->Fit($this);
}
// --------------------------------------------------------------------------
/**
* Test a db connection, and display a popup with the result
*
* @return void
*/
public function test_conn()
{
// Get the connection parameters
$params = $this->_get_vals();
// Smart aleck error for smart aleck behavior
if (empty($params->type))
{
error("You need to select the correct database type");
return;
}
// Catch connection exceptions, and
// display the error message to the
// user so they can edit the db
// parameters
try
{
new \Query_Builder($params);
}
catch (\PDOException $e)
{
error("Error connecting to database: \n\n" . $e->getMessage());
return;
}
// Successful Connection?
// Tell the user!
alert("Successfully Connected.");
}
// --------------------------------------------------------------------------
/**
* Get the values of the widgets in the window
*
* @return object
*/
private function _get_vals()
{
$params = new \stdClass();
$fields =& $this->fields;
$types = $this->get_available_dbs();
$type_id = $fields['Database Type']->GetSelection();
$type = (isset($types[$type_id]))
? $types[$type_id]
: "";
$params->name = $fields['Connection Name']->GetValue();
$params->type = $type;
$params->file = $fields['Database File']->GetPath();
$params->conn_db = $fields['Database Name']->GetValue();
$params->host = $fields['Host']->GetValue();
$params->port = $fields['Port']->GetValue();
$params->user = $fields['User']->GetValue();
$params->pass = $fields['Password']->GetValue();
return $params;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/**
* Test a db connection, and display a popup with the result
*
* @return void
*/
public function test_conn()
{
// Get the connection parameters
$params = $this->_get_vals();
// Smart aleck error for smart aleck behavior
if (empty($params->type))
{
error("You need to select the correct database type");
return;
}
// Catch connection exceptions, and
// display the error message to the
// user so they can edit the db
// parameters
try
{
\Query($params);
}
catch (\PDOException $e)
{
error("Error connecting to database: \n\n" . $e->getMessage());
return;
}
// Successful Connection?
// Tell the user!
alert("Successfully Connected.");
}
// --------------------------------------------------------------------------
/**
* Get the values of the widgets in the window
*
* @return object
*/
private function _get_vals()
{
$params = new \stdClass();
$fields =& $this->fields;
$types = $this->get_available_dbs();
$type_id = $fields['Database Type']->GetSelection();
$type = (isset($types[$type_id]))
? $types[$type_id]
: "";
$params->name = $fields['Connection Name']->GetValue();
$params->type = $type;
$params->file = $fields['Database File']->GetPath();
$params->conn_db = $fields['Database Name']->GetValue();
$params->host = $fields['Host']->GetValue();
$params->port = $fields['Port']->GetValue();
$params->user = $fields['User']->GetValue();
$params->pass = $fields['Password']->GetValue();
return $params;
}
// --------------------------------------------------------------------------
/** /**
* Hides a list of elements * Hides a list of elements
* *
@ -366,16 +366,16 @@ class Connection_Manager extends \wxFrame {
{ {
$f =& $this->fields; $f =& $this->fields;
$l =& $this->labels; $l =& $this->labels;
foreach($ctrls as $c) foreach($ctrls as $c)
{ {
$f[$c]->Hide(); $f[$c]->Hide();
$l[$c]->Hide(); $l[$c]->Hide();
} }
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/** /**
* Shows a list of elements * Shows a list of elements
* *
@ -385,13 +385,13 @@ class Connection_Manager extends \wxFrame {
{ {
$f =& $this->fields; $f =& $this->fields;
$l =& $this->labels; $l =& $this->labels;
foreach($ctrls as $c) foreach($ctrls as $c)
{ {
$f[$c]->Show(); $f[$c]->Show();
$l[$c]->Show(); $l[$c]->Show();
} }
} }
} }
// End of connection_manager.php // End of connection_manager.php