Mercurial > hg > mgallery
diff mgallery.inc.php @ 290:19fbf800b1f7
Work on very early form of virtual gallery support.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 28 Jul 2019 07:53:36 +0300 |
parents | 13cff35dfbec |
children | 486398fb60ea |
line wrap: on
line diff
--- a/mgallery.inc.php Sun Jul 28 07:50:54 2019 +0300 +++ b/mgallery.inc.php Sun Jul 28 07:53:36 2019 +0300 @@ -97,6 +97,11 @@ "med_height" => [MG_INT, 640], "med_quality" => [MG_INT, 90], + "backend" => [MG_STR, "php"], + "sql_db" => [MG_STR, NULL], + "sql_username" => [MG_STR, ""], + "sql_password" => [MG_STR, ""], + "sql_options" => [MG_STR, []], ]; @@ -341,4 +346,314 @@ } } + +function mgLogSQLError($dbh, $sql) +{ + return mgError("SQL error '".implode("; ", $dbh->errorInfo())."' in statement: \"".$sql."\""); +} + + +function mgDBGetSQLParam($dbh, $type, $value) +{ + switch ($type) + { + case "d": return intval($value); + case "s": return $dbh->quote($value); + case "b": return intval($value) ? 1 : 0; + case "D": + if ($value instanceOf DateTime) + { + switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) + { + case "pgsql" : $fmt = "Y-m-d H:i:sP"; break; + case "sqlite" : $fmt = DATE_RFC3339; break; + case "mysql" : $fmt = "Y-m-d H:i:s"; break; + default : $fmt = DATE_RFC3339; + } + return $dbh->quote($value->format($fmt)); + } + else + return intval($value); + } +} + + +function mgSQLToDateTime($dbh, $stamp) +{ + switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) + { + case "pgsql": + // PostgreSQL 'timestamptz' format + $tmp = DateTime::createFromFormat("Y-m-d H:i:sP", $stamp); + break; + + case "sqlite": + // SQLite can use RFC3339 format + $tmp = DateTime::createFromFormat(DATE_RFC3339, $stamp); + break; + + case "mysql": + // MySQL uses UTC internally, no way to specify TZ + $tmp = DateTime::createFromFormat("Y-m-d H:i:s", $stamp); + break; + + default: + $tmp = NULL; + } + + // echo "<p>".$stamp." :: ".var_export(($tmp instanceOf DateTime) ? $tmp : NULL, TRUE)."</p>"; + return ($tmp instanceOf DateTime) ? $tmp : NULL; +} + + +function mgConnectSQLDB() +{ + global $db; + try { + $db = new PDO(mgGetSetting("sql_db"), + mgGetSetting("sql_username", NULL), + mgGetSetting("sql_password", NULL), + mgGetSetting("sql_options", array())); + } + catch (PDOException $e) { + mgError("Could not connect to SQL database: ".$e->getMessage()."."); + return FALSE; + } + return ($db !== false); +} + + +function mgDBPrepareSQLUpdate($dbh, $table, $cond, $pairs, $values = NULL) +{ + $sql = []; + foreach ($pairs as $name => $attr) + { + $sql[] = $name."=".mgDBGetSQLParam($dbh, + $attr, $values !== NULL ? $values[$name] : $name); + } + return + "UPDATE ".$table." SET ".implode(",", $sql). + ($cond != "" ? " ".$cond : ""); +} + + +function mgDBPrepareSQL_V($dbh, $fmt, $argv) +{ + $len = strlen($fmt); + $sql = ""; + $argn = 0; + $argc = count($argv); + + for ($pos = 0; $pos < $len; $pos++) + { + if ($fmt[$pos] == "%") + { + if ($argn < $argc) + $sql .= mgDBGetSQLParam($dbh, $fmt[++$pos], $argv[$argn++]); + else + { + mgError("Invalid SQL statement format string '".$fmt. + "', not enough parameters specified (".$argn." of ".$argc.")"); + return FALSE; + } + } + else + $sql .= $fmt[$pos]; + } + + return $sql; +} + + +function mgDBPrepareSQL($dbh) +{ + $argv = func_get_args(); + return mgDBPrepareSQL_V($dbh, $argv[1], array_splice($argv, 2)); +} + + +function mgPrepareSQL() +{ + global $db; + $argv = func_get_args(); + return mgDBPrepareSQL_V($db, $argv[0], array_splice($argv, 1)); +} + + +function mgDBExecSQLInsert($dbh, $sql) +{ + switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) + { + case "pgsql": + if (($res = mgDBFetchSQLColumn($dbh, $sql." RETURNING id")) !== false) + return $res; + else + return FALSE; + + default: + if (mgDBExecSQL($dbh, $sql) !== false) + return $dbh->lastInsertId(); + else + return FALSE; + } +} + + +function mgDBExecSQL($dbh, $sql) +{ + if (($res = $dbh->query($sql)) !== FALSE) + return $res; + else + { + mgLogSQLError($dbh, $sql); + return FALSE; + } +} + + +function mgDBFetchSQL($dbh, $sql) +{ + if (($res = $dbh->query($sql)) !== FALSE) + return $res->fetch(); + else + { + mgLogSQLError($dbh, $sql); + return FALSE; + } +} + + +function mgDBFetchSQLColumn($dbh, $sql, $column = 0) +{ + if (($res = $dbh->query($sql)) !== FALSE) + return $res->fetchColumn($column); + else + { + mgLogSQLError($dbh, $sql); + return FALSE; + } +} + + +function mgPrepareSQLUpdate($table, $cond, $pairs) +{ + global $db; + return mgDBPrepareSQLUpdate($db, $table, $cond, $pairs); +} + + +function mgExecSQLInsert($sql) +{ + global $db; + return mgDBExecSQLInsert($db, $sql); +} + + +function mgExecSQL($sql) +{ + global $db; + return mgDBExecSQL($db, $sql); +} + + +function mgFetchSQL($sql) +{ + global $db; + return mgDBFetchSQL($db, $sql); +} + + +function mgFetchSQLColumn($sql, $column = 0) +{ + global $db; + return mgDBFetchSQLColumn($db, $sql, $column); +} + + +function mgDBBeginTransaction($dbh = FALSE) +{ + global $db; + return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "BEGIN TRANSACTION"); +} + + +function mgDBCommitTransaction($dbh = FALSE) +{ + global $db; + return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "COMMIT"); +} + + +function mgDBGetTableSchema($dbh, $schema) +{ + $res = []; + $driver = $dbh->getAttribute(PDO::ATTR_DRIVER_NAME); + + // Go through the table schema, definition by definition + foreach ($schema as $scol) + { + $tmp = []; + + // And each element of the one definition + // (like 'foo INTEGER AUTOINCREMENT') + foreach ($scol as $elem) + switch ($driver) + { + case "pgsql": + switch ($elem) + { + case "AUTOINCREMENT": + // For Postgres, use SERIAL for autoincrement and + // "cleverly" replace the 2nd element with SERIAL + // assuming that it is INTEGER or such. + $tmp[1] = "SERIAL"; + break; + + case "DATETIME": + $tmp[] = "TIMESTAMPTZ"; + break; + + default: + $tmp[] = $elem; + break; + } + break; + + case "mysql": + switch ($elem) + { + case "AUTOINCREMENT": + $tmp[] = "AUTO_INCREMENT"; + break; + + case "DATETIME": + $tmp[] = "TIMESTAMP"; + break; + + default: + $tmp[] = $elem; + break; + } + break; + + case "sqlite": + $tmp[] = $elem; + break; + + default: + die("Don't know how to handle PDO driver '".$driver."' yet.\n"); + } + + $res[] = implode(" ", $tmp); + } + + return implode(", ", $res); +} + + +function mgDBCreateOneTable($dbh, $name, $schema) +{ + return (mgDBExecSQL($dbh, "CREATE TABLE IF NOT EXISTS ".$name." (".$schema.")") !== FALSE) ? TRUE : FALSE; +} + ?> \ No newline at end of file