[0-9]+)(\s*OFFSET\s*(?[0-9]+))*/xi', $data ?? '', $match); return $match; } /** * Limit * * @param int $start = NULL * @param int $limit = 0 * * @return DB * * @codeCoverageIgnore */ public function limit($start = NULL, int $limit = 0) { return ' LIMIT '. ( ! empty($limit) ? $limit . ' OFFSET ' . $start. ' ' : $start ); } /** * protected get insert extras by drvier * * @codeCoverageIgnore */ public function getInsertExtrasByDriver() { return false; } /** * Result * * @param string $type = 'object' * * @return object|array|string */ public function result($type = 'object', $jsonColumns = NULL, $usageRow = false) { if( empty($this->query) ) { return []; } $rows = []; while( $data = $this->fetchAssoc() ) { if( $jsonColumns ) { $data = $this->jsonDecode($jsonColumns, $data, $type, $usageRow); } if( $type === 'object' ) { $data = (object) $data; } $rows[] = $data; } return $rows; } /** * Result Array * * @return array * * @codeCoverageIgnore */ public function resultArray() { return $this->result('array'); } /** * Row * * @return object|false * * @codeCoverageIgnore */ public function row() { if( ! empty($this->query) ) { $data = $this->fetchAssoc(); return (object) $data; } else { return false; } } /** * References * * @param string $table * @param string $column */ public function references($table, $column) { return 'REFERENCES '.$table.'('.$column.')'; } /** * Foreign Key * * @param string $column * @param string $references */ public function foreignKey($column = NULL, $references = NULL) { if( $references === NULL ) { return $this->statements('foreignkey', $column); } // @codeCoverageIgnoreStart elseif( $column === NULL ) { return $this->statements('foreignkey'); } return $this->statements('foreignkey') . ' ' . $this->references($column, $references); // @codeCoverageIgnoreEnd } /** * Full Text * * 5.7.4[added] * * @param string $column * @param string $value * @param string $type = NULL * * @return string */ public function fullText($column, $value, $type = NULL) { $against = ''; switch( $type ) { case 'boolean' : $against = ' IN BOOLEAN MODE' ; break; case 'booleanExpansion' : $against = ' IN BOOLEAN MODE WITH QUERY EXPANSION' ; break; case 'language' : $against = ' IN NATURAL LANGUAGE MODE' ; break; case 'expansion' : $against = ' WITH QUERY EXPANSION' ; break; case 'languageExpansion': $against = ' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION'; break; } return 'MATCH(' . $column . ') AGAINST(' . $value . $against . ')'; } /** * Where Json * * @string $column * @string $value */ public function whereJson($column, $value, $type = 'IS NOT NULL') { return 'JSON_SEARCH('.$column.', \'one\', '.$value.') ' . $type; } /** * Where Not Json * * @string $column * @string $value */ public function whereNotJson($column, $value) { return $this->whereJson($column, $value, 'IS NULL'); } /** * Vartypes * * @return string */ public function vartypes() { return $this->variableTypes; } /** * Cvartype * * @param string $type = NULL * @param int $len = NULL * @param bool $output = true * * @return string */ private function cvartype($type = NULL, $len = NULL, $output = true) { if( empty($len) ) { return " $type "; } elseif( $output === true ) { return " $type($len) "; } else { return " $type $len "; } } /** * Operator * * @param string $operator = 'like' * * @return mixed */ public function operator($operator = 'like') { $operator = strtolower($operator); return $this->operators[$operator] ?? false; } /** * Statements * * @param string $state = NULL * @param int $len = NULL * @param bool $type = true * * @return string|false */ public function statements($state = NULL, $len = NULL, $type = true) { $state = strtolower($state ?? ''); if( $isstate = ($this->statements[$state] ?? NULL) ) { if( strstr($isstate, '%') ) { $vartype = str_replace('%', $len ?? '', $isstate); // @codeCoverageIgnore return $this->cvartype($vartype); // @codeCoverageIgnore } return $this->cvartype($isstate, $len, $type); } else { return false; // @codeCoverageIgnore } } /** * Closes a previously opened database connection * * @return bool */ public function close() { if( ! empty($this->connect) ) { $this->query = NULL; $this->connect = NULL; return true; } else { return false; } } /** * Variable Types * * @param string $vartype = NULL * @param int $len = NULL * @param bool $type = true * * @return string|false */ public function variableTypes($vartype = NULL, $len = NULL, $type = true) { $vartype = strtolower($vartype ?? ''); if( $isvartype = ($this->variableTypes[$vartype] ?? NULL) ) { if( strpos($isvartype, ':') === 0 ) { $len = NULL; $isvartype = substr($isvartype, 1); } return $this->cvartype($isvartype, $len, $type); } return false; // @codeCoverageIgnore } /** * protected json decode */ protected function jsonDecode($columns, $row, $type, $usageRow) { $columns = $columns === '*' ? array_keys(preg_grep('/^(\{|\[).*(\]|\})$/s', $row)) : $columns; if( is_array($columns) ) { foreach( $columns as $column ) { $value = $row[$column] ?? ''; if( Json::check($value) ) { $row[$column] = ( $type === 'object' || $usageRow === true ) ? Json::decodeObject($value) : Json::decodeArray($value); } } return $row; } return $row; // @codeCoverageIgnore } }