Switch to PDO model

Switch to PDO model and correct transactions
This commit is contained in:
steve-lad 2021-02-06 17:26:37 +01:00
parent 7993eec487
commit 5e5633ed7b
2 changed files with 106 additions and 94 deletions

View file

@ -169,6 +169,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO {
$this->xml_data = simplexml_load_file($xml_vars); $this->xml_data = simplexml_load_file($xml_vars);
$this->initVarfromXml(); // Overwrite Exist $this->initVarfromXml(); // Overwrite Exist
} }
$this->saveSccpSettings();
} }
/* /*
@ -1483,10 +1484,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO {
} }
public function getSccpSettingFromDB() { public function getSccpSettingFromDB() {
$raw_data = $this->dbinterface->get_db_SccpSetting(); $this->sccpvalues = $this->dbinterface->get_db_SccpSetting();
foreach ($raw_data as $var) {
$this->sccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']);
}
return; return;
} }
@ -1864,19 +1862,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO {
// global $db; // global $db;
// global $amp_conf; // global $amp_conf;
$save_settings = array(); // $save_settings = array();
if (empty($save_value)) { if (empty($save_value)) {
foreach ($this->sccpvalues as $key => $val) { $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear');
/* foreach ($this->sccpvalues as $key => $val) {
if ((trim($val['data']) !== '') or ($val['data'] == '0')) { if ((trim($val['data']) !== '') or ($val['data'] == '0')) {
$save_settings[] = array($key, $db->escapeSimple($val['data']), $val['seq'], $val['type']); $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']);
} else {
$unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']);
} }
} }
$this->dbinterface->write('sccpsettings', $save_settings, 'clear'); $this->dbinterface->write('sccpsettings', $save_settings, 'clear');
*/
} else { } else {
$this->dbinterface->write('sccpsettings', $save_value, 'update'); $this->dbinterface->write('sccpsettings', $save_value, 'update');
return true;
} }
return true; return true;
// }
// return true;
} }
/* /*

View file

@ -21,7 +21,7 @@ class dbinterface
public function info() public function info()
{ {
$Ver = '13.0.2'; $Ver = '13.0.2'; // This should be updated
return array('Version' => $Ver, return array('Version' => $Ver,
'about' => 'Data access interface ver: ' . $Ver); 'about' => 'Data access interface ver: ' . $Ver);
} }
@ -45,25 +45,25 @@ class dbinterface
public function HWextension_db_SccpTableData($dataid, $data = array()) public function HWextension_db_SccpTableData($dataid, $data = array())
{ {
global $db;
$stmt = '';
$stmts = '';
if ($dataid == '') { if ($dataid == '') {
return false; return false;
} }
switch ($dataid) { switch ($dataid) {
case "SccpExtension": case "SccpExtension":
if (empty($data['name'])) { if (empty($data['name'])) {
$sql = "SELECT * FROM `sccpline` ORDER BY `name`"; $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name');
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC);
} else { } else {
$sql = "SELECT * FROM `sccpline` WHERE `name`='" . $data['name']. "'"; $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]');
;
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC);
} }
break; break;
case "SccpDevice": case "SccpDevice":
$filtred =''; $filtered ='';
$singlrow = false; $singlerow = false;
if (empty($data['fields'])) { if (empty($data['fields'])) {
$fld = '`name`,`name` as `mac`, `type`, `button`, `addon`, `_description` as description'; $fld = 'name, name as mac, type, button, addon, _description as description';
} else { } else {
switch ($data['fields']) { switch ($data['fields']) {
case "all": case "all":
@ -78,30 +78,29 @@ class dbinterface
} }
} }
if (!empty($data['name'])) { if (!empty($data['name'])) {
$filtred = "`name`='" . $data['name']. "'"; $filtered = 'name =' . $data['name']. '';
; $singlerow = true;
$singlrow = true;
} }
if (!empty($data['type'])) { if (!empty($data['type'])) {
switch ($data['type']) { switch ($data['type']) {
case "cisco-sip": case "cisco-sip":
$filtred = "`TYPE` LIKE '%-sip'"; $filtered = 'TYPE LIKE \'%-sip\'';
break; break;
case "cisco": case "cisco":
default: default:
$filtred = "`TYPE` not LIKE '%-sip'"; $filtered = 'TYPE not LIKE \'%-sip\'';
break; break;
} }
} }
if (empty($filtred)) { if (empty($filtered)) {
$sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` ORDER BY `name`"; $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig ORDER BY name';
} else { } else {
$sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` WHERE ".$filtred." ORDER BY `name`"; $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE '. $filtered . ' ORDER BY name';
} }
if ($singlrow) { if ($singlerow) {
$raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); $stmt = $db->prepare($sql);
} else { } else {
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmts = $db->prepare($sql);
} }
break; break;
case "HWSipDevice": case "HWSipDevice":
@ -115,26 +114,26 @@ class dbinterface
break; break;
case "get_colums_sccpdevice": case "get_colums_sccpdevice":
$sql = "DESCRIBE sccpdevice"; $sql = "DESCRIBE sccpdevice";
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmt = $db->prepare($sql);
break; break;
case "get_colums_sccpuser": case "get_colums_sccpuser":
$sql = "DESCRIBE sccpuser"; $sql = "DESCRIBE sccpuser";
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmts = $db->prepare($sql);
break; break;
case "get_sccpdevice_byid": case "get_sccpdevice_byid":
$sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, '
. 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 '
. 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model '
. 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . '";'; . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . '';
$raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); $stmt = $db->prepare($sql);
break; break;
case "get_sccpuser": case "get_sccpuser":
$sql = "SELECT * FROM `sccpuser` "; $sql = 'SELECT * FROM sccpuser ';
if (!empty($data['id'])) { if (!empty($data['id'])) {
$sql .= 'WHERE name="' . $data['id'] . '" '; $sql .= 'WHERE name= ' . $data['id'] . '';
} }
$sql .= "ORDER BY `name`;"; $sql .= ' ORDER BY name';
$raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); $stmt = $db->prepare($sql);
break; break;
case "get_sccpdevice_buttons": case "get_sccpdevice_buttons":
$sql = ''; $sql = '';
@ -145,29 +144,40 @@ class dbinterface
$sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" ';
} }
if (!empty($sql)) { if (!empty($sql)) {
$sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. 'ORDER BY `instance`;'; $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;';
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmts = $db->prepare($sql);
} else { } else {
$raw_settings = array(); $raw_settings = array();
} }
break; break;
} }
if (!empty($stmt)) {
$stmt->execute();
$raw_settings = $stmt->fetch(\PDO::FETCH_ASSOC);
} elseif (!empty($stmts)) {
$stmts->execute();
$raw_settings = $stmts->fetchAll(\PDO::FETCH_ASSOC);
}
return $raw_settings; return $raw_settings;
} }
public function get_db_SccpSetting() public function get_db_SccpSetting()
{ {
$sql = "SELECT `keyword`, `data`, `type`, `seq` FROM `sccpsettings` ORDER BY `type`, `seq`"; global $db;
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq');
return $raw_settings; $stmt->execute();
foreach ($stmt->fetchAll() as $var) {
$mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']);
}
return $mysccpvalues;
} }
public function get_db_sysvalues() public function get_db_sysvalues()
{ {
$sql = "SHOW VARIABLES LIKE '%group_concat%'"; global $db;
$raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); $stmt = $db->prepare('SHOW VARIABLES LIKE \'%group_concat%\'');
return $raw_settings; $stmt->execute();
return $stmt->fetch(\PDO::FETCH_ASSOC);
} }
/* /*
@ -186,20 +196,19 @@ class dbinterface
$sel_inf = "*"; $sel_inf = "*";
break; break;
} }
$sel_inf .= ", '0' as 'validate'"; $sel_inf .= ", '0' as 'validate'";
switch ($get) { switch ($get) {
case "byciscoid": case "byciscoid":
if (!empty($filter)) { if (!empty($filter)) {
if (!empty($filter['model'])) { if (!empty($filter['model'])) {
if (strpos($filter['model'], 'loadInformation')) { if (strpos($filter['model'], 'loadInformation')) {
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='" . $filter['model'] . "') ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model';
} else { } else {
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='loadInformation" . $filter['model'] . "') ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model';
} }
} else { } else {
// $sql = "SELECT ".$filter['model']; // $sql = "SELECT ".$filter['model'];
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model';
} }
break; break;
} }
@ -207,86 +216,87 @@ class dbinterface
case "byid": case "byid":
if (!empty($filter)) { if (!empty($filter)) {
if (!empty($filter['model'])) { if (!empty($filter['model'])) {
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`model` ='" . $filter['model'] . "') ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model';
} else { } else {
// $sql = "SELECT ".$filter['model']; // $sql = "SELECT ".$filter['model'];
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model';
} }
break; break;
} }
break; break;
case "extension": case "extension":
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table
break; break;
case "enabled": case "enabled":
$sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model ';
break;
case "phones": case "phones":
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table
// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model ";
break; break;
case "ciscophones": case "ciscophones":
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` not LIKE '%-sip' ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model';
// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model ";
break; break;
case "sipphones": case "sipphones":
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE '%-sip' ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model';
// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model ";
break; break;
case "all": case "all":
$sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model';
break;
default: default:
$sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model';
break; break;
} }
$raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmt = $db->prepare($sql);
return $raw_settings; $stmt->execute();
return $stmt->fetchAll();
} }
function write($db_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "")
{ {
// mode clear - Empty tabele before update // mode clear - Empty table before update
// mode update - update / replace record // mode update - update / replace record
global $db; global $db;
// global $amp_conf; // global $amp_conf;
$result = "Error"; $result = false;
$delete_value = array(); $delete_value = array();
switch ($db_name) { switch ($table_name) {
case 'sccpsettings': case 'sccpsettings':
foreach ($save_value as $key_v => $data) { foreach ($save_value as $key_v => $data) {
if (!empty($data)) { if (!empty($data) && isset($data['data'])) {
if (isset($data[1])) { if ($data['data'] == $this->val_null) {
if ($data[1] == $this->val_null) {
$delete_value[] = $save_value[$key_v]['keyword']; $delete_value[] = $save_value[$key_v]['keyword'];
unset($save_value[$key_v]); unset($save_value[$key_v]);
} }
} /* if (isset($data['data'])) {
if (isset($data['data'])) {
if ($data['data'] == $this->val_null) { if ($data['data'] == $this->val_null) {
$delete_value[] = $save_value[$key_v]['keyword']; $delete_value[] = $save_value[$key_v]['keyword'];
unset($save_value[$key_v]); unset($save_value[$key_v]);
} }
} }
} */ }
} }
if ($mode == 'clear') { if ($mode == 'clear') {
$sql = 'truncate `sccpsettings`'; // $sql = 'truncate `sccpsettings`';
$stmt = $db->prepare($sql); $db->prepare('TRUNCATE sccpsettings')->execute();
$stmt->execute(); $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)');
$stmt = $db->prepare('INSERT INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)');
$result = $db->executeMultiple($stmt, $save_value); $result = $db->executeMultiple($stmt, $save_value);
} else { } else {
if (!empty($delete_value)) { if (!empty($delete_value)) {
$stmt = $db->prepare('DELETE FROM `sccpsettings` WHERE `keyword`=?'); $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?');
$result = $db->executeMultiple($stmt, $delete_value); $result = $db->executeMultiple($stmt, $delete_value);
} }
if (!empty($save_value)) { if (!empty($save_value)) {
$stmt = $db->prepare('REPLACE INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)');
$result = $db->executeMultiple($stmt, $save_value); $result = $db->executeMultiple($stmt, $save_value);
} }
} }
break; break;
case 'sccpdevmodel': case 'sccpdevmodel':
break;
case 'sccpdevice': case 'sccpdevice':
break;
case 'sccpuser': case 'sccpuser':
$sql_db = $db_name; $sql_db = $table_name;
$sql_key = ""; $sql_key = "";
$sql_var = ""; $sql_var = "";
foreach ($save_value as $key_v => $data) { foreach ($save_value as $key_v => $data) {
@ -304,23 +314,21 @@ class dbinterface
} }
if (!empty($sql_var)) { if (!empty($sql_var)) {
if ($mode == 'delete') { if ($mode == 'delete') {
$req = 'DELETE FROM `' . $sql_db . '` WHERE ' . $sql_key . ';'; $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . '';
} else { } else {
if ($mode == 'update') { if ($mode == 'update') {
$req = 'UPDATE `' . $sql_db . '` SET ' . $sql_var . ' WHERE ' . $sql_key . ';'; $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . '';
} else { } else {
$req = 'REPLACE INTO `' . $sql_db . '` SET ' . $sql_var . ';'; $req = 'REPLACE INTO sccpuser SET ' . $sql_var . '';
} }
} }
} }
$stmt = $db->prepare($req); $result = $db->prepare($req)->execute();
$result = $stmt->execute();
break; break;
case 'sccpbuttons': case 'sccpbuttons':
if (($mode == 'clear') || ($mode == 'delete')) { if (($mode == 'clear') || ($mode == 'delete')) {
$sql = 'DELETE FROM `sccpbuttonconfig` WHERE ref="' . $hwid . '";'; $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . '';
$stmt = $db->prepare($sql); $result = $db->prepare($sql)->execute();
$stmt->execute();
} }
if ($mode == 'delete') { if ($mode == 'delete') {
break; break;
@ -329,13 +337,13 @@ class dbinterface
break; break;
} }
if ($mode == 'replace') { if ($mode == 'replace') {
$sql = 'UPDATE `sccpbuttonconfig` SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?;'; $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?';
// $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; // $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);';
// die(print_r($save_value,1)); // die(print_r($save_value,1));
$stmt = $db->prepare($sql); $stmt = $db->prepare($sql);
$result= $db->executeMultiple($stmt, $save_value); $result= $db->executeMultiple($stmt, $save_value);
} else { } else {
$sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)';
// die(print_r($save_value,1)); // die(print_r($save_value,1));
$stmt = $db->prepare($sql); $stmt = $db->prepare($sql);
$result = $db->executeMultiple($stmt, $save_value); $result = $db->executeMultiple($stmt, $save_value);
@ -356,18 +364,18 @@ class dbinterface
$result = exec('mysqldump '.$database.' --password='.$pass.' --user='.$user.' --single-transaction >'.$filename, $output); $result = exec('mysqldump '.$database.' --password='.$pass.' --user='.$user.' --single-transaction >'.$filename, $output);
return $filename; return $filename;
} }
/* /*
* Check Table structure * Check Table structure
*/ */
public function validate() public function validate()
{ {
global $db; global $db;
$result = false;
$check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') );
$sql = "DESCRIBE `sccpdevice`;"; $stmt = $db->prepare('DESCRIBE sccpdevice');
$raw_result = sql($sql, "getAll", DB_FETCHMODE_ASSOC); $stmt->execute();
$result = 0; foreach ($stmt->fetchAll() as $value) {
foreach ($raw_result as $value) {
$id_result[$value['Field']] = $value['Type']; $id_result[$value['Field']] = $value['Type'];
} }
foreach ($check_fields as $key => $value) { foreach ($check_fields as $key => $value) {
@ -393,7 +401,7 @@ class dbinterface
break; break;
} }
} }
return $result; return $result;
} }
} }