'lib' rewritten.

This commit is contained in:
Marcin Łojewski
2018-03-02 22:56:13 +01:00
parent ed5ec82479
commit c1cc89f456
62 changed files with 4788 additions and 2971 deletions

View File

@@ -0,0 +1,135 @@
<?php
/**
* Nextcloud - user_sql
*
* @copyright 2018 Marcin Łojewski <dev@mlojewski.me>
* @author Marcin Łojewski <dev@mlojewski.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace OCA\UserSQL\Platform;
use Doctrine\DBAL\DBALException;
use OC\DB\Connection;
/**
* Database platform tools.
*
* @author Marcin Łojewski <dev@mlojewski.me>
*/
abstract class AbstractPlatform
{
/**
* @var Connection The database connection.
*/
protected $connection;
/**
* The class constructor.
*
* @param Connection $connection The database connection.
*/
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
/**
* Get all the tables defined in the database.
*
* @param bool $schemaPrefix Show schema name in the results.
*
* @return array Array with table names.
* @throws DBALException On a database exception.
*/
public function getTables($schemaPrefix = false)
{
$platform = $this->connection->getDatabasePlatform();
$queryTables = $platform->getListTablesSQL();
$queryViews = $platform->getListViewsSQL(
$this->connection->getDatabase()
);
$tables = array();
$result = $this->connection->executeQuery($queryTables);
while ($row = $result->fetch()) {
$name = $this->getTableName($row, $schemaPrefix);
$tables[] = $name;
}
$result = $this->connection->executeQuery($queryViews);
while ($row = $result->fetch()) {
$name = $this->getViewName($row, $schemaPrefix);
$tables[] = $name;
}
return $tables;
}
/**
* Get a table name from a query result row.
*
* @param array $row The query result row.
* @param string $schema Put schema name in the result.
*
* @return string The table name retrieved from the row.
*/
protected abstract function getTableName($row, $schema);
/**
* Get a view name from a query result row.
*
* @param array $row The query result row.
* @param string $schema Put schema name in the result.
*
* @return string The view name retrieved from the row.
*/
protected abstract function getViewName($row, $schema);
/**
* Get all the columns defined in the table.
*
* @param string $table The table name.
*
* @return array Array with column names.
* @throws DBALException On a database exception.
*/
public function getColumns($table)
{
$platform = $this->connection->getDatabasePlatform();
$query = $platform->getListTableColumnsSQL($table);
$result = $this->connection->executeQuery($query);
$columns = array();
while ($row = $result->fetch()) {
$name = $this->getColumnName($row);
$columns[] = $name;
}
return $columns;
}
/**
* Get a column name from a query result row.
*
* @param array $row The query result row.
*
* @return string The column name retrieved from the row.
*/
protected abstract function getColumnName($row);
}

View File

@@ -0,0 +1,66 @@
<?php
/**
* Nextcloud - user_sql
*
* @copyright 2018 Marcin Łojewski <dev@mlojewski.me>
* @author Marcin Łojewski <dev@mlojewski.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace OCA\UserSQL\Platform;
use OC\DB\Connection;
/**
* MySQL database platform.
*
* @author Marcin Łojewski <dev@mlojewski.me>
*/
class MySQLPlatform extends AbstractPlatform
{
/**
* The class constructor.
*
* @param Connection $connection The database connection.
*/
public function __construct(Connection $connection)
{
parent::__construct($connection);
}
/**
* @inheritdoc
*/
protected function getViewName($row, $schema)
{
return $row["TABLE_NAME"];
}
/**
* @inheritdoc
*/
protected function getTableName($row, $schema)
{
return $row["Tables_in_" . $this->connection->getDatabase()];
}
/**
* @inheritdoc
*/
protected function getColumnName($row)
{
return $row["Field"];
}
}

View File

@@ -0,0 +1,54 @@
<?php
/**
* Nextcloud - user_sql
*
* @copyright 2018 Marcin Łojewski <dev@mlojewski.me>
* @author Marcin Łojewski <dev@mlojewski.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace OCA\UserSQL\Platform;
use OC\DB\Connection;
/**
* Factory for the database platform class instance.
*
* @author Marcin Łojewski <dev@mlojewski.me>
*/
class PlatformFactory
{
/**
* Get the database platform.
*
* @param Connection $connection The database connection.
*
* @return AbstractPlatform The database platform.
*/
public static function getPlatform(Connection $connection)
{
switch ($connection->getDriver()->getName()) {
case "pdo_mysql":
return new MySQLPlatform($connection);
case "pdo_pgsql":
return new PostgreSQLPlatform($connection);
default:
throw new \InvalidArgumentException(
"Unknown database driver: " . $connection->getDriver()->getName(
)
);
}
}
}

View File

@@ -0,0 +1,68 @@
<?php
/**
* Nextcloud - user_sql
*
* @copyright 2018 Marcin Łojewski <dev@mlojewski.me>
* @author Marcin Łojewski <dev@mlojewski.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace OCA\UserSQL\Platform;
use OC\DB\Connection;
/**
* PostgreSQL database platform.
*
* @author Marcin Łojewski <dev@mlojewski.me>
*/
class PostgreSQLPlatform extends AbstractPlatform
{
/**
* The class constructor.
*
* @param Connection $connection The database connection.
*/
public function __construct(Connection $connection)
{
parent::__construct($connection);
}
/**
* @inheritdoc
*/
protected function getViewName($row, $schema)
{
$schema ? ($row["schemaname"] . "." . $row["viewname"])
: $row["viewname"];
}
/**
* @inheritdoc
*/
protected function getTableName($row, $schema)
{
$schema ? ($row["schema_name"] . "." . $row["table_name"])
: $row["table_name"];
}
/**
* @inheritdoc
*/
protected function getColumnName($row)
{
return $row["field"];
}
}