2 Commits

Author SHA1 Message Date
80e889946b improved Maintenance for MySQL and SQLite DB type 2025-10-13 23:26:19 +02:00
cf59109a47 extend compatibility for SQLite3 2025-10-01 01:12:46 +02:00
4 changed files with 77 additions and 12 deletions

View File

@ -4,7 +4,7 @@
"description": "This library extends the builtin PDO object by several useful features. ",
"type": "library",
"readme": "README.md",
"keywords": ["db", "model", "pdo"],
"keywords": ["db", "model", "pdo", "mysql", "sqlite"],
"authors": [
{
"name": "Igor Mino",

View File

@ -21,8 +21,9 @@ class Creator {
public function interact() {
$name = $this->readline('New model name: ');
$table = $this->readline('Table name: ');
$entity = $this->readline('Entity name: ');
$table = strtolower($name);
$table = $this->readline('Table name ['.$table.']: ', $table);
$entity = $this->readline('Entity name ['.$table.']: ', $table);
$namespace = $this->readline('Namespace [App\Models]: ', 'App\Models');
if (strlen($entity) <= 0) {
$entity = $table;

View File

@ -154,6 +154,11 @@ class DBmodel
return $where;
}
public function getDBtype()
{
return $this->dbh->getAttribute(\PDO::ATTR_DRIVER_NAME);
}
public function existTable($table_id)
{
$query = sprintf(
@ -269,11 +274,14 @@ class DBmodel
return false;
}
if (count($primary_key_names) > 1) return true;
$last_id = $this->getLastInsertID();
/*
if (method_exists($this->dbh, 'getLastInsertID')) {
$last_id = $this->getLastInsertID();
} else {
$last_id = $this->getOne('SELECT last_insert_id()');
}
*/
return $last_id;
}
@ -304,12 +312,14 @@ class DBmodel
$query = sprintf(
'UPDATE %s'
. ' SET %s'
. ' WHERE %s'
. ' LIMIT 1',
. ' WHERE %s',
$table,
$set,
$this->buildWherePrimaryKey($table_id, $primary_key)
);
if ($this->getDBtype() == 'mysql') {
$query .= ' LIMIT 1';
}
$this->_debug('[DBmodel][record][UPDATE]: ' . $query);
$ret = $this->query($query);
if ($ret === false) {
@ -331,11 +341,13 @@ class DBmodel
}
$query = sprintf(
'DELETE FROM %s'
. ' WHERE %s'
. ' LIMIT 1',
. ' WHERE %s',
$table,
$this->buildWherePrimaryKey($table_id, $primary_key)
);
if ($this->getDBtype() == 'mysql') {
$query .= ' LIMIT 1';
}
$this->_debug('[DBmodel][record][DELETE]: ' . $query);
$ret = $this->query($query);
if ($ret === false) {
@ -548,6 +560,15 @@ class DBmodel
}
public function getTableColumns($table_name) {
$db_type = $this->getDBtype();
switch ($db_type) {
case 'mysql': return $this->getTableColumnsMYSQL($table_name);
case 'sqlite': return $this->getTableColumnsSQLITE($table_name);
default: new \Exception('Unknown DB type: ' . $db_type);
}
}
public function getTableColumnsMYSQL($table_name) {
$desc = $this->getAll(sprintf('DESC %s', $table_name));
$desc = $this->arrayKeysToLowerCase($desc);
$pks = array();
@ -567,6 +588,26 @@ class DBmodel
return array('pks' => $pks, 'columns' => $columns, 'types' => $types);
}
public function getTableColumnsSQLITE($table_name) {
$desc = $this->getAll(sprintf('PRAGMA table_info(%s)', $table_name));
$desc = $this->arrayKeysToLowerCase($desc);
$pks = array();
$columns = array();
foreach ($desc as $d) {
$colname = $d['name'];
$types[$colname] = $d['type'];
if ($d['pk'] == 1) {
$pks[] = $colname;
if (strtoupper($d['type']) != 'INTEGER') {
$columns[] = $colname;
}
} else {
$columns[] = $colname;
}
}
return array('pks' => $pks, 'columns' => $columns, 'types' => $types);
}
/* ----------------------------------------------------
* HELPER METHODS
*/

View File

@ -81,10 +81,21 @@ class Maintenance
public function existsTable($table_name)
{
return $this->testDB(
'SHOW TABLES LIKE "' . $table_name . '"',
$table_name
);
$db_type = $this->dbh->getDBtype();
switch ($db_type) {
case 'mysql':
return $this->testDB(
'SHOW TABLES LIKE "' . $table_name . '"',
$table_name
);
case 'sqlite':
return $this->testDB(
'SELECT name FROM sqlite_master WHERE TYPE = "table" AND name LIKE "' . $table_name . '"',
$table_name
);
default:
new \Exception('Unknown DB type: ' . $db_type);
}
}
public function checkDBTable($table_name, $definition, $after_definition = '')
@ -93,9 +104,21 @@ class Maintenance
$this->lastMessage = 'Table ' . strtoupper($table_name) . ' - invalid index';
return Maintenance::ABNORMAL;
}
$check_query = '';
$db_type = $this->dbh->getDBtype();
switch ($db_type) {
case 'mysql':
$check_query = 'SHOW TABLES LIKE "' . $table_name . '"';
break;
case 'sqlite':
$check_query = 'SELECT name FROM sqlite_master WHERE TYPE = "table" AND name LIKE "' . $table_name . '"';
break;
default:
new \Exception('Unknown DB type: ' . $db_type);
}
$status = $this->checkDB(
// TEST query
'SHOW TABLES LIKE "' . $table_name . '"',
$check_query,
// TEST output
$table_name,
// FIX query