MastodonHelp/web/lib/tables.php
2023-12-26 11:16:24 +01:00

89 lines
2.7 KiB
PHP

<?php
function tables(&$link) {
$tables=array();
$res=mysqli_query($link,'SHOW TABLES')
or mexit(mysqli_error($link).N,1);
while ($row=mysqli_fetch_row($res)) {
$resb=mysqli_query($link,'SHOW COLUMNS FROM '.$row[0])
or mexit(mysqli_error($link).N,1);
$fields=array();
// lo uso solo per alcuni tipi, quindi non sto a cercare completezza
while ($rowb=mysqli_fetch_assoc($resb)) {
if (preg_match('/(\w+)\((.*)\)( unsigned)?/',$rowb['Type'],$buf)===1) {
switch ($buf[1]) {
case 'char':
case 'varchar':
$fields[$rowb['Field']]=$buf[2];
break;
case 'tinyint':
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>0,'max'=>255);
else
$fields[$rowb['Field']]=array('min'=>-128,'max'=>127);
break;
case 'smallint':
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>0,'max'=>65535);
else
$fields[$rowb['Field']]=array('min'=>-32768,'max'=>32767);
break;
case 'mediumint':
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>0,'max'=>16777215);
else
$fields[$rowb['Field']]=array('min'=>-8388608,'max'=>8388607);
break;
case 'int':
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>0,'max'=>4294967295);
else
$fields[$rowb['Field']]=array('min'=>-2147483648,'max'=>2147483647);
break;
// bigint non ci sta in php a meno di usare bcmath o gmp che non è detto siano abilitate sul server, in ogni caso poco importa perché valori bigint vengono usati solo internamente al db, non "vengono da fuori"
case 'bigint':
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>'0','max'=>'18446744073709551615');
else
$fields[$rowb['Field']]=array('min'=>'-9223372036854775808','max'=>'9223372036854775807');
break;
case 'decimal':
// questo è da testare contro un decimale vero
// fatto, il risultato è che in mysql devo usare decimal(14,4)
if (preg_match('/,/',$buf[2])===1) {
$lim=explode(',',$buf[2]);
} else {
$lim[0]=$buf[2];
$lim[1]=0;
}
$int=$lim[0]-$lim[1];
$sint='';
for ($i=0; $i<$int; $i++)
$sint.='9';
$sdec='';
for ($i=0; $i<$lim[1]; $i++)
$sdec.='9';
$max=$sint.'.'.$sdec;
if (array_key_exists(3,$buf))
$fields[$rowb['Field']]=array('min'=>0,'max'=>floatval($max));
else
$fields[$rowb['Field']]=array('min'=>floatval('-'.$max),'max'=>floatval($max));
break;
default:
$fields[$rowb['Field']]=$rowb['Type'];
break;
}
} elseif ($rowb['Type']=='text') {
$fields[$rowb['Field']]=65535;
} else {
$fields[$rowb['Field']]=$rowb['Type'];
}
}
$tables[$row[0]]=$fields;
}
return($tables);
}
?>