SF.net SVN: postfixadmin:[1824] trunk
Brought to you by:
christian_boltz,
gingerdog
From: <chr...@us...> - 2016-02-04 22:30:08
|
Revision: 1824 http://sourceforge.net/p/postfixadmin/code/1824 Author: christian_boltz Date: 2016-02-04 22:30:06 +0000 (Thu, 04 Feb 2016) Log Message: ----------- Merge pull request #9 from phyrog/master Add sqlite backend option (thank you @phyrog for doing this) (imported from github) Modified Paths: -------------- trunk/config.inc.php trunk/functions.inc.php trunk/model/FetchmailHandler.php trunk/model/PFAHandler.php trunk/setup.php trunk/upgrade.php Modified: trunk/config.inc.php =================================================================== --- trunk/config.inc.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/config.inc.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -80,6 +80,7 @@ // mysql = MySQL 3.23 and 4.0, 4.1 or 5 // mysqli = MySQL 4.1+ or MariaDB // pgsql = PostgreSQL +// sqlite = SQLite 3 $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; @@ -90,6 +91,8 @@ // If you need to specify a different port for POSTGRESQL database connection // uncomment and change the following // $CONF['database_port'] = '5432'; +// If sqlite is used, specify the database file path: +// $CONF['database_name'] = '/etc/postfix/sqlite/postfixadmin.db' // Here, if you need, you can customize table names. $CONF['database_prefix'] = ''; Modified: trunk/functions.inc.php =================================================================== --- trunk/functions.inc.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/functions.inc.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -302,6 +302,9 @@ if ($CONF['database_type'] == "mysqli") { $escaped_string = mysqli_real_escape_string($link, $string); } + if (db_sqlite()) { + $escaped_string = SQLite3::escapeString($string); + } if (db_pgsql()) { // php 5.2+ allows for $link to be specified. if (version_compare(phpversion(), "5.2.0", ">=")) { @@ -490,7 +493,9 @@ if (db_pgsql()) { $initcount = "CREATE TEMPORARY SEQUENCE rowcount MINVALUE 0"; } - $result = db_query($initcount); + if (!db_sqlite()) { + $result = db_query($initcount); + } # get labels for relevant rows (first and last of each page) $page_size_zerobase = $page_size - 1; @@ -507,6 +512,15 @@ ) idx WHERE MOD(idx.row, $page_size) IN (0,$page_size_zerobase) OR idx.row = $count_results "; } + + if (db_sqlite()) { + $query = " + WITH idx AS (SELECT * $querypart) + SELECT $idxfield AS label, (SELECT (COUNT(*) - 1) FROM idx t1 WHERE t1.$idxfield <= t2.$idxfield) AS row + FROM idx t2 + WHERE (row % $page_size) IN (0,$page_size_zerobase) OR row = $count_results"; + } + # echo "<p>$query"; # TODO: $query is MySQL-specific @@ -1249,6 +1263,17 @@ } else { $error_text .= "<p />DEBUG INFORMATION:<br />MySQL 4.1 functions not available! (php5-mysqli installed?)<br />database_type = 'mysqli' in config.inc.php, are you using a different database? $DEBUG_TEXT"; } + } elseif (db_sqlite()) { + if (class_exists ("SQLite3")) { + if ($CONF['database_name'] == '' || !is_dir(dirname($CONF['database_name'])) || !is_writable(dirname($CONF['database_name']))) { + $error_text .= ("<p />DEBUG INFORMATION<br />Connect: given database path does not exist, is not writable, or \$CONF['database_name'] is empty."); + } else { + $link = new SQLite3($CONF['database_name']) or $error_text .= ("<p />DEBUG INFORMATION<br />Connect: failed to connect to database. $DEBUG_TEXT"); + $link->createFunction('base64_decode', 'base64_decode'); + } + } else { + $error_text .= "<p />DEBUG INFORMATION:<br />SQLite functions not available! (php5-sqlite installed?)<br />database_type = 'sqlite' in config.inc.php, are you using a different database? $DEBUG_TEXT"; + } } elseif (db_pgsql()) { if (function_exists ("pg_pconnect")) { if(!isset($CONF['database_port'])) { @@ -1299,7 +1324,7 @@ return 't'; } return 'f'; - } elseif(Config::Read('database_type') == 'mysql' || Config::Read('database_type') == 'mysqli') { + } elseif(Config::Read('database_type') == 'mysql' || Config::Read('database_type') == 'mysqli' || db_sqlite()) { if($bool) { return 1; } @@ -1317,11 +1342,21 @@ * @return string */ function db_quota_text($count, $quota, $fieldname) { - return " CASE $quota - WHEN '-1' THEN CONCAT(coalesce($count,0), ' / -') - WHEN '0' THEN CONCAT(coalesce($count,0), ' / ', '" . escape_string(html_entity_decode('∞')) . "') - ELSE CONCAT(coalesce($count,0), ' / ', $quota) - END AS $fieldname"; + if (db_sqlite()) { + // SQLite uses || to concatenate strings + return " CASE $quota + WHEN '-1' THEN (coalesce($count,0) || ' / -') + WHEN '0' THEN (coalesce($count,0) || ' / " . escape_string(html_entity_decode('∞')) . "') + ELSE (coalesce($count,0) || ' / ' || $quota) + END AS $fieldname"; + } + else { + return " CASE $quota + WHEN '-1' THEN CONCAT(coalesce($count,0), ' / -') + WHEN '0' THEN CONCAT(coalesce($count,0), ' / ', '" . escape_string(html_entity_decode('∞')) . "') + ELSE CONCAT(coalesce($count,0), ' / ', $quota) + END AS $fieldname"; + } } /** @@ -1350,6 +1385,17 @@ } } +/** + * returns true if SQLite is used, false otherwise + */ +function db_sqlite() { + if(Config::Read('database_type')=='sqlite') { + return true; + } else { + return false; + } +} + // // db_query // Action: Sends a query to the database and returns query result and number of rows @@ -1372,6 +1418,8 @@ or $error_text = "Invalid query: " . mysql_error($link); if ($CONF['database_type'] == "mysqli") $result = @mysqli_query ($link, $query) or $error_text = "Invalid query: " . mysqli_error($link); + if (db_sqlite()) $result = @$link->query($query) + or $error_text = "Invalid query: " . $link->lastErrorMsg(); if (db_pgsql()) { $result = @pg_query ($link, $query) or $error_text = "Invalid query: " . pg_last_error(); @@ -1383,7 +1431,18 @@ } if ($error_text == "") { - if (preg_match("/^SELECT/i", trim($query))) { + if (db_sqlite()) { + if($result->numColumns()) { + // Query returned something + $num_rows = 0; + while(@$result->fetchArray(SQLITE3_ASSOC)) $num_rows++; + $result->reset(); + $number_rows = $num_rows; + } else { + // Query was UPDATE, DELETE or INSERT + $number_rows = $link->changes(); + } + } elseif (preg_match("/^SELECT/i", trim($query))) { // if $query was a SELECT statement check the number of rows with [database_type]_num_rows (). if ($CONF['database_type'] == "mysql") $number_rows = mysql_num_rows ($result); if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_num_rows ($result); @@ -1416,6 +1475,7 @@ $row = ""; if ($CONF['database_type'] == "mysql") $row = mysql_fetch_row ($result); if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_row ($result); + if (db_sqlite() ) $row = $result->fetchArray(SQLITE3_NUM); if (db_pgsql() ) $row = pg_fetch_row ($result); return $row; } @@ -1431,6 +1491,7 @@ $row = ""; if ($CONF['database_type'] == "mysql") $row = mysql_fetch_array ($result); if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_array ($result); + if (db_sqlite() ) $row = $result->fetchArray(); if (db_pgsql() ) $row = pg_fetch_array ($result); return $row; } @@ -1446,6 +1507,7 @@ $row = ""; if ($CONF['database_type'] == "mysql") $row = mysql_fetch_assoc ($result); if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_assoc ($result); + if (db_sqlite() ) $row = $result->fetchArray(SQLITE3_ASSOC); if (db_pgsql() ) $row = pg_fetch_assoc ($result); return $row; } @@ -1487,7 +1549,11 @@ } foreach($timestamp as $key) { - $values[$key] = "now()"; + if (db_sqlite()) { + $values[$key] = "datetime('now')"; + } else { + $values[$key] = "now()"; + } } $sql_values = "(" . implode(",",escape_string(array_keys($values))).") VALUES (".implode(",",$values).")"; @@ -1531,7 +1597,11 @@ } foreach($timestamp as $key) { - $sql_values[$key] = escape_string($key) . "=now()"; + if (db_sqlite()) { + $sql_values[$key] = escape_string($key) . "=datetime('now')"; + } else { + $sql_values[$key] = escape_string($key) . "=now()"; + } } $sql="UPDATE $table SET ".implode(",",$sql_values)." WHERE $where"; Modified: trunk/model/FetchmailHandler.php =================================================================== --- trunk/model/FetchmailHandler.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/model/FetchmailHandler.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -21,7 +21,7 @@ $this->struct=array( # field name allow display in... type $PALANG label $PALANG description default / options / ... # editing? form list - 'id' => pacol( 0, 0, 1, 'num' , '' , '' ), + 'id' => pacol( 0, 0, 1, 'num' , '' , '' , '', array(), 0, 1), 'domain' => pacol( 0, 0, 1, 'text', '' , '' ), 'mailbox' => pacol( 1, 1, 1, 'enum', 'pFetchmail_field_mailbox' , 'pFetchmail_desc_mailbox' ), # mailbox list 'src_server' => pacol( 1, 1, 1, 'text', 'pFetchmail_field_src_server' , 'pFetchmail_desc_src_server' ), Modified: trunk/model/PFAHandler.php =================================================================== --- trunk/model/PFAHandler.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/model/PFAHandler.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -567,6 +567,10 @@ if (db_pgsql()) { $formatted_date = "TO_DATE(text(###KEY###), '" . escape_string(Config::Lang('dateformat_pgsql')) . "')"; $base64_decode = "DECODE(###KEY###, 'base64')"; + } elseif (db_sqlite()) { + $formatted_date = "strftime(###KEY###, '" . escape_string(Config::Lang('dateformat_mysql')) . "')"; + $base64_decode = "base64_decode(###KEY###)"; + } else { $formatted_date = "DATE_FORMAT(###KEY###, '" . escape_string(Config::Lang('dateformat_mysql')) . "')"; $base64_decode = "FROM_BASE64(###KEY###)"; Modified: trunk/setup.php =================================================================== --- trunk/setup.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/setup.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -47,6 +47,7 @@ $f_mysql_connect = function_exists ("mysql_connect"); $f_mysqli_connect = function_exists ("mysqli_connect"); $f_pg_connect = function_exists ("pg_connect"); +$f_sqlite_open = class_exists("SQLite3"); $f_session_start = function_exists ("session_start"); $f_preg_match = function_exists ("preg_match"); $f_mb_encode_mimeheader = function_exists ("mb_encode_mimeheader"); @@ -162,7 +163,7 @@ // // Check if there is support for at least 1 database // -if (($f_mysql_connect == 0) and ($f_mysqli_connect == 0) and ($f_pg_connect == 0)) +if (($f_mysql_connect == 0) and ($f_mysqli_connect == 0) and ($f_pg_connect == 0) and ($f_sqlite_open == 0)) { print "<li><b>Error: There is no database support in your PHP setup</b><br />\n"; print "To install MySQL 3.23 or 4.0 support on FreeBSD:<br />\n"; @@ -220,6 +221,15 @@ print "</li>"; } +if ($f_sqlite_open == 1) +{ + print "<li>Depends on: SQLite - OK \n"; + if ( !($config_loaded && db_sqlite()) ) { + print "<br>(change the database_type to 'sqlite' in config.inc.php if you want to use SQLite)\n"; + } + print "</li>"; +} + // // Database connection // Modified: trunk/upgrade.php =================================================================== --- trunk/upgrade.php 2016-01-12 12:07:25 UTC (rev 1823) +++ trunk/upgrade.php 2016-02-04 22:30:06 UTC (rev 1824) @@ -72,7 +72,7 @@ } } function _upgrade_filter_function($name) { - return preg_match('/upgrade_[\d]+(_mysql|_pgsql)?$/', $name) == 1; + return preg_match('/upgrade_[\d]+(_mysql|_pgsql|_sqlite|_mysql_pgsql)?$/', $name) == 1; } function _db_add_field($table, $field, $fieldtype, $after) { @@ -108,8 +108,18 @@ )"; db_query_parsed($pgsql); } -} -else { +} elseif(db_sqlite()) { + $enc = 'PRAGMA encoding = "UTF-8"'; + db_query_parsed($enc); + $sql = " + CREATE TABLE {IF_NOT_EXISTS} $table ( + `id` {AUTOINCREMENT}, + `name` TEXT NOT NULL UNIQUE DEFAULT '', + `value` TEXT NOT NULL DEFAULT '' + ) + "; + db_query_parsed($sql); +} else { $mysql = " CREATE TABLE {IF_NOT_EXISTS} $table ( `id` {AUTOINCREMENT} {PRIMARY}, @@ -163,21 +173,42 @@ echo "<p>Updating database:</p><p>- old version: $current_version; target version: $target_version</p>\n"; echo "<div style='color:#999'> (If the update doesn't work, run setup.php?debug=1 to see the detailed error messages and SQL queries.)</div>"; + if (db_sqlite() && $current_version < 1824) { + // Fast forward to the first revision supporting SQLite + $current_version = 1823; + } + for ($i = $current_version +1; $i <= $target_version; $i++) { $function = "upgrade_$i"; + $function_mysql_pgsql = $function . "_mysql_pgsql"; $function_mysql = $function . "_mysql"; $function_pgsql = $function . "_pgsql"; + $function_sqlite = $function . "_sqlite"; + if (function_exists($function)) { echo "<p>updating to version $i (all databases)..."; $function(); echo " done"; } + if ($CONF['database_type'] == 'mysql' || $CONF['database_type'] == 'mysqli' || $CONF['database_type'] == 'pgsql') { + if (function_exists($function_mysql_pgsql)) { + echo "<p>updating to version $i (MySQL and PgSQL)..."; + $function_mysql_pgsql(); + echo " done"; + } + } if ($CONF['database_type'] == 'mysql' || $CONF['database_type'] == 'mysqli' ) { if (function_exists($function_mysql)) { echo "<p>updating to version $i (MySQL)..."; $function_mysql(); echo " done"; } + } elseif(db_sqlite()) { + if (function_exists($function_sqlite)) { + echo "<p>updating to version $i (SQLite)..."; + $function_sqlite(); + echo " done"; + } } elseif($CONF['database_type'] == 'pgsql') { if (function_exists($function_pgsql)) { echo "<p>updating to version $i (PgSQL)..."; @@ -225,6 +256,25 @@ ); $sql = "$sql $attach_mysql"; + } elseif(db_sqlite()) { + $replace = array( + '{AUTOINCREMENT}' => 'integer PRIMARY KEY AUTOINCREMENT NOT NULL', + '{PRIMARY}' => 'PRIMARY KEY', + '{UNSIGNED}' => 'unsigned', + '{FULLTEXT}' => 'text', + '{BOOLEAN}' => "tinyint(1) NOT NULL DEFAULT '" . db_get_boolean(False) . "'", + '{BOOLEAN_TRUE}' => "tinyint(1) NOT NULL DEFAULT '" . db_get_boolean(True) . "'", + '{UTF-8}' => '', + '{LATIN1}' => '', + '{IF_NOT_EXISTS}' => 'IF NOT EXISTS', + '{RENAME_COLUMN}' => 'CHANGE COLUMN', + '{MYISAM}' => '', + '{INNODB}' => '', + '{INT}' => 'int(11) NOT NULL DEFAULT 0', + '{BIGINT}' => 'bigint(20) NOT NULL DEFAULT 0', + '{DATE}' => "datetime NOT NULL default '2000-01-01'", + '{DATECURRENT}' => 'datetime NOT NULL default CURRENT_TIMESTAMP', + ); } elseif($CONF['database_type'] == 'pgsql') { $replace = array( '{AUTOINCREMENT}' => 'SERIAL', @@ -274,7 +324,7 @@ if ($CONF['database_type'] == 'mysql' || $CONF['database_type'] == 'mysqli' ) { return "ALTER TABLE $table DROP INDEX $index"; - } elseif($CONF['database_type'] == 'pgsql') { + } elseif($CONF['database_type'] == 'pgsql' || db_sqlite()) { return "DROP INDEX $index"; # Index names are unique with a DB for PostgreSQL } else { echo "Sorry, unsupported database type " . $conf['database_type']; @@ -837,7 +887,7 @@ /** * Make logging translatable - i.e. create alias => create_alias */ -function upgrade_90() { +function upgrade_90_mysql_pgsql() { $result = db_query_parsed("UPDATE " . table_by_key ('log') . " SET action = REPLACE(action,' ','_')", TRUE); # change edit_alias_state to edit_alias_active $result = db_query_parsed("UPDATE " . table_by_key ('log') . " SET action = 'edit_alias_state' WHERE action = 'edit_alias_active'", TRUE); @@ -1139,7 +1189,7 @@ db_query_parsed("ALTER TABLE `$table_mailbox` CHANGE `local_part` `local_part` VARCHAR( 255 ) {LATIN1} NOT NULL"); } -function upgrade_655() { +function upgrade_655_mysql_pgsql() { db_query_parsed(_add_index('mailbox', 'domain', 'domain')); db_query_parsed(_add_index('alias', 'domain', 'domain')); } @@ -1206,7 +1256,7 @@ } */ -function upgrade_729() { +function upgrade_729_mysql_pgsql() { $table_quota = table_by_key('quota'); $table_quota2 = table_by_key('quota2'); @@ -1302,11 +1352,11 @@ "); } -function upgrade_945() { +function upgrade_945_mysql_pgsql() { _db_add_field('vacation', 'modified', '{DATECURRENT}', 'created'); } -function upgrade_946() { +function upgrade_946_mysql_pgsql() { # taken from upgrade_727_mysql, needs to be done for all databases _db_add_field('vacation', 'activefrom', '{DATE}', 'body'); _db_add_field('vacation', 'activeuntil', '{DATE}', 'activefrom'); @@ -1320,15 +1370,15 @@ db_query_parsed("ALTER TABLE $table_mailbox ALTER COLUMN quota type bigint"); } -function upgrade_1050() { +function upgrade_1050_mysql_pgsql() { db_query_parsed(_add_index('log', 'domain_timestamp', 'domain,timestamp')); } -function upgrade_1283() { +function upgrade_1283_mysql_pgsql() { _db_add_field('admin', 'superadmin', '{BOOLEAN}', 'password'); } -function upgrade_1284() { +function upgrade_1284_mysql_pgsql() { # migrate the ALL domain to the superadmin column # Note: The ALL domain is not (yet) deleted to stay backwards-compatible for now (will be done in a later upgrade function) @@ -1350,13 +1400,13 @@ # db_query_parsed("ALTER TABLE `$table_vacation` ADD `interval_time` INT NOT NULL DEFAULT '0' AFTER `reply_type` "); } -function upgrade_1519() { +function upgrade_1519_mysql_pgsql() { _db_add_field('fetchmail', 'sslcertck', '{BOOLEAN}', 'usessl' ); _db_add_field('fetchmail', 'sslcertpath', "VARCHAR(255) {UTF-8} DEFAULT ''", 'sslcertck' ); _db_add_field('fetchmail', 'sslfingerprint', "VARCHAR(255) {LATIN1} DEFAULT ''", 'sslcertpath'); } -function upgrade_1610() { +function upgrade_1610_mysql_pgsql() { # obsoletes upgrade_1345_mysql() - which means debug mode could print "field already exists" _db_add_field('vacation', 'interval_time', '{INT}', 'domain'); } @@ -1380,7 +1430,7 @@ db_query_parsed("ALTER TABLE `$table_fetchmail` CHANGE `date` `date` {DATE}"); } -function upgrade_1762() { +function upgrade_1762_mysql_pgsql() { _db_add_field('fetchmail', 'domain', "VARCHAR(255) {LATIN1} DEFAULT ''", 'id'); _db_add_field('fetchmail', 'active', '{BOOLEAN}', 'date'); _db_add_field('fetchmail', 'created', '{DATE}', 'date'); @@ -1400,7 +1450,7 @@ db_query_parsed("UPDATE $table SET domain=SPLIT_PART(mailbox, '@', 2) WHERE domain='';"); } -function upgrade_1767() { +function upgrade_1767_mysql_pgsql() { # 'active' was just added, so make sure all existing jobs stay active $table = table_by_key('fetchmail'); db_query_parsed("UPDATE $table SET active='{BOOL_TRUE}'"); @@ -1412,6 +1462,170 @@ upgrade_1761_mysql(); } +function upgrade_1824_sqlite() { + $admin_table = table_by_key('admin'); + $alias_table = table_by_key('alias'); + $alias_domain_table = table_by_key('alias_domain'); + $domain_table = table_by_key('domain'); + $domain_admins_table = table_by_key('domain_admins'); + $fetchmail_table = table_by_key('fetchmail'); + $log_table = table_by_key('log'); + $mailbox_table = table_by_key('mailbox'); + $quota_table = table_by_key('quota'); + $quota2_table = table_by_key('quota2'); + $vacation_table = table_by_key('vacation'); + $vacation_notification_table = table_by_key('vacation_notification'); + + db_query_parsed(" + CREATE TABLE $admin_table ( + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `superadmin` {BOOLEAN}, + `created` {DATE}, + `modified` {DATE}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`username`)); + "); + + db_query_parsed(" + CREATE TABLE $alias_table ( + `address` varchar(255) NOT NULL, + `goto` {FULLTEXT} NOT NULL, + `domain` varchar(255) NOT NULL, + `created` {DATE}, + `modified` {DATE}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`address`)); + "); + + db_query_parsed(" + CREATE TABLE $alias_domain_table ( + `alias_domain` varchar(255) NOT NULL, + `target_domain` varchar(255) NOT NULL, + `created` {DATE}, + `modified` {DATE}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`alias_domain`)); + "); + + db_query_parsed(" + CREATE TABLE $domain_table ( + `domain` varchar(255) NOT NULL, + `description` varchar(255) NOT NULL, + `aliases` {INT}, + `mailboxes` {INT}, + `maxquota` {BIGINT}, + `quota` {BIGINT}, + `transport` varchar(255) NOT NULL, + `backupmx` {BOOLEAN}, + `created` {DATE}, + `modified` {DATE}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`domain`)); + "); + + db_query_parsed(" + CREATE TABLE $domain_admins_table ( + `username` varchar(255) NOT NULL, + `domain` varchar(255) NOT NULL, + `created` {DATE}, + `active` {BOOLEAN_TRUE}); + "); + + db_query_parsed(" + CREATE TABLE $fetchmail_table ( + `id` {AUTOINCREMENT}, + `domain` varchar(255) DEFAULT '', + `mailbox` varchar(255) NOT NULL, + `src_server` varchar(255) NOT NULL, + `src_auth` varchar(255) DEFAULT NULL, + `src_user` varchar(255) NOT NULL, + `src_password` varchar(255) NOT NULL, + `src_folder` varchar(255) NOT NULL, + `poll_time` int(11) NOT NULL DEFAULT '10', + `fetchall` {BOOLEAN}, + `keep` {BOOLEAN}, + `protocol` {FULLTEXT} DEFAULT NULL, + `usessl` {BOOLEAN}, + `sslcertck` {BOOLEAN}, + `sslcertpath` varchar(255) DEFAULT '', + `sslfingerprint` varchar(255) DEFAULT '', + `extra_options` {FULLTEXT}, + `returned_text` {FULLTEXT}, + `mda` varchar(255) NOT NULL, + `date` {DATE}, + `created` {DATE}, + `modified` {DATECURRENT}, + `active` {BOOLEAN}); + "); + + db_query_parsed(" + CREATE TABLE $log_table ( + `timestamp` {DATE}, + `username` varchar(255) NOT NULL, + `domain` varchar(255) NOT NULL, + `action` varchar(255) NOT NULL, + `data` {FULLTEXT} NOT NULL); + "); + + db_query_parsed(" + CREATE TABLE $mailbox_table ( + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `maildir` varchar(255) NOT NULL, + `quota` {BIGINT}, + `local_part` varchar(255) NOT NULL, + `domain` varchar(255) NOT NULL, + `created` {DATE}, + `modified` {DATE}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`username`)); + "); + + db_query_parsed(" + CREATE TABLE $quota_table ( + `username` varchar(255) NOT NULL, + `path` varchar(100) NOT NULL, + `current` {BIGINT}, + {PRIMARY} (`username`,`path`)); + "); + + db_query_parsed(" + CREATE TABLE $quota2_table ( + `username` varchar(255) NOT NULL, + `bytes` {BIGINT}, + `messages` {INT}, + {PRIMARY} (`username`)); + "); + + db_query_parsed(" + CREATE TABLE $vacation_table ( + `email` varchar(255) NOT NULL, + `subject` varchar(255) NOT NULL, + `body` {FULLTEXT} NOT NULL, + `activefrom` {DATE}, + `activeuntil` {DATE}, + `cache` {FULLTEXT} NOT NULL DEFAULT '', + `domain` varchar(255) NOT NULL, + `interval_time` {INT}, + `created` {DATE}, + `modified` {DATECURRENT}, + `active` {BOOLEAN_TRUE}, + {PRIMARY} (`email`)); + "); + + db_query_parsed(" + CREATE TABLE $vacation_notification_table ( + `on_vacation` varchar(255) NOT NULL, + `notified` varchar(255) NOT NULL, + `notified_at` {DATECURRENT}, + {PRIMARY} (`on_vacation`,`notified`), + CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE); + "); + +} + # TODO MySQL: # - various varchar fields do not have a default value # https://sourceforge.net/projects/postfixadmin/forums/forum/676076/topic/3419725 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |