From 7acf7ef803fe2e155503a411e996d64576da9853 Mon Sep 17 00:00:00 2001 From: Nicolas Boisselier Date: Tue, 31 Jan 2017 00:27:36 +0000 Subject: [PATCH] Bed --- lib/php/db/table.php | 120 ++++++++++++++++++++++++++++-------- lib/php/db/types/sqlite.php | 5 +- 2 files changed, 97 insertions(+), 28 deletions(-) diff --git a/lib/php/db/table.php b/lib/php/db/table.php index 3a1a5f18..f5a49c1d 100644 --- a/lib/php/db/table.php +++ b/lib/php/db/table.php @@ -31,6 +31,7 @@ Class Table extends nb { public $engine; public $created; public static $is_admin = true; + public static $key_preff = '_key_'; public $fields = []; public $indexes; @@ -383,7 +384,7 @@ Class Table extends nb { } - if (isset($conf['fct'])) $conf['fct']($row) ; + if (isset($conf['fct'])) $conf['fct']($row); $field = [ 'table' => $this, @@ -478,10 +479,15 @@ Class Table extends nb { return $h; } + public function html_add($values = null,$form_action='?') { + return html_edit($values,$form_action,true); + } + public function html_edit($values = null,$form_action='?',$add=false) { if ($values === null) $values = $this->p(); if (!is_array($values)) $values = [$values]; $fields = array_filter($this->fields(),function($v){return empty($v->extra);}); + $keys = $this->fields_keys(); #$fields); $fields = array_merge($keys,$fields); $where = $this->where($fields,$values); if (empty($where)) { @@ -511,10 +517,19 @@ Class Table extends nb { $count ++; foreach ($fields as $name => $field) { - if ($add and !preg_match('/^(null)?$/',$field->default)) $row[$name] = $field->default; - elseif(!isset($row[$name])) $row[$name] = ''; - echo $field->html_edit($row[$name] - ); + + if ($add and !preg_match('/^(null)?$/',$field->default)) { + $row[$name] = $field->default; + + } elseif(!isset($row[$name])) { + $row[$name] = ''; + + } + + if (!$add and $field->key) { + echo ''.NB_EOL; + } + echo $field->html_edit($row[$name]); } } @@ -1529,24 +1544,56 @@ Class Table extends nb { return $this->db()->sql_name($value === null ? $this->name : $value); } + public function _TODEL_fields_extract_keys_values($post) { + foreach ($this->fields() as $name => $field) { + + if (!isset($post[$name])) { + if ($field->key) $this->bye("Missing `$name`!"); + continue; + } + + $value = $post[$name]; + + if ($field->key) { + $keys[] = $name; + if (isset($post[self::$key_preff.$name])) { + $value = $post[self::$key_preff.$name]; + } + $keys_values[] = $value; + + } else { + $fields[] = $name; + $fields_values[] = $value; + } + + } + + return [ + $key, + $keys_values, + $fields, + $fields_values, + ]; + } + public function replace($hvalues,&$info=[]) { return $this->insert($hvalues,$info,'REPLACE'); } - public function insert($hvalues,&$info=[],$insert_word='INSERT') { + public function insert($post,&$info=[],$insert_word='INSERT') { if (empty($info['values'])) $info['values'] = []; - if (empty($hvalues)) $this->bye('insert(): No values'); - $info['values'] = $hvalues; + if (empty($post)) $this->bye('insert(): No values'); + $info['values'] = $post; $sql_names = $fields = $values = []; foreach ($this->fields() as $name => $field) { - if (!isset($hvalues[$name])) continue; + if (!isset($post[$name])) continue; if ($field->key and $field->autoincrement()) continue; #$fields[$field->sql_name()] = $field; $fields[$name] = $field; $sql_names[$name] = $field->sql_name(); - $values[] = $hvalues[$name]; + $values[] = $post[$name]; } if (empty($fields)) $this->bye('insert(): No fields for table'); @@ -1563,7 +1610,7 @@ Class Table extends nb { } foreach ($fields as $name => $field) { - $row = [ $name => $hvalues[$name] ]; + $row = [ $name => $post[$name] ]; $this->db()->table_row_encrypt($this,$row); $field->bindParam($query,$row[$name],":$name"); } @@ -1588,9 +1635,8 @@ Class Table extends nb { } # dbq t=nb.mime_type a=table.update type=application/rss+xml name='RSS - Really Simple Syndication' ext=rss debug=2 - public function update($hvalues,&$info=[]) { - if (empty($info['values'])) $info['values'] = []; - $info['values'] = $hvalues; + public function update($post,&$info=[]) { +# NB 30.01.17 if (empty($info['values'])) $info['values'] = []; $keys = []; $keys_values = []; @@ -1602,16 +1648,26 @@ Class Table extends nb { foreach ($this->fields() as $name => $field) { - if (!isset($hvalues[$name])) { + if (!isset($post[$name])) { if ($field->key) $this->bye("Missing `$name`!"); continue; } - $value = $hvalues[$name]; + $value = $post[$name]; if ($field->key) { $keys[] = $name; - $keys_values[] = $value; + + $_value = isset($post[self::$key_preff.$name]) ? $post[self::$key_preff.$name] : null; + + if ($_value) {# and $_value !== $value) { + $fields[] = $name; + $fields_values[] = $value; + $keys_values[] = $_value; + + } else { + $keys_values[] = $value; + } } else { $fields[] = $name; @@ -1622,8 +1678,16 @@ Class Table extends nb { } $info['keys'] = array_combine($keys,$keys_values); + $info['fields'] = array_combine($fields,$fields_values); + $info['post'] = $post; - if (empty($fields)) $this->bye("Missing keys!"); +#bye([$keys,$keys_values]); +#debug([$post,$this->fields()]); +# if (empty($fields)) { +# $fields = $keys; +# $fields_values = $keys_values; +# } + if (empty($fields)) $this->bye("Missing fields!"); if (empty($keys)) { $this->bye("Missing keys!"); @@ -1636,7 +1700,8 @@ Class Table extends nb { .' SET ' . join(',',$this->ar_map('"$a=:$a"',$fields)) .' WHERE ' . join(' AND ',$this->ar_map('"$a=:key_$a"',$keys)) ; - $info['sql'] = $sql; + #$info['sql'] = $sql; + $info = [ 'sql' => $sql ] + $info; if (!($query = $this->db()->conn->prepare($sql))) { err('PDO::errorInfo(): ' .join(' ', $this->db()->conn->errorInfo()) .NB_EOL); @@ -1644,16 +1709,16 @@ Class Table extends nb { } foreach ($fields as $name) { - #debug("$name: ".$hvalues[$name]); - $row = [ $name => $hvalues[$name] ]; + #debug("$name: ".$post[$name]); + $row = [ $name => $post[$name] ]; $this->db()->table_row_encrypt($this,$row); #debug($this->db()->status()); $field->bindParam($query,$row[$name],":$name"); } foreach ($keys as $name) { - #debug("$name: ".$hvalues[$name]); - $field->bindParam($query,$hvalues[$name],":key_$name"); + #debug("$name: ".$post[$name]); + $field->bindParam($query,$post[$name],":key_$name"); } #return $sql; @@ -1668,7 +1733,8 @@ Class Table extends nb { return false; } - $info['rowCount'] = $query->rowCount(); + #$info['rowCount'] = $query->rowCount(); + $info = [ 'rowCount' => $query->rowCount()] + $info; #bye($this->db()->row("SELECT value FROM crypt WHERE id='zaza'")); #bye($info); #return true; @@ -1677,16 +1743,16 @@ Class Table extends nb { } - public function delete($hvalues,&$info=[]) { + public function delete($post,&$info=[]) { if (empty($info['values'])) $info['values'] = []; - $info['values'] = $hvalues; + $info['values'] = $post; $keys = $this->fields_keys(); // If no primary keys, we use all field if (empty($keys)) $keys = $this->fields(); - if (!($where = $this->where($keys,$hvalues,self::$is_admin ? false : true))) { + if (!($where = $this->where($keys,$post,self::$is_admin ? false : true))) { err('Db.delete(): Missing keys values'); return null; } diff --git a/lib/php/db/types/sqlite.php b/lib/php/db/types/sqlite.php index 12b2e271..b8cef144 100644 --- a/lib/php/db/types/sqlite.php +++ b/lib/php/db/types/sqlite.php @@ -90,11 +90,14 @@ $DB_TYPES['sqlite'] = array ( 'table.fields' => array ( 'sql' => 'PRAGMA table_info(\'\')', 'fct' => function(&$r) { - $r["key"] = $r["pk"] == "0" ? 0 : 1; + $r["key"] = ( $r["pk"] == "0" ? 0 : 1 ); + unset($r["pk"]); if (!empty($r["dflt_value"])) $r["default"] = trim($r["dflt_value"],"'"); + unset($r["dflt_value"]); $r["null"] = $r["notnull"] == "0" ? 1 : 0; + unset($r["notnull"]); $sql = $r["this"]->sql(); $name_exp = preg_quote($r["name"]); -- 2.47.3