Skip to content

Commit 105f5b6

Browse files
committed
Autocomplete for PostreSQL
1 parent c6956d2 commit 105f5b6

File tree

3 files changed

+119
-18
lines changed

3 files changed

+119
-18
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## [Unreleased]
8+
### Added
9+
- Column autocomplete for PostgreSQL
10+
- Currently supported parameters in README.md
11+
712
## [2.4.0] - 2017-12-26
813
### Added
914
- This CHANGELOG.md file

README.md

+37-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,43 @@ specified user to login into any account. Use supervisor username and target
2020
username separated by ';' to login as target user using supervisor's password
2121
(ex. superuser;user).
2222

23-
Credits
23+
The column autocomplete works only for MySQL and PostgreSQL database which is used to validate form data.
24+
If you use other database use *occ* command to set the application config parameters with domain suffix.
25+
26+
For example to set 'sql_hostname' parameter in default domain use:
27+
28+
```occ config:app:set user_sql 'sql_hostname_default' --value='localhost'```
29+
30+
### Currently supported parameters
31+
32+
- sql_hostname
33+
- sql_username
34+
- sql_password
35+
- sql_database
36+
- sql_table
37+
- sql_driver
38+
- col_username
39+
- col_password
40+
- col_active
41+
- col_displayname
42+
- col_email
43+
- col_gethome
44+
- set_active_invert
45+
- set_supervisor
46+
- supervisor
47+
- set_allow_pwchange
48+
- set_default_domain
49+
- set_strip_domain
50+
- set_crypt_type
51+
- set_mail_sync_mode
52+
- set_enable_gethome
53+
- set_gethome_mode
54+
- set_gethome
55+
- sql_group_table
56+
- col_group_username
57+
- col_group_name
58+
59+
### Credits
2460

2561
* Andreas Boehler for releasing the first version of this application
2662
* Johan Hendriks provided his user_postfixadmin

lib/helper.php

+77-17
Original file line numberDiff line numberDiff line change
@@ -304,35 +304,39 @@ public function verifyColumns($parameters, $sql_driver, $table, $cols)
304304
*/
305305
public function verifyTable($parameters, $sql_driver, $table)
306306
{
307-
$tables = $this->getTables($parameters, $sql_driver);
308-
return in_array($table, $tables, true);
307+
$tablesWithSchema = $this->getTables($parameters, $sql_driver, true);
308+
$tablesWithoutSchema = $this->getTables($parameters, $sql_driver, false);
309+
return in_array($table, $tablesWithSchema, true) || in_array($table, $tablesWithoutSchema, true);
309310
}
310311

311312
/**
312313
* Retrieve a list of tables for the given connection parameters
313314
* @param array $parameters The connection parameters
314315
* @param string $sql_driver The SQL driver to use
315-
* @return array The found tables, empty if an error occured
316+
* @param boolean $schema Return table name with schema
317+
* @return array The found tables, empty if an error occurred
316318
*/
317-
public function getTables($parameters, $sql_driver)
319+
public function getTables($parameters, $sql_driver, $schema = true)
318320
{
319321
$cm = new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig());
320322
try {
321323
$conn = $cm -> getConnection($sql_driver, $parameters);
322324
$platform = $conn -> getDatabasePlatform();
323325

324-
$queries = array(
325-
'Tables_in_'.$parameters['dbname'] => $platform -> getListTablesSQL(),
326-
'TABLE_NAME' => $platform -> getListViewsSQL($parameters['dbname']));
326+
$queryTables = $platform->getListTablesSQL();
327+
$queryViews = $platform->getListViewsSQL($parameters['dbname']);
327328
$ret = array();
328-
foreach($queries as $field => $query)
329-
{
330-
$result = $conn -> executeQuery($query);
331-
while($row = $result -> fetch())
332-
{
333-
$name = $row[$field];
334-
$ret[] = $name;
335-
}
329+
330+
$result = $conn->executeQuery($queryTables);
331+
while ($row = $result->fetch()) {
332+
$name = $this->getTableNameFromRow($sql_driver, $parameters['dbname'], $row, $schema);
333+
$ret[] = $name;
334+
}
335+
336+
$result = $conn->executeQuery($queryViews);
337+
while ($row = $result->fetch()) {
338+
$name = $this->getViewNameFromRow($sql_driver, $row, $schema);
339+
$ret[] = $name;
336340
}
337341
return $ret;
338342
}
@@ -341,7 +345,54 @@ public function getTables($parameters, $sql_driver)
341345
return array();
342346
}
343347
}
344-
348+
349+
/**
350+
* Retrieve table name from database list table SQL
351+
* @param string $sql_driver The SQL driver to use
352+
* @param string $dbname The database name
353+
* @param array $row Query result row
354+
* @param boolean $schema Return table name with schema
355+
* @return string Table name
356+
*/
357+
public function getTableNameFromRow($sql_driver, $dbname, $row, $schema)
358+
{
359+
switch ($sql_driver) {
360+
case 'mysql':
361+
return $row['Tables_in_' . $dbname];
362+
case 'pgsql':
363+
if ($schema) {
364+
return $row['schema_name'] . '.' . $row['table_name'];
365+
} else {
366+
return $row['table_name'];
367+
}
368+
default:
369+
return null;
370+
}
371+
}
372+
373+
/**
374+
* Retrieve view name from database list table SQL
375+
* @param string $sql_driver The SQL driver to use
376+
* @param array $row Query result row
377+
* @param boolean $schema Return table name with schema
378+
* @return string Table name
379+
*/
380+
public function getViewNameFromRow($sql_driver, $row, $schema)
381+
{
382+
switch ($sql_driver) {
383+
case 'mysql':
384+
return $row['TABLE_NAME'];
385+
case 'pgsql':
386+
if ($schema) {
387+
return $row['schemaname'] . '.' . $row['viewname'];
388+
} else {
389+
return $row['viewname'];
390+
}
391+
default:
392+
return null;
393+
}
394+
}
395+
345396
/**
346397
* Retrieve a list of columns for the given connection parameters
347398
* @param array $parameters The connection parameters
@@ -360,7 +411,16 @@ public function getColumns($parameters, $sql_driver, $table)
360411
$ret = array();
361412
while($row = $result -> fetch())
362413
{
363-
$name = $row['Field'];
414+
switch ($sql_driver) {
415+
case 'mysql':
416+
$name = $row['Field'];
417+
break;
418+
case 'pgsql':
419+
$name = $row['field'];
420+
break;
421+
default:
422+
return $ret;
423+
}
364424
$ret[] = $name;
365425
}
366426
return $ret;

0 commit comments

Comments
 (0)