Estoy haciendo un backup a un archivo .sql de mi base de datos en postgres usando una interfaz web php.
Tengo el siguiente código, y espero que también sea de aporte para el foro:
Código PHP:
<?php
function dl_file($file){
If (!is_file($file)) { die("<b>404 Archivo no encontrado!</b>"); }
$len = filesize($file);
$filename = basename($file);
$file_extension = strtolower(substr(strrchr($filename,"."),1));
$ctype="application/force-download";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
$header="Content-Disposition: attachment; filename=".$filename.";";
header($header );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$len);
@readfile($file);
exit;
}
$dbname = "atentions"; //database name
include ("scripts/auth.php");
$archivo=date(" d\-m\-Y") . "--sistema_atencion" . ".sql";
$back = fopen("$archivo","w");
$res = pg_query(" SELECT relname AS tablename FROM pg_class WHERE relkind in ('r') AND relname NOT LIKE 'pg_%' AND relname NOT LIKE 'sql_%' ORDER BY tablename");
$str="";
while($row = pg_fetch_row($res)) {
$table = $row[0];
$str .= "\n--\n";
$str .= "-- Estrutura de la Tabla: '$table'";
$str .= "\n--\n";
//$str .= "\nDROP TABLE $table CASCADE;";
$str .= "\nCREATE TABLE $table (";
$res2 = pg_query("SELECT attnum,attname , typname , atttypmod-4 , attnotnull ,atthasdef ,adsrc AS def
FROM pg_attribute, pg_class, pg_type, pg_attrdef WHERE pg_class.oid=attrelid
AND pg_type.oid=atttypid AND attnum>0 AND pg_class.oid=adrelid AND adnum=attnum
AND atthasdef='t' AND lower(relname)='$table' UNION
SELECT attnum,attname , typname , atttypmod-4 , attnotnull , atthasdef ,'' AS def
FROM pg_attribute, pg_class, pg_type WHERE pg_class.oid=attrelid
AND pg_type.oid=atttypid AND attnum>0 AND atthasdef='f' AND lower(relname)='$table' ");
while($r = pg_fetch_row($res2)) {
$str .= "\n" . $r[1]. " " . $r[2];
if ($r[2]=="varchar"){
$str .= "(".$r[3] .")";
}
if ($r[4]=="t"){
$str .= " NOT NULL";
}
if ($r[5]=="t"){
$str .= " DEFAULT ".$r[6];
}
$str .= ",";
}
$str=rtrim($str, ",");
$str .= "\n);\n";
$str .= "\n--\n";
$str .= "-- Creando Datos para: '$table'";
$str .= "\n--\n\n";
$res3 = pg_query("SELECT * FROM $table");
while($r = pg_fetch_row($res3)){
$sql = "INSERT INTO $table VALUES ('";
$sql .= utf8_decode(implode("','",$r));
$sql .= "');";
$str = str_replace("''","NULL",$str);
$str .= $sql;
$str .= "\n";
}
$res1 = pg_query("SELECT pg_index.indisprimary,
pg_catalog.pg_get_indexdef(pg_index.indexrelid)
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
pg_catalog.pg_index AS pg_index
WHERE c.relname = '$table'
AND c.oid = pg_index.indrelid
AND pg_index.indexrelid = c2.oid
AND pg_index.indisprimary");
while($r = pg_fetch_row($res1)) {
$str .= "\n\n--\n";
$str .= "-- Creando Indices para: '$table'";
$str .= "\n--\n\n";
$t = str_replace("CREATE UNIQUE INDEX", "", $r[1]);
$t = str_replace("USING btree", "|", $t);
// Next Line Can be improved!!!
$t = str_replace("ON", "|", $t);
$Temparray = explode("|", $t);
$str .= "ALTER TABLE ONLY ". $Temparray[1] . " ADD CONSTRAINT " . $Temparray[0] . " PRIMARY KEY " . $Temparray[2] .";\n";
}
}
$res = pg_query(" SELECT
cl.relname AS tabela,ct.conname,
pg_get_constraintdef(ct.oid)
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
af.attnum = ct.confkey[1]) order by cl.relname ");
while($row = pg_fetch_row($res)) {
$str .= "\n\n--\n";
$str .= "-- Creando relaciones para: '".$row[0]."'";
$str .= "\n--\n\n";
$str .= "ALTER TABLE ONLY ".$row[0] . " ADD CONSTRAINT " . $row[1] . " " . $row[2] . ";";
}
fwrite($back,$str);
fclose($back);
dl_file("$archivo");
?>
De ante mano muchas gracias por su antención, y esperando su pronta ayuda.
Walleska