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 --源码)
由 Mybatis 源码畅谈软件设计(九):“能用就行” 其实远远不够
方圆想当图灵
由 Mybatis 源码畅谈软件设计 mybatis java 开发语言 代码规范
到本节Mybatis源码中核心逻辑基本已经介绍完了,在这里我想借助Mybatis其他部分源码来介绍一些我认为在编程中能最快提高编码质量的小方法,它们可能比较细碎,希望能对大家有所启发。关于方法的长度和方法拆分之前我在读完《代码整洁之道》时,非常痴迷于写小方法这件事,记得某次代码评审时,有同事对将一个大方法拆分成多个小方法提出了异议:拆分出的小方法不能算作做了一件事,它们都只是大方法中的一个“动作”
自编大模型系列之 01 使用 Python 从头构建 LLaMA 3 编写您自己的十亿参数LLM(教程含源码)
知识大胖
NVIDIA GPU和大语言模型开发教程 python llama 开发语言
LLaMA3是继Mistral之后最有前途的开源模型之一,可以解决各种任务。我之前在Medium上写过一篇博客,介绍如何使用LLaMA架构从头开始创建一个具有超过230万个参数的LLM。现在LLaMA-3已经发布,我们将以更简单的方式重新创建它。我们不会在本博客中使用GPU,但您至少需要17GB的RAM,因为我们将加载一些大小超过15GB的文件。如果这对您来说是个问题,您可以使用Kaggle作为解
STM32MP157A之U-boot移植
学编程的小杨
stm32 嵌入式硬件 单片机
(一)U-boot移植步骤1.1》导入源码1)打开ubuntu,打开终端(ctrl+alt+T),在用户目录下建立如下目录:linux@ubuntu:~$mkdirfs_mp157alinux@ubuntu:~$cdfs_mp157a/linux@ubuntu:~/fs_mp157a$mkdirkerneldriversfs_mp157a-----stm32mp157驱动开发总目录kernel--
QML实现自己的桌面萌宠源码分享
小灰灰搞电子
QML开发 数据库
一、效果展示1、撒娇2、拖动3、右下角效果二、源码分享1、工程目录2、主窗口源码Main.qmlimportQtQuickimportQtQuick.ControlsWindow{width:640height:480visible:truetitle:qsTr("HelloWorld")propertyQtObjectpetWindow:nullComponent.onCompleted:{va
2025年计算机毕业设计选题推荐、题目参考
计算机Java毕业设计
计算机毕设选题推荐案例 spring boot 课程设计 java 毕业设计 毕设 后端 大数据
博主介绍:✌全网粉丝30W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导✌主要服务内容:选题定题、开题报告、任务书、程序开发、文档编写和辅导、文档降重、程序讲解、答辩辅导等,欢迎咨询~文末获取源码+数据库+文档感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我沟通,希望
【Linux知识】Linux上从源码编译到软件安装全过程详细说明
问道飞鱼
服务器相关 Linux相关技术 linux 运维 服务器 编译
文章目录**1.下载源码****(1)使用`wget`或`curl`下载****(2)解压源码****2.配置编译环境****(1)执行`./configure`脚本**常见参数说明:**3.编译源码****(1)执行`make`****4.安装软件****(1)执行`makeinstall`****(2)自定义安装路径****5.验证安装****(1)检查版本信息****(2)查看安装路径***
【Java设计模式】Java设计模式之(十五)策略模式(Strategy Pattern)
No8g攻城狮
Java设计模式 设计模式 java 开发语言
本文目录一、策略模式介绍1.1含义1.2适用场景1.3主要解决1.4应用实例1.5优缺点二、策略模式实现2.1类图2.2代码实现第一个案例:策略模式代码实现第二个案例:策略模式代码实现2.3角色分析三、源码分析这种类型的设计模式属于行为型模式。一、策略模式介绍1.1含义在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式
Spring MVC 之父子容器详解
码农爱java
【Spring MVC】 spring mvc java 父子容器 Spring MVC 面试
前言:前面在分析SpringMVC初始化源码的时候也提到过父容器的概念,当时我们只是对源码进行解析,并没有去深究为什么要有父容器和子容器,本篇我们将对SpringMVC中的父子容器进行分析。SpringMVC知识传送门:详解SpringMVC(SpringMVC简介)SpringMVC初始化源码分析SpringMVC工作流程源码分析SpringMVC源码分析之DispatcherServlet#g
基于matlab的帧间差法进行视频目标检测系统
挂科边缘
MATLAB项目实战 matlab 人工智能 计算机视觉
文章目录前言一、理论基础1.帧间差分法2.背景差分法3.光流法二、程序实现总结源码下载前言运动目标自动检测是对运动目标进行检测、提取、识别和跟踪的技术。基于视频序列的运动目标检测,一直以来都是机器视觉、智能监控系统、视频跟踪系统等领域的研究重点,是整个计算机视觉的研究难点之一。运动目标检测的结果正确性对后续的图像处理、图像理解等工作的顺利开展具有决定性的作用,所以能否将运动物体从视频序列中准确地检
elasticsearch添加kerberos认证完整操作流程
鸡蛋可好吃了
elasticsearch jenkins 大数据 java
kerberos认证的教程网上有很多,但是es的真的找遍全网都很少有详细的教程!我苦读官网,到处搜罗零碎信息,才终于完成es的kerberos认证。文章目录一、elasticsearch升级白金版1.下载对应版本源码,修改相关类2.编译后替换jar包中的class文件3.更新license二、搭建kerberos服务1.安装kerberos服务端2.安装kerberos客户端3.服务端配置文件kd
ELK性能优化实战总结:kafka与rabbitmq
m0_56824583
程序员 面试 经验分享 java
4年经验应该具备哪些技能首先,简单的聊一下我认为的4年经验左右、优秀的Java程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。专业技能方面基础:JDK常用类的原理、源码、使用场景。设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。数据结构:数组、链表、栈、队列、树。网络:TCP、HTTP、HTTPS、负载均衡算法。框架:SpringIoC原理、Sp
恢复更新--vue源码系列1之如何看源码
@LitterFisher
vue vue.js javascript 前端
年过完了,是时候学习了(狗头)。文章目录前言一、前提二、如何看1.学会断点debuger2.整体看代码3.结合别人的vue源码解释总结前言本系列为vue2.6版本的源码分析系列一、前提你总不能一个vue的项目也没写过吧二、如何看1.学会断点debuger巧妙运用这个你会发现看源码会轻松很多。(相信我如果不是很快你就从入门到放弃)为什么?vue里面做了很多性能优化,参数初始化的工作,如果你全部看完,
深入剖析 Spring Boot 中 @EnableAutoConfiguration:从源码到实际应用
狂飙程序员
spring boot 后端 java spring 开发语言
引言SpringBoot以其“约定优于配置”的先进理念,极大地简化了Spring应用的开发流程。其中,@EnableAutoConfiguration注解作为SpringBoot自动配置机制的核心,发挥着举足轻重的作用。它允许SpringBoot根据项目中添加的依赖自动配置Spring应用,大大减少了开发者手动配置的工作量。本文将从架构师和源码分析的角度出发,深入探讨@EnableAutoConf
chromedriver自动下载 —— python
(* ̄︶ ̄)(*^▽^*)
python 开发语言
#工作实践webdriver自带的ChromeDriverManager().install()方法,对应的驱动地址自从114版本后没有更新了;隔一段时间就需要手动下载驱动,所以写了一个简单的自动更新方法,还有一些不足,勉强够用吧1、查看源码,大致是保存了一个json文件,每次获取driver最后更新版本,并更新到json文件中;然后下载最新的资源并解压到文件夹2、本来想改源码,但是有修改提示,考
详细的Wireshark插件开发实用技巧分享
日记成书
反正看不懂系列 wireshark 测试工具 网络
以下是Wireshark插件开发的实用技巧,结合网络资源和实践经验整理而成:一、开发环境搭建与工具选择环境配置Windows开发:需安装Cygwin或MSYS2模拟Linux环境,并下载Wireshark源码进行编译。建议使用Wireshark官方文档推荐的编译工具链(如CMake和MinGW)。Linux开发:直接通过包管理器安装Wireshark开发依赖库(如libwireshark-dev)
【Python大语言模型系列】如何在LangChain中使用ReAct构建AI Agent(案例+源码)
脱泥不tony
人工智能 python 语言模型 自然语言处理 AI大模型 LangChain Agent
一、引言========当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AIAgent,比如字节的Coze,百度的千帆等,还有开源的Dify。你是否想知道其中的原理?是否想过自己如何实现一套AIAgent?当然,借助LangChain就可以。ReAct(ReasoningandAction)是一个框架,其核心思想,就是通过思维链的方式,引导模型将复杂问题进行拆分,一步一步地
基于python+django的宠物商店-宠物管理系统源码+运行步骤
冷琴1996
Python系统设计 python django 宠物
该系统是基于python+django开发的宠物商店-宠物管理系统。是给师妹开发的课程作业。现将源码开放给大家。大家学习过程中,如遇问题可以在github咨询作者。加油演示地址前台地址:http://pet.gitapp.cn后台地址:http://pet.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://github.com/gee
3D gaussian splatting 源码剖析与demo验证
scott198512
三维重建新范式与SLAM 3D重建 计算机视觉 图形渲染
0.概述本文对最原始的3DGS源码进行剖析,逐段分析其中的主要代码模块,结合其原理加深理解,同时结合demo演示给出具体的验证。1.流程图2.源码剖析3.验证与实现
HTML静态网页成品作业(HTML+CSS)——西点蛋糕介绍(5个页面)
爱码网页成品
HTML网页成品 静态网页成品 学生网页 html css 前端
不定期分享源码,关注不丢失哦文章目录一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码五、源码获取一、作品介绍️本套采用HTML+CSS,未使用Javacsript代码,共有5个页面。二、作品演示三、代码目录四、网站代码HTML部分代码首页西点简介西点分类西点展示西点做法SWEETYSWEET提拉米苏布丁芝士蛋糕泡芙马卡龙西式的甜品花团锦簇,尤以意、法为盛。提拉米苏(Tiramisu
中秋猜灯谜_猜字谜小程序源码,无需服务器
用户7444622512
css
这款小程序搭建是免服务器和域名的,serverless,没有后端;无需设置合法域名的!上传就可以使用;只需要使用微信开发者工具打开源码然后上传审核就可以了!这款小程序其实比较简洁,分两种模式青铜模式(普通)和王者模式(困难),猜题里面还支持答案提示,当然是有次数限制的。————————————————资源下载:
手把手教你如何使用java开发人脸识别及人脸比对(附源码)
java人脸识别后端深度学习
痛点目前,常用的人脸识别算法大多基于Python开发,因为Python对深度学习框架的支持较好,且许多优秀的人脸识别算法都是在深度学习框架下实现的。然而,对于Java开发者来说,这种情况并不十分友好。传统上,Java开发的人脸识别算法主要依赖OpenCV,但与基于深度学习的算法相比,OpenCV的精度相对较低。此外,若Java开发者希望使用Python实现的算法,还需要安装Python环境,并且熟
【花雕学编程】Arduino FOC 之四旋翼飞行器位置定点控制
驴友花雕
嵌入式硬件 单片机 c++ Arduino FOC 四旋翼飞行器位置定点控制
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Ardui
serverless framework 模块化部署
ice breaker
Serverless nodejs serverless framework serverless
serverlessframework模块化部署文章仅代表作者本人的认知,如有谬误,欢迎指正。文章建议配合@serverless/components源码食用本文使用的示例代码Forkedfromsecond-state/tencent-tensorflow-scf这个仓库可以直接部署成一个Serverless的AI推理函数,很有意思书接上回@serverless/components代码简析默认
linux系统移植(5)——TF-A移植
小徐的记事本
# Linux内核移植 单片机 stm32 嵌入式硬件
获取tf-a的源码1.从st的官方下载https://www.st.com/content/st_com/zh/products/embedded-software/mcu-mpuembedded-software/stm32-embedded-software/stm32-mpu-openstlinuxdistribution/stm32mp1starter.html
LeetCode - 216 组合总和 III
程序员阿甘
华为OD算法刷题笔记 算法 JavaScript leetcode
目录题目来源题目描述示例提示题目解析算法源码题目来源216.组合总和III-力扣(LeetCode)题目描述找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例输入:k=3,n=7输出:[[1,2,4]]解释:1+2+4=7没有其他符合的组合了。输入:k=3,n=9输出:[[
计算机毕业设计springboot的旅游信息管理系统设计与实现hyrsf9【附源码+数据库+部署+LW】
苏苏酱 ゛计算机毕设源码程序
课程设计 spring boot 旅游
本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。系统的选题背景和意义选题背景:随着社会经济的发展和人们生活水平的提高,旅游业成为了人们休闲娱乐、增长知识、放松身心的重要方式之一。然而,传统的旅游信息管理方式存在着许多问题,如信息不透明、效率低下、服务质量难以保证等。因此,设计和实现一个高效、便捷的旅游信息管理系统具有重要的意义。意义:首先,旅游信息
【物联网项目】基于ESP8266设计的家庭灯光与火情智能监测系统(完整工程资料源码等)
阿齐Archie
单片机项目合集 单片机 嵌入式硬件 stm32 毕业设计 毕设 物联网
基于ESP8266设计的家庭灯光与火情智能监测系统效果:摘要:该系统是在家庭灯光与火情智能监测系统的基础上,进行智能化控制监测的设计与开发。系统是以单片机ESP8266WIFI开发板为主控核心,实现对各个主要功能模块的控制。主要模块如HC-SR501人体红外传感器模块、光敏电阻传感器模块、火焰传感器模块、LD3320语音识别模块、DHT11温湿度传感器模块等。使用Arduino开发软件进行烧录程序
Android 12系统源码_多屏幕(四)自由窗口模式
AFinalStone
Framework12源码 android
一、小窗模式1.1小窗功能的开启方式开发者模式下开启小窗功能adb手动开启adbshellsettingsputglobalenable_freeform_support1adbshellsettingsputglobalforce_resizable_activities11.2源码配置copyfile#addforfreedomPRODUCT_COPY_FILES+=\frameworks/n
互联网医院系统源码解析:如何开发智能化的电子处方小程序?
万岳科技程序员小金
软件开发教学 智慧医疗APP 小程序 APP开发 智慧医疗小程序 医院APP 互联网医院系统源码
今天,我将从互联网医院系统源码的角度,解析如何开发一款智能化的电子处方小程序,帮助开发者更好地把握这一领域的技术趋势与开发实践。一、电子处方小程序的背景与发展趋势电子处方作为一种数字化医疗文档,广泛应用于互联网医院系统中,能够有效降低纸质处方带来的管理风险和错误,提高诊疗效率。随着政策的逐步放宽和技术的逐渐成熟,电子处方小程序逐渐成为互联网医院系统的标配。二、互联网医院系统的架构与源码解析要开发一
短视频矩阵源码开发功能概述,支持OEM定制开发
李lrh9166
矩阵 架构 最小二乘法
一.账号绑定与授权支持主流短视频平台,如抖音、快手、小红书、B站等,用户通过简单操作即可完成各平台账号与系统的绑定,利用平台官方接口获取授权,保障账号安全登录与数据交互合法性。自动同步账号基础信息,包括昵称、头像、粉丝数等,方便运营者一站式查看各平台账号状态。分组管理可依据账号类型(品牌号、产品号、地域号)、运营方向(美食、美妆、科技)等自定义分组,批量对组内账号进行任务分配、权限设置,提升管理效
对于规范和实现,你会混淆吗?
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