Rocky_Ansi Blog

修己以清心为要,涉世以慎言为先!


  • 首页

  • 资源导航

  • 归档

  • 标签

  • 转载

  • 搜索

Postgresql扩展Sql-hook

发表于 2018-09-29 | 分类于 Database
  • 基于PostgreSql 9.5.13

在我们查看Postgresql源码时,经常发现Hook的使用. 例如:

1
2
3
4
5
6
7
8
9
10
11
PlannedStmt *
planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
{
PlannedStmt *result;

if (planner_hook)
result = (*planner_hook) (parse, cursorOptions, boundParams);
else
result = standard_planner(parse, cursorOptions, boundParams);
return result;
}

Hook是Window消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它, 钩子机制允许应用程序截获处理Window消息或特定事件。 即钩子先获取控制权,进行加工处理。
Postgresql中的Hook机制,更多是中断与替换操作。改变其标准流程。



阅读全文 »

打造自己的 Vim

发表于 2018-09-27 | 分类于 Vim篇

将自己的GVIM实现成为:

  • 能自由显示/关闭目录栏
  • 能实现自由文件搜索 [精准搜索/正则模糊搜索]
  • 设置工作目录,并进行目录跳转-能在新目录文件搜索
  • 全局文件关键字搜索
  • 代码阅读 相关函数调用,定义等查看
  • 代码静态检查
  • 代码注释功能,提供snippets
  • YCM - Mac 已安装,Linux 与 Window 未安装

快捷键

  • F2 开启/关闭nerdtree
  • F3 开启/关闭 Taglist
  • F4 开启/关闭 quickfix面板 [ CtrlSF/ cscope ]
  • “\” + s 打开静态代码检查错误面板
  • Ctrl + p 文件搜索
  • Ctrl + b 文件搜索列表
  • Ctrl + r 开启/关闭模糊匹配
  • Ctrl + v 在当前文件 竖直方式打开新文件
  • Ctrl + y 在当前目录添加新文件
  • Ctrl + t 在新建Tab页打开
  • Ctrl + f 全局关键字搜索
  • Shift + s 查找代码函数链接
  • Shift + c 查找调用本函数的函数
  • Shift + g 查找本定义
  • Alt + Num 进行Tab页的切换
  • Alt + t 打开新的Tab页



阅读全文 »

postgresql扩展SQL与存储过程

发表于 2018-09-18 | 分类于 Database

Pg系统本身提供不同扩展,可以通过select * from pg_language 来查看支持

1
2
3
4
5
6
lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
----------+----------+---------+--------------+---------------+-----------+--------------+--------
internal | 10 | f | f | 0 | 0 | 2246 |
c | 10 | f | f | 0 | 0 | 2247 |
sql | 10 | f | t | 0 | 0 | 2248 |
plpgsql | 10 | t | t | 13335 | 13336 | 13337 |



阅读全文 »

PostgresSql操作符重载

发表于 2018-09-13 | 分类于 Database

运算符是一个保留字或字符主要用于PostgreSQL的语句的WHERE子句中执行操作,如比较和算术运算。

运算符用于指定一个PostgreSQL表中的条件,并在一份声明中多个条件作为连词。

  • 算术运算符
  • 比较操作符
  • 逻辑运算符
  • 位运算符



阅读全文 »

性能监控 vmstat

发表于 2018-09-12 | 分类于 命令,性能监控

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

一般vmstat工具的使用是通过两个数字参数来完成的:

  • 第一个参数是采样的时间间隔数,单位是秒.
  • 第二个参数是采样的次数.
1
2
3
4
5
6
7
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 149772 0 3485736 0 0 0 0 22 34 0 0 100 0 0
0 0 0 149772 0 3485736 0 0 0 0 10 16 0 0 100 0 0
0 0 0 149772 0 3485736 0 0 0 0 13 25 0 0 100 0 0
0 0 0 149684 0 3485756 0 0 0 0 65 98 1 1 99 0 0
0 0 0 149772 0 3485756 0 0 0 0 11 18 0 0 100 0 0



阅读全文 »

Postgresql-后台进程

发表于 2018-09-01 | 分类于 Database

通俗来讲,就是运行在后台的一个或多个工作线程。 可以以扩展的方式存在。该进程的启动/停止/监控都是通过postgres来管理的。

1
2
3
4
5
6
7
8
9
10
11
12
13
# source:src/include/postmaster/bgworker.h
typedef struct BackgroundWorker
{
char bgw_name[BGW_MAXLEN]; //后台bgw的名称
int bgw_flags;
BgWorkerStartTime bgw_start_time;
int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */
char bgw_library_name[BGW_MAXLEN]; # 动态库的名称
char bgw_function_name[BGW_MAXLEN]; # bgw的进程主函数
Datum bgw_main_arg; # 进程主函数的入参
char bgw_extra[BGW_EXTRALEN]; # MyBgworkerEntry的参数。
pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */
} BackgroundWorker;



阅读全文 »

Postgresql扩展Sql-添加插件

发表于 2018-08-30 | 分类于 Database

我们都知道 PostgreSQL 提供了丰富数据库内核编程的接口,允许开发者以插件的形式把功能融入数据库内核。PostgreSQL 提供了一个插件管理模块,用于管理用户创建的插件。 {插件编写可以参照共享库编写;}

PostgreSQL 支持使用PL/pgSQL语言或者原生的C语言开发扩展。PL/pgSQL开发简单,然而性能上较原生的C语言要逊色不少。有不少人已经做过相关的性能测试,这里就不再重复说明。我们开发的扩展的目的是为了增强生产的 PostgreSQL,自然要选择性能更好的C语言。



阅读全文 »

PostgreSql扩展Sql-动态加载共享库(C函数)

发表于 2018-08-23 | 分类于 Database

系统函数编写

  • 基于 psql (PostgreSQL) 10.4

pg_language表定义了函数实现所使用的语言。主要支持了C语言和SQL语句。一些可选的语言包括pl/pgsql、tcl和perl。

1
2
3
4
5
6
7
shell=# select lanname, lanispl, lanpltrusted, lanplcallfoid, laninline, lanvalidator from pg_language;
lanname | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator
----------+---------+--------------+---------------+-----------+--------------
internal | f | f | 0 | 0 | 2246
c | f | f | 0 | 0 | 2247
sql | f | t | 0 | 0 | 2248
plpgsql | t | t | 13198 | 13199 | 13200

pg_proc表对函数进行了定义。每一个函数在该表中都对应一个元组,包含函数名。输入参数类型,返回类型以及对函数的定义(可能是文本,可能是一段编译型语句,也可能是对可执行代码的引用)。编译过的函数可以静态地链接到服务器上,或者在存储在共享库内,当第一次使用该库时动态的载入。

1
2
3
4
5
shell# select proname,prolang, prorettype,proargtypes, prosrc,probin from pg_proc where proname like '%square%';
proname | prolang | prorettype | proargtypes | prosrc | probin
---------+---------+------------+-------------+----------------------------+--------------------
square | 13201 | 23 | 23 | begin return $1 * $1; end; |
squares | 13 | 23 | 23 | squares_return_int | $libdir/squares.so

查看其数据类型

1
2
3
4
5
shell# select oid , typname from pg_type where oid = 23;
oid | typname
-----+---------
23 | int4
(1 row)



阅读全文 »

Postgresql扩展Sql-源码添加系统函数

发表于 2018-08-22 | 分类于 Database

PostgreSql 源码增添新的系统函数

  • 基于Postgresql 10.4
  • 基于 psql (PostgreSQL) 11beta2

函数实现:

  • 第一种: 添加于 backend/utils/adt/pgstatfuncs.c;

    1
    2
    3
    4
    5
    6
    // 函数实现;  
    Datum
    return_pid(PG_FUNCTION_ARGS)
    {  
    PG_RETURN_INT32(MyProcPid);
    }
阅读全文 »

getopt

发表于 2018-08-15

函数

  • 函数原型

    1
    int getopt(int argc, char *const argv[], const char * optstring);
  • 函数头文件

    1
    #include <unistd.h>
  • 函数说明

    1
    2
    3
    4
    getopt函数主要用来解析命令行参数; 从其形参argc, argv可以发现是有main()传递的参数个数与内容; 而其第三个参数optsreing 则表示处理选项字符串规则。 以冒号表示参数; 
    1. 身后不带冒号, 则不需要填充参数
    2. 一个冒号,则选项后必须跟有参数
    3. 两个冒号,则选项之后的参数是可选的。 若存在参数,参数与选项之间不能存在空格;



阅读全文 »

Centos7 bash 安装powerline

发表于 2018-07-17 | 分类于 工具

安装powerline

1
2
3
sudo yum install epel-release
sudo yum install python-pip
pip install powerline-status

查看安装位置 pip show powerline-status

1
2
3
4
5
6
7
8
9
10
Name: powerline-status
Version: 2.7
Summary: The ultimate statusline/prompt utility.
Home-page: https://github.com/powerline/powerline
Author: Kim Silkebaekken
Author-email: kim.silkebaekken+vim@gmail.com
License: MIT
Location: /usr/lib/python2.7/site-packages
Requires:
Required-by:



阅读全文 »

Linux-共享库

发表于 2018-06-28

ld.so是Unix或类Unix系统上的动态链接器,常见的有两个变体:

  • ld.so针对a.out格式的二进制可执行文件
  • ld-linux.so针对ELF格式的二进制可执行文件
    • readelf显示elf文件
    • objdump显示elf和object格式文件

当应用程序需要使用动态链接库里的函数)时,由ld.so负责加载。搜索动态链接库的顺序依此是

  • 环境变量LD_AOUT_LIBRARY_PATH(a.out格式)、LD_LIBRARY_PATH(ELF格式);在Linux中,LD_PRELOAD指定的目录具有最高优先权[1]。

  • 缓存文件/etc/ld.so.cache。此为上述环境变量指定目录的二进制索引文件。更新缓存的命令是ldconfig。

  • 默认目录,先在/lib中寻找,再到/usr/lib中寻找。

    1
    2
    3
    通常:
    /lib 软连接到 /usr/lib
    /lib64 软连接到 /usr/lib64



阅读全文 »
1234…10
Rocky_Ansi

Rocky_Ansi

vagabond1132@gmail.com

118 日志
20 分类
25 标签
GitHub 博客园
Links
  • 新博客地址
  • 狗哥
  • Python 在线手册
  • 安全类书籍
© 2020 Rocky_Ansi
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4