type = strtolower($options['database_type']);
}
if (isset($options['prefix'])) {
$this->prefix = $options['prefix'];
}
if (isset($options['option'])) {
$this->option = $options['option'];
}
if (isset($options['logging']) && is_bool($options['logging'])) {
$this->logging = $options['logging'];
}
if (isset($options['command']) && is_array($options['command'])) {
$commands = $options['command'];
} else {
$commands = [];
}
if (isset($options['dsn'])) {
if (is_array($options['dsn']) && isset($options['dsn']['driver'])) {
$attr = $options['dsn'];
} else {
return false;
}
} else {
if (
isset($options['port']) &&
is_int($options['port'] * 1)
) {
$port = $options['port'];
}
$is_port = isset($port);
switch ($this->type) {
case 'mariadb':
case 'mysql':
$attr = [
'driver' => 'mysql',
'dbname' => $options['database_name'],
];
if (isset($options['socket'])) {
$attr['unix_socket'] = $options['socket'];
} else {
$attr['host'] = $options['server'];
if ($is_port) {
$attr['port'] = $port;
}
}
// Make MySQL using standard quoted identifier
$commands[] = 'SET SQL_MODE=ANSI_QUOTES';
break;
case 'pgsql':
$attr = [
'driver' => 'pgsql',
'host' => $options['server'],
'dbname' => $options['database_name'],
];
if ($is_port) {
$attr['port'] = $port;
}
break;
case 'sybase':
$attr = [
'driver' => 'dblib',
'host' => $options['server'],
'dbname' => $options['database_name'],
];
if ($is_port) {
$attr['port'] = $port;
}
break;
case 'oracle':
$attr = [
'driver' => 'oci',
'dbname' => $options['server'] ?
'//'.$options['server'].($is_port ? ':'.$port : ':1521').'/'.$options['database_name'] :
$options['database_name'],
];
if (isset($options['charset'])) {
$attr['charset'] = $options['charset'];
}
break;
case 'mssql':
if (isset($options['driver']) && $options['driver'] === 'dblib') {
$attr = [
'driver' => 'dblib',
'host' => $options['server'].($is_port ? ':'.$port : ''),
'dbname' => $options['database_name'],
];
} else {
$attr = [
'driver' => 'sqlsrv',
'Server' => $options['server'].($is_port ? ','.$port : ''),
'Database' => $options['database_name'],
];
}
// Keep MSSQL QUOTED_IDENTIFIER is ON for standard quoting
$commands[] = 'SET QUOTED_IDENTIFIER ON';
// Make ANSI_NULLS is ON for NULL value
$commands[] = 'SET ANSI_NULLS ON';
break;
case 'sqlite':
$attr = [
'driver' => 'sqlite',
$options['database_file'],
];
break;
}
}
$driver = $attr['driver'];
unset($attr['driver']);
$stack = [];
foreach ($attr as $key => $value) {
$stack[] = is_int($key) ? $value : $key.'='.$value;
}
$dsn = $driver.':'.implode($stack, ';');
if (
in_array($this->type, ['mariadb', 'mysql', 'pgsql', 'sybase', 'mssql']) &&
isset($options['charset'])
) {
$commands[] = "SET NAMES '".$options['charset']."'";
}
try {
$this->pdo = new PDO(
$dsn,
isset($options['username']) ? $options['username'] : null,
isset($options['password']) ? $options['password'] : null,
$this->option
);
foreach ($commands as $value) {
$this->pdo->exec($value);
}
} catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
/**
* 统计符合条件的数据行数
* 获取表中值最大的数据
* 获取表中值最小的数据
* 获得某个列字段的平均值
* 获得某个列字段的和.
*
* @param $table
* @param null $join
* @param null $column
* @param null $where
*
* @return bool|int
*/
public function __call($name, $arguments)
{
$aggregation = ['avg', 'count', 'max', 'min', 'sum'];
if (in_array($name, $aggregation)) {
array_unshift($arguments, $name);
return call_user_func_array([$this, 'aggregate'], $arguments);
}
}
/**
* 执行带返回结果集的SQL语句.
*
* @param $query
*
* @return bool|PDOStatement
*/
public function query($query, $map = [])
{
$raw = $this->raw($query, $map);
$query = $this->buildRaw($raw, $map);
return $this->exec($query, $map);
}
/**
* 执行无返回结果集的SQL语句.
*
* @param $query
*
* @return bool|int
*/
public function exec($query, $map = [])
{
if ($this->debug_mode) {
echo $this->generate($query, $map);
$this->debug_mode = false;
return false;
}
if ($this->logging) {
$this->logs[] = [$query, $map];
} else {
$this->logs = [[$query, $map]];
}
$statement = $this->pdo->prepare($query);
if ($statement) {
foreach ($map as $key => $value) {
$statement->bindValue($key, $value[0], $value[1]);
}
$statement->execute();
$this->statement = $statement;
return $statement;
}
return false;
}
//生成
protected function generate($query, $map)
{
$identifier = [
'mysql' => '`$1`',
'mariadb' => '`$1`',
'mssql' => '[$1]',
];
$query = preg_replace(
'/"([a-zA-Z0-9_]+)"/i',
isset($identifier[$this->type]) ? $identifier[$this->type] : '"$1"',
$query
);
foreach ($map as $key => $value) {
if ($value[1] === PDO::PARAM_STR) {
$replace = $this->quote($value[0]);
} elseif ($value[1] === PDO::PARAM_NULL) {
$replace = 'NULL';
} elseif ($value[1] === PDO::PARAM_LOB) {
$replace = '{LOB_DATA}';
} else {
$replace = $value[0];
}
$query = str_replace($key, $replace, $query);
}
return $query;
}
//Medoo可以使用原始表达式来进行复杂的或自定义的查询,尤其是在使用SQL内置函数的时候,支持占位符号,以防止注入和优化语法,原始数据表中的‘as’
public static function raw($string, $map = [])
{
$raw = new Raw();
$raw->map = $map;
$raw->value = $string;
return $raw;
}
//判断是否为原始对象
protected function isRaw($object)
{
return $object instanceof Raw;
}
//创建原始对象
protected function buildRaw($raw, &$map)
{
if (!$this->isRaw($raw)) {
return false;
}
$query = preg_replace_callback(
'/((FROM|TABLE|INTO|UPDATE)\s*)?\<([a-zA-Z0-9_\.]+)\>/i',
function ($matches) {
if (!empty($matches[2])) {
return $matches[2].' '.$this->tableQuote($matches[3]);
}
return $this->columnQuote($matches[3]);
},
$raw->value);
$raw_map = $raw->map;
if (!empty($raw_map)) {
foreach ($raw_map as $key => $value) {
$map[$key] = $this->typeMap($value, gettype($value));
}
}
return $query;
}
/**
* 给字符串添加引号.
*
* @param $string
*
* @return string
*/
public function quote($string)
{
return $this->pdo->quote($string);
}
/**
* @param $table
*
* @return string
*/
protected function tableQuote($table)
{
return '"'.$this->prefix.$table.'"';
}
protected function mapKey()
{
return ':MeDoO_'.$this->guid++.'_mEdOo';
}
protected function typeMap($value, $type)
{
$map = [
'NULL' => PDO::PARAM_NULL,
'integer' => PDO::PARAM_INT,
'double' => PDO::PARAM_STR,
'boolean' => PDO::PARAM_BOOL,
'string' => PDO::PARAM_STR,
'object' => PDO::PARAM_STR,
'resource' => PDO::PARAM_LOB,
];
if ($type === 'boolean') {
$value = ($value ? '1' : '0');
} elseif ($type === 'NULL') {
$value = null;
}
return [$value, $map[$type]];
}
/**
* 格式化数据.
*
* @param $string
*
* @return string
*/
protected function columnQuote($string)
{
if (strpos($string, '.') !== false) {
return '"'.$this->prefix.str_replace('.', '"."', $string).'"';
}
return '"'.$string.'"';
}
/**
* 格式化返回字段.
*
* @param $columns
*
* @return array|string
*/
protected function columnPush(&$columns, &$map)
{
if ($columns === '*') {
return $columns;
}
$stack = [];
if (is_string($columns)) {
$columns = [$columns];
}
foreach ($columns as $key => $value) {
if (is_array($value)) {
$stack[] = $this->columnPush($value, $map);
} elseif (!is_int($key) && $raw = $this->buildRaw($value, $map)) {
preg_match('/(?[a-zA-Z0-9_\.]+)(\s*\[(?(String|Bool|Int|Number))\])?/i', $key, $match);
$stack[] = $raw.' AS '.$this->columnQuote($match['column']);
} elseif (is_int($key) && is_string($value)) {
preg_match('/(?[a-zA-Z0-9_\.]+)(?:\s*\((?[a-zA-Z0-9_]+)\))?(?:\s*\[(?(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $match);
if (!empty($match['alias'])) {
$stack[] = $this->columnQuote($match['column']).' AS '.$this->columnQuote($match['alias']);
$columns[$key] = $match['alias'];
if (!empty($match['type'])) {
$columns[$key] .= ' ['.$match['type'].']';
}
} else {
$stack[] = $this->columnQuote($match['column']);
}
}
}
return implode($stack, ',');
}
/**
* @param $array
*
* @return string
*/
protected function arrayQuote($array)
{
$stack = [];
foreach ($array as $value) {
$stack[] = is_int($value) ? $value : $this->pdo->quote($value);
}
return implode($stack, ',');
}
/**
* @param $data
* @param $conjunctor
* @param $outer_conjunctor
*
* @return string
*/
protected function innerConjunct($data, $map, $conjunctor, $outer_conjunctor)
{
$stack = [];
foreach ($data as $value) {
$stack[] = '('.$this->dataImplode($value, $map, $conjunctor).')';
}
return implode($outer_conjunctor.' ', $stack);
}
/**
* @param $data
* @param $conjunctor
* @param null $outer_conjunctor
*
* @return string
*/
protected function dataImplode($data, &$map, $conjunctor)
{
$stack = [];
foreach ($data as $key => $value) {
$type = gettype($value);
if (
$type === 'array' &&
preg_match("/^(AND|OR)(\s+#.*)?$/", $key, $relation_match)
) {
$relationship = $relation_match[1];
$stack[] = $value !== array_keys(array_keys($value)) ?
'('.$this->dataImplode($value, $map, ' '.$relationship).')' :
'('.$this->innerConjunct($value, $map, ' '.$relationship, $conjunctor).')';
continue;
}
$map_key = $this->mapKey();
if (
is_int($key) &&
preg_match('/([a-zA-Z0-9_\.]+)\[(?\>\=?|\<\=?|\!?\=)\]([a-zA-Z0-9_\.]+)/i', $value, $match)
) {
$stack[] = $this->columnQuote($match[1]).' '.$match['operator'].' '.$this->columnQuote($match[3]);
} else {
preg_match('/([a-zA-Z0-9_\.]+)(\[(?\>\=?|\<\=?|\!|\<\>|\>\<|\!?~|REGEXP)\])?/i', $key, $match);
$column = $this->columnQuote($match[1]);
if (isset($match['operator'])) {
$operator = $match['operator'];
if (in_array($operator, ['>', '>=', '<', '<='])) {
$condition = $column.' '.$operator.' ';
if (is_numeric($value)) {
$condition .= $map_key;
$map[$map_key] = [$value, PDO::PARAM_INT];
} elseif ($raw = $this->buildRaw($value, $map)) {
$condition .= $raw;
} else {
$condition .= $map_key;
$map[$map_key] = [$value, PDO::PARAM_STR];
}
$stack[] = $condition;
} elseif ($operator === '!') {
switch ($type) {
case 'NULL':
$stack[] = $column.' IS NOT NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item) {
$placeholders[] = $map_key.$index.'_i';
$map[$map_key.$index.'_i'] = $this->typeMap($item, gettype($item));
}
$stack[] = $column.' NOT IN ('.implode(', ', $placeholders).')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map)) {
$stack[] = $column.' != '.$raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column.' != '.$map_key;
$map[$map_key] = $this->typeMap($value, $type);
break;
}
} elseif ($operator === '~' || $operator === '!~') {
if ($type !== 'array') {
$value = [$value];
}
$connector = ' OR ';
$data = array_values($value);
if (is_array($data[0])) {
if (isset($value['AND']) || isset($value['OR'])) {
$connector = ' '.array_keys($value)[0].' ';
$value = $data[0];
}
}
$like_clauses = [];
foreach ($value as $index => $item) {
$item = strval($item);
if (!preg_match('/(\[.+\]|_|%.+|.+%)/', $item)) {
$item = '%'.$item.'%';
}
$like_clauses[] = $column.($operator === '!~' ? ' NOT' : '').' LIKE '.$map_key.'L'.$index;
$map[$map_key.'L'.$index] = [$item, PDO::PARAM_STR];
}
$stack[] = '('.implode($connector, $like_clauses).')';
} elseif ($operator === '<>' || $operator === '><') {
if ($type === 'array') {
if ($operator === '><') {
$column .= ' NOT';
}
$stack[] = '('.$column.' BETWEEN '.$map_key.'a AND '.$map_key.'b)';
$data_type = (is_numeric($value[0]) && is_numeric($value[1])) ? PDO::PARAM_INT : PDO::PARAM_STR;
$map[$map_key.'a'] = [$value[0], $data_type];
$map[$map_key.'b'] = [$value[1], $data_type];
}
} elseif ($operator === 'REGEXP') {
$stack[] = $column.' REGEXP '.$map_key;
$map[$map_key] = [$value, PDO::PARAM_STR];
}
} else {
switch ($type) {
case 'NULL':
$stack[] = $column.' IS NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item) {
$placeholders[] = $map_key.$index.'_i';
$map[$map_key.$index.'_i'] = $this->typeMap($item, gettype($item));
}
$stack[] = $column.' IN ('.implode(', ', $placeholders).')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map)) {
$stack[] = $column.' = '.$raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column.' = '.$map_key;
$map[$map_key] = $this->typeMap($value, $type);
break;
}
}
}
}
return implode($conjunctor.' ', $stack);
}
/**
* @param $where
*
* @return string
*/
protected function whereClause($where, &$map)
{
$where_clause = '';
if (is_array($where)) {
$where_keys = array_keys($where);
$conditions = array_diff_key($where, array_flip(
['GROUP', 'ORDER', 'HAVING', 'LIMIT', 'LIKE', 'MATCH']
));
if (!empty($conditions)) {
$where_clause = ' WHERE '.$this->dataImplode($conditions, $map, ' AND');
}
if (isset($where['MATCH'])) {
$MATCH = $where['MATCH'];
if (is_array($MATCH) && isset($MATCH['columns'], $MATCH['keyword'])) {
$mode = '';
$mode_array = [
'natural' => 'IN NATURAL LANGUAGE MODE',
'natural+query' => 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
'boolean' => 'IN BOOLEAN MODE',
'query' => 'WITH QUERY EXPANSION',
];
if (isset($MATCH['mode'], $mode_array[$MATCH['mode']])) {
$mode = ' '.$mode_array[$MATCH['mode']];
}
$columns = implode(array_map([$this, 'columnQuote'], $MATCH['columns']), ', ');
$map_key = $this->mapKey();
$map[$map_key] = [$MATCH['keyword'], PDO::PARAM_STR];
$where_clause .= ($where_clause !== '' ? ' AND ' : ' WHERE').' MATCH ('.$columns.') AGAINST ('.$map_key.$mode.')';
}
}
if (isset($where['GROUP'])) {
$GROUP = $where['GROUP'];
if (is_array($GROUP)) {
$stack = [];
foreach ($GROUP as $column => $value) {
$stack[] = $this->columnQuote($value);
}
$where_clause .= ' GROUP BY '.implode($stack, ',');
} elseif ($raw = $this->buildRaw($GROUP, $map)) {
$where_clause .= ' GROUP BY '.$raw;
} else {
$where_clause .= ' GROUP BY '.$this->columnQuote($GROUP);
}
if (isset($where['HAVING'])) {
if ($raw = $this->buildRaw($where['HAVING'], $map)) {
$where_clause .= ' HAVING '.$raw;
} else {
$where_clause .= ' HAVING '.$this->dataImplode($where['HAVING'], $map, ' AND');
}
}
}
if (isset($where['ORDER'])) {
$ORDER = $where['ORDER'];
if (is_array($ORDER)) {
$stack = [];
foreach ($ORDER as $column => $value) {
if (is_array($value)) {
$stack[] = 'FIELD('.$this->columnQuote($column).', '.$this->arrayQuote($value).')';
} elseif ($value === 'ASC' || $value === 'DESC') {
$stack[] = $this->columnQuote($column).' '.$value;
} elseif (is_int($column)) {
$stack[] = $this->columnQuote($value);
}
}
$where_clause .= ' ORDER BY '.implode($stack, ',');
} elseif ($raw = $this->buildRaw($ORDER, $map)) {
$where_clause .= ' ORDER BY '.$raw;
} else {
$where_clause .= ' ORDER BY '.$this->columnQuote($ORDER);
}
if (
isset($where['LIMIT']) &&
in_array($this->type, ['oracle', 'mssql'])
) {
$LIMIT = $where['LIMIT'];
if (is_numeric($LIMIT)) {
$LIMIT = [0, $LIMIT];
}
if (
is_array($LIMIT) &&
is_numeric($LIMIT[0]) &&
is_numeric($LIMIT[1])
) {
$where_clause .= ' OFFSET '.$LIMIT[0].' ROWS FETCH NEXT '.$LIMIT[1].' ROWS ONLY';
}
}
}
if (isset($where['LIMIT']) && !in_array($this->type, ['oracle', 'mssql'])) {
$LIMIT = $where['LIMIT'];
if (is_numeric($LIMIT)) {
$where_clause .= ' LIMIT '.$LIMIT;
} elseif (
is_array($LIMIT) &&
is_numeric($LIMIT[0]) &&
is_numeric($LIMIT[1])
) {
$where_clause .= ' LIMIT '.$LIMIT[1].' OFFSET '.$LIMIT[0];
}
}
} elseif ($raw = $this->buildRaw($where, $map)) {
$where_clause .= ' '.$raw;
}
return $where_clause;
}
/**
* 格式化SQL语句.
*
* @param $table
* @param $join
* @param null $columns
* @param null $where
* @param null $column_fn
*
* @return string
*/
protected function selectContext($table, &$map, $join, &$columns = null, $where = null, $column_fn = null)
{
preg_match('/(?[a-zA-Z0-9_]+)\s*\((?[a-zA-Z0-9_]+)\)/i', $table, $table_match);
if (isset($table_match['table'], $table_match['alias'])) {
$table = $this->tableQuote($table_match['table']);
$table_query = $table.' AS '.$this->tableQuote($table_match['alias']);
} else {
$table = $this->tableQuote($table);
$table_query = $table;
}
$join_key = is_array($join) ? array_keys($join) : null;
if (
isset($join_key[0]) &&
strpos($join_key[0], '[') === 0
) {
$table_join = [];
$join_array = [
'>' => 'LEFT',
'<' => 'RIGHT',
'<>' => 'FULL',
'><' => 'INNER',
];
foreach ($join as $sub_table => $relation) {
preg_match('/(\[(?\<\>?|\>\)\])?(?[a-zA-Z0-9_]+)\s?(\((?[a-zA-Z0-9_]+)\))?/', $sub_table, $match);
if ($match['join'] !== '' && $match['table'] !== '') {
if (is_string($relation)) {
$relation = 'USING ("'.$relation.'")';
}
if (is_array($relation)) {
// For ['column1', 'column2']
if (isset($relation[0])) {
$relation = 'USING ("'.implode($relation, '", "').'")';
} else {
$joins = [];
foreach ($relation as $key => $value) {
$joins[] = (
strpos($key, '.') > 0 ?
// For ['tableB.column' => 'column']
$this->columnQuote($key) :
// For ['column1' => 'column2']
$table.'."'.$key.'"'
).
' = '.
$this->tableQuote(isset($match['alias']) ? $match['alias'] : $match['table']).'."'.$value.'"';
}
$relation = 'ON '.implode($joins, ' AND ');
}
}
$table_name = $this->tableQuote($match['table']).' ';
if (isset($match['alias'])) {
$table_name .= 'AS '.$this->tableQuote($match['alias']).' ';
}
$table_join[] = $join_array[$match['join']].' JOIN '.$table_name.$relation;
}
}
$table_query .= ' '.implode($table_join, ' ');
} else {
if (is_null($columns)) {
if (
!is_null($where) ||
(is_array($join) && isset($column_fn))
) {
$where = $join;
$columns = null;
} else {
$where = null;
$columns = $join;
}
} else {
$where = $columns;
$columns = $join;
}
}
if (isset($column_fn)) {
if ($column_fn === 1) {
$column = '1';
if (is_null($where)) {
$where = $columns;
}
} else {
if (empty($columns) || $this->isRaw($columns)) {
$columns = '*';
$where = $join;
}
$column = $column_fn.'('.$this->columnPush($columns, $map).')';
}
} else {
$column = $this->columnPush($columns, $map);
}
return 'SELECT '.$column.' FROM '.$table_query.$this->whereClause($where, $map);
}
//ColumnMap用于为数据库中的表的列建模。
protected function columnMap($columns, &$stack)
{
if ($columns === '*') {
return $stack;
}
foreach ($columns as $key => $value) {
if (is_int($key)) {
preg_match('/([a-zA-Z0-9_]+\.)?(?[a-zA-Z0-9_]+)(?:\s*\((?[a-zA-Z0-9_]+)\))?(?:\s*\[(?(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $key_match);
$column_key = !empty($key_match['alias']) ?
$key_match['alias'] :
$key_match['column'];
if (isset($key_match['type'])) {
$stack[$value] = [$column_key, $key_match['type']];
} else {
$stack[$value] = [$column_key, 'String'];
}
} elseif ($this->isRaw($value)) {
preg_match('/([a-zA-Z0-9_]+\.)?(?[a-zA-Z0-9_]+)(\s*\[(?(String|Bool|Int|Number))\])?/i', $key, $key_match);
$column_key = $key_match['column'];
if (isset($key_match['type'])) {
$stack[$key] = [$column_key, $key_match['type']];
} else {
$stack[$key] = [$column_key, 'String'];
}
} elseif (!is_int($key) && is_array($value)) {
$this->columnMap($value, $stack);
}
}
return $stack;
}
//数据图
protected function dataMap($data, $columns, $column_map, &$stack)
{
foreach ($columns as $key => $value) {
$isRaw = $this->isRaw($value);
if (is_int($key) || $isRaw) {
$map = $column_map[$isRaw ? $key : $value];
$column_key = $map[0];
$result = $data[$column_key];
if (isset($map[1])) {
if ($isRaw && in_array($map[1], ['Object', 'JSON'])) {
continue;
}
if (is_null($result)) {
$stack[$column_key] = null;
continue;
}
switch ($map[1]) {
case 'Number':
$stack[$column_key] = (float) $result;
break;
case 'Int':
$stack[$column_key] = (int) $result;
break;
case 'Bool':
$stack[$column_key] = (bool) $result;
break;
case 'Object':
$stack[$column_key] = unserialize($result);
break;
case 'JSON':
$stack[$column_key] = json_decode($result, true);
break;
case 'String':
$stack[$column_key] = $result;
break;
}
} else {
$stack[$column_key] = $result;
}
} else {
$current_stack = [];
$this->dataMap($data, $value, $column_map, $current_stack);
$stack[$key] = $current_stack;
}
}
}
/**
* 数据库查询.
*
* @param $table
* @param $join
* @param null $columns
* @param null $where
*
* @return array|bool
*/
public function select($table, $join, $columns = null, $where = null)
{
$map = [];
$stack = [];
$column_map = [];
$index = 0;
$column = $where === null ? $join : $columns;
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where), $map);
$this->columnMap($columns, $column_map);
if (!$query) {
return false;
}
if ($columns === '*') {
return $query->fetchAll(PDO::FETCH_ASSOC);
}
if ($is_single) {
return $query->fetchAll(PDO::FETCH_COLUMN);
}
while ($data = $query->fetch(PDO::FETCH_ASSOC)) {
$current_stack = [];
$this->dataMap($data, $columns, $column_map, $current_stack);
$stack[$index] = $current_stack;
++$index;
}
return $stack;
}
/**
* 插入新数据[可插入多条] 返回插入后的ID.
*
* @param $table
* @param $datas
*
* @return array
*/
public function insert($table, $datas)
{
$stack = [];
$columns = [];
$fields = [];
$map = [];
if (!isset($datas[0])) {
$datas = [$datas];
}
foreach ($datas as $data) {
foreach ($data as $key => $value) {
$columns[] = $key;
}
}
$columns = array_unique($columns);
foreach ($datas as $data) {
$values = [];
foreach ($columns as $key) {
if ($raw = $this->buildRaw($data[$key], $map)) {
$values[] = $raw;
continue;
}
$map_key = $this->mapKey();
$values[] = $map_key;
if (!isset($data[$key])) {
$map[$map_key] = [null, PDO::PARAM_NULL];
} else {
$value = $data[$key];
$type = gettype($value);
switch ($type) {
case 'array':
$map[$map_key] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR,
];
break;
case 'object':
$value = serialize($value);
// no break
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[$map_key] = $this->typeMap($value, $type);
break;
}
}
}
$stack[] = '('.implode($values, ', ').')';
}
foreach ($columns as $key) {
$fields[] = $this->columnQuote(preg_replace("/(\s*\[JSON\]$)/i", '', $key));
}
return $this->exec('INSERT INTO '.$this->tableQuote($table).' ('.implode(', ', $fields).') VALUES '.implode(', ', $stack), $map);
}
/**
* 更新指定条件的数据.
*
* @param $table
* @param $data
* @param null $where
*
* @return bool|int
*/
public function update($table, $data, $where = null)
{
$fields = [];
$map = [];
foreach ($data as $key => $value) {
$column = $this->columnQuote(preg_replace("/(\s*\[(JSON|\+|\-|\*|\/)\]$)/i", '', $key));
if ($raw = $this->buildRaw($value, $map)) {
$fields[] = $column.' = '.$raw;
continue;
}
$map_key = $this->mapKey();
preg_match('/(?[a-zA-Z0-9_]+)(\[(?\+|\-|\*|\/)\])?/i', $key, $match);
if (isset($match['operator'])) {
if (is_numeric($value)) {
$fields[] = $column.' = '.$column.' '.$match['operator'].' '.$value;
}
} else {
$fields[] = $column.' = '.$map_key;
$type = gettype($value);
switch ($type) {
case 'array':
$map[$map_key] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR,
];
break;
case 'object':
$value = serialize($value);
// no break
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[$map_key] = $this->typeMap($value, $type);
break;
}
}
}
return $this->exec('UPDATE '.$this->tableQuote($table).' SET '.implode(', ', $fields).$this->whereClause($where, $map), $map);
}
/**
* 删除指定条件的数据.
*
* @param $table
* @param $where
*
* @return bool|int
*/
public function delete($table, $where)
{
$map = [];
return $this->exec('DELETE FROM '.$this->tableQuote($table).$this->whereClause($where, $map), $map);
}
/**
* 将新的数据替换旧的数据.
*
* @param $table
* @param $columns
* @param null $search
* @param null $replace
* @param null $where
*
* @return bool|int
*/
public function replace($table, $columns, $where = null)
{
if (!is_array($columns) || empty($columns)) {
return false;
}
$map = [];
$stack = [];
foreach ($columns as $column => $replacements) {
if (is_array($replacements)) {
foreach ($replacements as $old => $new) {
$map_key = $this->mapKey();
$stack[] = $this->columnQuote($column).' = REPLACE('.$this->columnQuote($column).', '.$map_key.'a, '.$map_key.'b)';
$map[$map_key.'a'] = [$old, PDO::PARAM_STR];
$map[$map_key.'b'] = [$new, PDO::PARAM_STR];
}
}
}
if (!empty($stack)) {
return $this->exec('UPDATE '.$this->tableQuote($table).' SET '.implode(', ', $stack).$this->whereClause($where, $map), $map);
}
return false;
}
/**
* 从表中返回一行数据.
*
* @param $table
* @param null $join
* @param null $column
* @param null $where
*
* @return bool
*/
public function get($table, $join = null, $columns = null, $where = null)
{
$map = [];
$stack = [];
$column_map = [];
if ($where === null) {
$column = $join;
unset($columns['LIMIT']);
} else {
$column = $columns;
unset($where['LIMIT']);
}
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where).' LIMIT 1', $map);
if ($query) {
$data = $query->fetchAll(PDO::FETCH_ASSOC);
if (isset($data[0])) {
if ($column === '*') {
return $data[0];
}
$this->columnMap($columns, $column_map);
$this->dataMap($data[0], $columns, $column_map, $stack);
if ($is_single) {
return $stack[$column_map[$column][0]];
}
return $stack;
}
return false;
}
return false;
}
/**
* 验证数据是否存在.
*
* @param $table
* @param $join
* @param null $where
*
* @return bool
*/
public function has($table, $join, $where = null)
{
$map = [];
$column = null;
$query = $this->exec('SELECT EXISTS('.$this->selectContext($table, $map, $join, $column, $where, 1).')', $map);
if ($query) {
$result = $query->fetchColumn();
return $result === '1' || $result === true;
}
return false;
}
private function aggregate($type, $table, $join = null, $column = null, $where = null)
{
$map = [];
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, strtoupper($type)), $map);
if ($query) {
$number = $query->fetchColumn();
return is_numeric($number) ? $number + 0 : $number;
}
return false;
}
/**
* 启动一个事务
*
* @param $actions 事务内执行的方法
*
* @return bool
*/
public function action($actions)
{
if (is_callable($actions)) {
$this->pdo->beginTransaction();
try {
$result = $actions($this);
if ($result === false) {
$this->pdo->rollBack();
} else {
$this->pdo->commit();
}
} catch (Exception $e) {
$this->pdo->rollBack();
throw $e;
}
return $result;
}
return false;
}
/**
* 返回:最后插入的行ID.
*/
public function id()
{
$type = $this->type;
if ($type === 'oracle') {
return 0;
} elseif ($type === 'mssql') {
return $this->pdo->query('SELECT SCOPE_IDENTITY()')->fetchColumn();
} elseif ($type === 'pgsql') {
return $this->pdo->query('SELECT LASTVAL()')->fetchColumn();
}
return $this->pdo->lastInsertId();
}
/**
* 开启调式模式,只输出SQL不执行
* 如:$medoo->debug()->select(...).
*
* @return $this
*/
public function debug()
{
$this->debug_mode = true;
return $this;
}
/**
* 获得最后一个执行的错误.
*
* @return array
*/
public function error()
{
return $this->statement ? $this->statement->errorInfo() : null;
}
/**
* 返回最后一条执行的SQL语句.
*
* @return string
*/
public function last()
{
$log = end($this->logs);
return $this->generate($log[0], $log[1]);
}
/**
* 返回当前页面执行的所有查询SQL.
*
* @return array
*/
public function log()
{
return array_map(function ($log) {
return $this->generate($log[0], $log[1]);
},
$this->logs
);
}
/**
* 获得当前所连接数据库的信息.
*
* @return array
*/
public function info()
{
$output = [
'server' => 'SERVER_INFO',
'driver' => 'DRIVER_NAME',
'client' => 'CLIENT_VERSION',
'version' => 'SERVER_VERSION',
'connection' => 'CONNECTION_STATUS',
];
foreach ($output as $key => $value) {
$output[$key] = @$this->pdo->getAttribute(constant('PDO::ATTR_'.$value));
}
return $output;
}
}
你可能感兴趣的:(medoo --源码)
PXI PXIe控制器:4Link架构+16GB带宽,兼容主流机箱,设计文件涵盖原理图、PCB和FPGA源码,实现可直接制板,高带宽PXI PXIe控制器,4Link架构,兼容主流机箱,提供设计文件、
suRQWcVNi
fpga开发 程序人生
PXIPXIe控制器4Link架构16GB带宽兼容主流PXIe机箱设计文件原理图&PCBFPGA源码可直接制板ID:8245999662600997605浪里个浪里个浪001PXI和PXIe控制器是一种用于测量和自动化测试的高性能仪器。它们采用了4Link架构,可以提供高达16GB的数据传输带宽。同时,这些控制器还兼容主流的PXIe机箱,具有很好的兼容性。在设计文件方面,PXI和PXIe控制器提供
PXI/PXIe控制器 4Link架构 16GB带宽 兼容主流PXIe机箱 设计文件 原理图&PCB FPGA源码 可直
FjtKvOwLaGa
fpga开发 架构
PXI/PXIe控制器4Link架构16GB带宽兼容主流PXIe机箱设计文件!!!原理图&PCBFPGA源码可直接制板PXI和PXIe技术在现代仪器仪表领域中扮演着重要角色。其中,PXI(PCIeXtensionsforInstrumentation)是一种基于PCI总线的测试和测量平台,而PXIe则是对PXI进行扩展和增强的新一代标准。在PXI和PXIe平台中,控制器是关键组件之一,而PXIPX
asp.net mvc mysql 开源项目_【开源项目SugarSite】ASP.NET MVC+ Layui+ SqlSugar+RestSharp项目讲解...
weixin_39805732
asp.net mvc mysql 开源项目
SugarSite一个前端支持移动端的企业网站,目前只支持了简单功能,后续还会加上论坛等。源码GIT地址:技术介绍Layui个人而言不喜欢引用一堆东西,越简洁越好,layui正好能够满足我的这种需求,它是一款轻量级UI,JS部分都是采用模块化设计(AMD),对移动端支持比较不错。唯一不足是目前支持的组件有些少,需要有一定前端扩展能力的人才可以顺心使用。用法:例如我想用form.js和uploda.
C语言,记录一次局部变量被意外修改的问题
三日沐水
嵌入式全套学习教程 c语言
背景:单片机开发过程中,我在函数体内(begin_face_record)定义了一个局部变量data_length,在使用的时候,该局部变量一直别改变,每次调用其他函数,例如c库里面的函数memcpy,不知什么情况data_length值就会被改变。1、源码分析voidmain(void){init_gpio();init_face();face_power_up();begin_face_rec
Netty源码—3.Reactor线程模型四
东阳马生架构
Netty应用与源码 Netty Reactor线程模型
大纲5.NioEventLoop的执行总体框架6.Reactor线程执行一次事件轮询7.Reactor线程处理产生IO事件的Channel8.Reactor线程处理任务队列之添加任务9.Reactor线程处理任务队列之执行任务10.NioEventLoop总结8.Reactor线程处理任务队列之添加任务(1)Reactor线程执行一次事件轮询的过程(2)任务的分类和添加说明(3)普通任务的添加(4
Netty源码分析之Reactor线程模型详解
Java-进阶架构师
java java编程 java 后端 java-ee
在分析源码之前,我们先分析,哪些地方用到了EventLoop?NioServerSocketChannel的连接监听注册NioSocketChannel的IO事件注册NioServerSocketChannel连接监听在AbstractBootstrap类的initAndRegister()方法中,当NioServerSocketChannel初始化完成后,会调用case标记位置的代码进行注册。f
第十四次CCF-CSP认证(含C++源码)
曦月逸霜
算法 c++ 数据结构 学习
第十四次CCF-CSP认证卖菜满分思路买菜满分思路再卖菜满分题解(差分约束)solution1(枚举correctbut超时)solution2(正解)卖菜题目链接满分思路就是模拟一下这个调整第二天菜价的过程,其中对于两种只有一个邻居的情况下做出调整,三个for循环分别处理输入,调整,输出#includeusingnamespacestd;constintN=1010;intyes[N],toda
Netty源码—2.Reactor线程模型二
东阳马生架构
Netty应用与源码 Netty Reactor线程模型
大纲1.关于NioEventLoop的问题整理2.理解Reactor线程模型主要分三部分3.NioEventLoop的创建4.NioEventLoop的启动4.NioEventLoop的启动(1)启动NioEventLoop的两大入口(2)判断当前线程是否是NioEventLoop线程(3)创建一个线程并启动(4)NioEventLoop的启动总结(1)启动NioEventLoop的两大入口入口一
oceanbase与mysql性能对比_金融业分布式数据库:TDSQL、HotDB、OceanBase等原理、POC性能对比及选择是......
高中物理宋老师
本帖最后由Amygo于2020-3-1501:33编辑1、分布式的实现,是通过中间件实现分布式,还是源码级别引入分布式算法实现的?解答:(1)分布式数据库是至少由计算节点、存储节点、管理平台、备份还原程序四个部分组成,从数据库系统理论知识上说分成:全局自治和场地自治,也粗略认为:全局可理解为计算节点、场地可理解为存储节点(2)这个问题的标题“中间件实现分布式还是源码级别引入分布式算法”这个说法存在
技术革命、需求升级与商业生态迭代——基于开源AI大模型与智能商业范式的创新研究
说私域
人工智能 开源 小程序 微信 零售
摘要:本文以技术哲学与商业生态系统理论为分析框架,通过质性研究与案例分析法,系统阐释第三次与第四次科技革命如何通过技术范式创新引发用户需求跃迁,进而驱动商业生态系统的结构性变革。研究聚焦开源AI大模型、AI智能名片、S2B2C商城及小程序源码等前沿技术工具,解构其如何重构"技术赋权-需求进化-商业物种爆发"的价值传导链条。研究发现:技术革命通过创造新需求空间、重构价值网络拓扑结构、降低创新参与门槛
H5动态生日祝福源码
cas215asd
源码 html5
源码名称:动态生日祝福源码源码介绍:一款H5动态生日祝福源码,源码带有文字敲入效果与蛋糕生成特效。需求环境:H5下载地址:https://www.changyouzuhao.cn/14540.html
基于python+django的旅游信息网站-旅游景点门票管理系统源码+运行步骤
冷琴1996
Python系统设计 python django 旅游
该系统是基于python+django开发的旅游景点门票管理系统。是给师弟做的课程作业。大家学习过程中,遇到问题可以在github咨询作者。学习过程问题可以留言哦演示地址前台地址:http://travel.gitapp.cn后台地址:http://travel.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://github.com/
50个常见的python毕业设计/课程设计(源码+文档)
冷琴1996
Python系统设计 python 课程设计 开发语言
计算机课程设计/毕业设计指南,为计算机相关专业毕业生提供源码、数据库安装、远程调试等相关服务,提供功能讲解视频。下面是50个基于python/django/vue的毕业设计/课程设计。1.网上商城系统这是一个基于python+vue开发的商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、商品
分享Python7个爬虫小案例(附源码)
人工智能-猫猫
爬虫 python 开发语言
在这篇文章中,我们将分享7个Python爬虫的小案例,帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码:1.爬取豆瓣电影Top250这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息,并将这些信息保存到CSV文件中。importrequestsfrombs4importBeautifulSoupimportcsv#请求U
基于cesium的二三维地图
程序员小美
博客 毕业设计 源码分享 java 开源 vue
一、项目简介基于cesium的二三维地图二、实现功能支持虚线和阴影支持以标注的方式显示属性支持要素查询支持二三维度地球显示支持小数据量文件矢量动态切片三、技术选型Cesiumproj4jsturftext-encodinggeojson-topojsonshpjs四、界面展示五、源码地址回复:地图
基于python+django+mysql的小区物业管理系统源码+运行步骤
冷琴1996
Python系统设计 python 开发语言
该系统是基于python+django开发的小区物业管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。主要功能有:业主管理、报修管理、停车管理、资产管理、小区管理、用户管理、日志管理、系统信息。源码学习技术。演示地址http://wuye.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https:/
适合阅读源码的 Java 优质开源框架、库盘点(初级友好项目、中级进阶项目、高级深入项目)
我命由我12345
Java - 项目 java 开源 开发语言 java-ee spring boot spring intellij-idea
一、初级友好项目1、JUnit5基本介绍:JUnit5是单元测试框架,代码简洁,适合学习测试驱动开发(TDD)和设计模式GitHub地址:https://github.com/junit-team/junit5特点:代码量适中,模块化设计,适合学习测试框架的实现原理2、Guava基本介绍:Guava是Google核心库,包含集合、缓存、字符串处理等工具类GitHub地址:https://githu
nextjs 实现rag知识库检索增强的ai问答app
*goliter *
web开发学习 人工智能
AI-Chat-一个基于LLM大语言模型的知识库问答系统项目源码:https://github.com/goliter/ai-chat项目简介AI-Chat是一个基于Next.js和React开发的现代化大语言模型的知识库问答系统。该平台提供了简易的对话界面,支持上传文件进行知识库的构建,让用户在与大语言模型进行问答时给与大模型知识库内的相关内容。主要功能上传文件构建属于自己的知识库支持doc,t
基于python+django的家教预约网站-家教信息管理系统源码+运行步骤
冷琴1996
Python系统设计 python django 开发语言
该系统是基于python+django开发的家教预约网站。是给师妹做的课程作业。大家在学习过程中,遇到问题可以在github给作者留言。共同学习进步哦效果演示前台地址:http://jiajiao.gitapp.cn后台地址:http://jiajiao.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://github.com/geee
mysql数据库应用与开发姜桂洪 课后答案_清华大学出版社-图书详情-《MySQL数据库应用与开发》...
韦盛江
课后答案
前言Oracle公司的MySQL是目前最流行的关系数据库管理系统之一。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL数据库以其精巧灵活、运行速度快、经济适用性强、开放源码等优势,作为网站数据库获得许多中小型网站的开发公司的青睐。MySQL性能卓越,搭配PHP和Apache可组成良好的软件开发环境,并且已经大量部署到中小型企业和高校的教学平台。本书从教学实际需求出发,结合
python基于Django的旅游景点数据分析及可视化的设计与实现 7blk7
qq2295116502
python django 数据分析
目录项目介绍技术栈具体实现截图Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取项目介绍大数据分析是现下比较热门的词汇,通过分析之后可以得到更多深入且有价值的信息。现实的科技手段中,越来越多的应用都会涉及到大数据随着大数据时代的到来,数据挖掘、分析与应用成为多个行业的关键,本课题首先介绍了网络爬虫的基本概念以及技术实现方法
源码篇:python生成《蔬菜店销售数据分析报告》案例
IT小本本
python python 数据分析 开发语言
本文将通过Python实现一个完整的蔬菜销售数据分析项目,涵盖数据生成、清洗、分析及可视化全流程。我们将利用模拟数据生成技术创建90天的销售记录,通过Pandas进行数据处理,结合Matplotlib和Seaborn实现多样化的可视化图表,并最终生成动态交互报告。一、数据生成:模拟真实销售场景为了模拟真实的蔬菜销售数据,我们设计了包含10种蔬菜(白菜、土豆、西红柿等)的90天销售记录。数据生成逻辑
JAVA毕业设计BS架构考研交流学习平台设计与实现计算机源码+lw文档+系统+调试部署+数据库
瑞致网络
java 开发语言 jvm
JAVA毕业设计BS架构考研交流学习平台设计与实现计算机源码+lw文档+系统+调试部署+数据库JAVA毕业设计BS架构考研交流学习平台设计与实现计算机源码+lw文档+系统+调试部署+数据库本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:
[附源码]Python计算机毕业设计SSM基于B-S的心理健康管理系统(程序+LW)
Python、JAVA毕设程序源码
java 开发语言
环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:
计算机毕业设计JavaBS景区票务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
毅铭科技
数据库
计算机毕业设计JavaBS景区票务管理系统设计与实现(源码+系统+mysql数据库+lw文档)计算机毕业设计JavaBS景区票务管理系统设计与实现(源码+系统+mysql数据库+lw文档)本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:
cv2 orb 图像拼接_图像拼接Opencv源码重构
是佐罗而非索隆
cv2 orb 图像拼接
请看赵春江https://me.csdn.net/zhaocj的主页,他已经对Opencv图像拼接流程中的代码做了很详细的解释。前人栽树,后人乘凉。一.本文所做的事1.重构了Opencv图像拼接的源代码,整个代码是面向过程的;2.在赵春江源码分析基础上,对一些细节部分进行说明。代码链接:https://github.com/mhhai/ImageStitch二.特征点检测一切起源于这段代码Ptrf
springboot基于java的企业档案管理信息系统
QQ80213251
java spring boot 后端
收藏关注不迷路!!文末获取源码+数据库感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录前言详细视频演示一、项目介绍二、功能介绍三、核心代码数据库参考四、效果图五、文章目录六、源码获取前言企业档案管理信息系统是一种旨在提高文件资料归档、检索和利用效率的信息化解决方案。该系统通过电子化手段对企业的各类文档和档案进行归
python+flask计算机毕业设计基于Android平台的景区移动端旅游软件系统(程序+开题+论文)
Node.js彤彤 程序
python flask 课程设计
本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分,特别是在旅游领域,移动端应用以其便捷性、实时性和个性化服务的特点,极大地改变了人们的旅游体验方式。当前,旅游市场日益繁荣,游客对于旅游信息获取、行程规划、景点导航、票务预订及个性化服务的需
深入分析串口使用rs485功能的内部机制之使用gpio控制传输方向读取rs485温湿度传感器数据(第一期)
@曙光,
linux 网络 嵌入式
前言首先这是一篇涉及内核分析的,学习这篇文章最好是打开内核源码跟着我的分析去看,我参考的内核源码是linux5.4内核,也可以辅助ai去分析。ModbusRTU读取rs485温湿度传感器使用ModbusRTU读取rs485温湿度传感器有俩种方法,第一种采用gpio控制数据的传输方向:高电平表示主发从收,低电平表示主收从发。第二种采用硬件流控的方法使用串口的rts引脚和cts引脚自动控制收发方向,接
基于AT89C52单片机的智能导盲杖报警设计
七月小卖铺
单片机 单片机 嵌入式硬件
点击链接获取Keil源码与ProjectBackups仿真图:https://download.csdn.net/download/qq_64505944/90498287?spm=1001.2014.3001.5503C+22部分参考设计如下:摘要超声波测距技术因其具有较强的指向性、低能耗、较长的传播距离等优点,已成为广泛应用于各类传感器技术和自动控制技术相结合的测距方案之一。超声波传感器利用声
对于规范和实现,你会混淆吗?
yangshangchuan
HotSpot
昨晚和朋友聊天,喝了点咖啡,由于我经常喝茶,很长时间没喝咖啡了,所以失眠了,于是起床读JVM规范,读完后在朋友圈发了一条信息:
JVM Run-Time Data Areas:The Java Virtual Machine defines various run-time data areas that are used during execution of a program. So
android 网络
百合不是茶
网络
android的网络编程和java的一样没什么好分析的都是一些死的照着写就可以了,所以记录下来 方便查找 , 服务器使用的是TomCat
服务器代码; servlet的使用需要在xml中注册
package servlet;
import java.io.IOException;
import java.util.Arr
[读书笔记]读法拉第传
comsci
读书笔记
1831年的时候,一年可以赚到1000英镑的人..应该很少的...
要成为一个科学家,没有足够的资金支持,很多实验都无法完成
但是当钱赚够了以后....就不能够一直在商业和市场中徘徊......
随机数的产生
沐刃青蛟
随机数
c++中阐述随机数的方法有两种:
一是产生假随机数(不管操作多少次,所产生的数都不会改变)
这类随机数是使用了默认的种子值产生的,所以每次都是一样的。
//默认种子
for (int i = 0; i < 5; i++)
{
cout<<
PHP检测函数所在的文件名
IT独行者
PHP 函数
很简单的功能,用到PHP中的反射机制,具体使用的是ReflectionFunction类,可以获取指定函数所在PHP脚本中的具体位置。 创建引用脚本。
代码:
[php]
view plain
copy
// Filename: functions.php
<?php&nbs
银行各系统功能简介
文强chu
金融
银行各系统功能简介 业务系统 核心业务系统 业务功能包括:总账管理、卡系统管理、客户信息管理、额度控管、存款、贷款、资金业务、国际结算、支付结算、对外接口等 清分清算系统 以清算日期为准,将账务类交易、非账务类交易的手续费、代理费、网络服务费等相关费用,按费用类型计算应收、应付金额,经过清算人员确认后上送核心系统完成结算的过程 国际结算系
Python学习1(pip django 安装以及第一个project)
小桔子
python django pip
最近开始学习python,要安装个pip的工具。听说这个工具很强大,安装了它,在安装第三方工具的话so easy!然后也下载了,按照别人给的教程开始安装,奶奶的怎么也安装不上!
第一步:官方下载pip-1.5.6.tar.gz, https://pypi.python.org/pypi/pip easy!
第二部:解压这个压缩文件,会看到一个setup.p
php 数组
aichenglong
PHP 排序 数组 循环 多维数组
1 php中的创建数组
$product = array('tires','oil','spark');//array()实际上是语言结构而不 是函数
2 如果需要创建一个升序的排列的数字保存在一个数组中,可以使用range()函数来自动创建数组
$numbers=range(1,10)//1 2 3 4 5 6 7 8 9 10
$numbers=range(1,10,
安装python2.7
AILIKES
python
安装python2.7
1、下载可从 http://www.python.org/进行下载#wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
2、复制解压
#mkdir -p /opt/usr/python
#cp /opt/soft/Python-2
java异常的处理探讨
百合不是茶
JAVA异常
//java异常
/*
1,了解java 中的异常处理机制,有三种操作
a,声明异常
b,抛出异常
c,捕获异常
2,学会使用try-catch-finally来处理异常
3,学会如何声明异常和抛出异常
4,学会创建自己的异常
*/
//2,学会使用try-catch-finally来处理异常
getElementsByName实例
bijian1013
element
实例1:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/x
探索JUnit4扩展:Runner
bijian1013
java 单元测试 JUnit
参加敏捷培训时,教练提到Junit4的Runner和Rule,于是特上网查一下,发现很多都讲的太理论,或者是举的例子实在是太牵强。多搜索了几下,搜索到两篇我觉得写的非常好的文章。
文章地址:http://www.blogjava.net/jiangshachina/archive/20
[MongoDB学习笔记二]MongoDB副本集
bit1129
mongodb
1. 副本集的特性
1)一台主服务器(Primary),多台从服务器(Secondary)
2)Primary挂了之后,从服务器自动完成从它们之中选举一台服务器作为主服务器,继续工作,这就解决了单点故障,因此,在这种情况下,MongoDB集群能够继续工作
3)挂了的主服务器恢复到集群中只能以Secondary服务器的角色加入进来
2
【Spark八十一】Hive in the spark assembly
bit1129
assembly
Spark SQL supports most commonly used features of HiveQL. However, different HiveQL statements are executed in different manners:
1. DDL statements (e.g. CREATE TABLE, DROP TABLE, etc.)
Nginx问题定位之监控进程异常退出
ronin47
nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧。
1. 在error.log中查看是否有signal项,如果有,看看signal是多少。
比如,这是一个异常退出的情况:
$grep signal error.log
2012/12/24 16:39:56 [alert] 13661#0: worker process 13666 exited on s
No grammar constraints (DTD or XML schema).....两种解决方法
byalias
xml
方法一:常用方法 关闭XML验证
工具栏:windows => preferences => xml => xml files => validation => Indicate when no grammar is specified:选择Ignore即可。
方法二:(个人推荐)
添加 内容如下
<?xml version=
Netty源码学习-DefaultChannelPipeline
bylijinnan
netty
package com.ljn.channel;
/**
* ChannelPipeline采用的是Intercepting Filter 模式
* 但由于用到两个双向链表和内部类,这个模式看起来不是那么明显,需要仔细查看调用过程才发现
*
* 下面对ChannelPipeline作一个模拟,只模拟关键代码:
*/
public class Pipeline {
MYSQL数据库常用备份及恢复语句
chicony
mysql
备份MySQL数据库的命令,可以加选不同的参数选项来实现不同格式的要求。
mysqldump -h主机 -u用户名 -p密码 数据库名 > 文件
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
mysqldump -–add-drop-table -uusername -ppassword databasename > ba
小白谈谈云计算--基于Google三大论文
CrazyMizzz
Google 云计算 GFS
之前在没有接触到云计算之前,只是对云计算有一点点模糊的概念,觉得这是一个很高大上的东西,似乎离我们大一的还很远。后来有机会上了一节云计算的普及课程吧,并且在之前的一周里拜读了谷歌三大论文。不敢说理解,至少囫囵吞枣啃下了一大堆看不明白的理论。现在就简单聊聊我对于云计算的了解。
我先说说GFS
&n
hadoop 平衡空间设置方法
daizj
hadoop balancer
在hdfs-site.xml中增加设置balance的带宽,默认只有1M:
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
<description&g
Eclipse程序员要掌握的常用快捷键
dcj3sjt126com
编程
判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。 曾有人在豆瓣评
《卓有成效的程序员》:“人有多大懒,才有多大闲”。之前我整理了一个
程序员图书列表,目的也就是通过读书,让程序员变懒。 程序员作为特殊的群体,有的人可以这么懒,懒到事情都交给机器去做,而有的人又可以那么勤奋,每天都孜孜不倦得
Android学习之路
dcj3sjt126com
Android学习
转自:http://blog.csdn.net/ryantang03/article/details/6901459
以前有J2EE基础,接触JAVA也有两三年的时间了,上手Android并不困难,思维上稍微转变一下就可以很快适应。以前做的都是WEB项目,现今体验移动终端项目,让我越来越觉得移动互联网应用是未来的主宰。
下面说说我学习Android的感受,我学Android首先是看MARS的视
java 遍历Map的四种方法
eksliang
java HashMap java 遍历Map的四种方法
转载请出自出处:
http://eksliang.iteye.com/blog/2059996
package com.ickes;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
* 遍历Map的四种方式
【精典】数据库相关相关
gengzg
数据库
package C3P0;
import java.sql.Connection;
import java.sql.SQLException;
import java.beans.PropertyVetoException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBPool{
自动补全
huyana_town
自动补全
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml&quo
jquery在线预览PDF文件,打开PDF文件
天梯梦
jquery
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。
核心代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.
ViewPager刷新单个页面的方法
lovelease
android viewpager tag 刷新
使用ViewPager做滑动切换图片的效果时,如果图片是从网络下载的,那么再子线程中下载完图片时我们会使用handler通知UI线程,然后UI线程就可以调用mViewPager.getAdapter().notifyDataSetChanged()进行页面的刷新,但是viewpager不同于listview,你会发现单纯的调用notifyDataSetChanged()并不能刷新页面
利用按位取反(~)从复合枚举值里清除枚举值
草料场
enum
以 C# 中的 System.Drawing.FontStyle 为例。
如果需要同时有多种效果,
如:“粗体”和“下划线”的效果,可以用按位或(|)
FontStyle style = FontStyle.Bold | FontStyle.Underline;
如果需要去除 style 里的某一种效果,
Linux系统新手学习的11点建议
刘星宇
编程 工作 linux 脚本
随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。这里介绍学习Linux的一些建议。
一、从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linu
hibernate dao层应用之HibernateDaoSupport二次封装
wangzhezichuan
DAO Hibernate
/**
* <p>方法描述:sql语句查询 返回List<Class> </p>
* <p>方法备注: Class 只能是自定义类 </p>
* @param calzz
* @param sql
* @return
* <p>创建人:王川</p>
* <p>创建时间:Jul