<?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);

}

?>
