PostgreSQL 登录客户端psql信息显示

本文深入探讨了PostgreSQL客户端psql的工作原理,特别是如何处理登录信息和命令行交互。主要关注psql的源码结构,如startup.c中的main()函数和PsqlSettings结构体。在main()函数中,初始化环境变量,验证登录密码,并进入MainLoop函数进行命令读取、执行和结果显示。在MainLoop中,通过词法分析和PQExpBuffer管理查询,使用SendQuery执行SQL并显示结果。最后介绍了添加显示登录信息功能的方法,展示了showLoginInfo()函数的应用。
摘要由CSDN通过智能技术生成

1.psql源码放在两个地方,一个是src/bin/psql 此文件下的代码为psql前端代码,一个是psql后段代码,放在src/backend.所有的c语言程序都包含有个main()函数,而包含main()函数的文件就是src/bin/psql目录下的startup.c文件.

 重要的结构体:

enum _actions    /* 代表当前psql命令程序所处的状态 */
{
	ACT_NOTHING = 0,
	ACT_SINGLE_SLASH,
	ACT_LIST_DB,
	ACT_SINGLE_QUERY,
	ACT_FILE
};

struct adhoc_opts   /*  储存了当前命令程序的状态 */
{
	char	   *dbname;   //数据库名
	char	   *host;     //IP
	char	   *port;     //端口
	char	   *username;
	char	   *logfilename;  //日志名
	enum _actions action;
	char	   *action_string;
	bool		no_readline;
	bool		no_psqlrc;
	bool		single_txn;
};
以及几个重要的函数:
static void parse_psql_options(int argc, char *argv[],              //解析命令行选项
				   struct adhoc_opts * options);
static void process_psqlrc(char *argv0);                            //载入.psqlrc 文件
static void process_psqlrc_file(char *filename);                    //被process_psqlrc调用
static void showVersion(void);                                      //格式化输出PostgreSQL版本信息
static void EstablishVariableSpace(void);                           //为log handle 创建可变空间
extern void showLoginInfo(PGconn *conn);                            //显示登录信息函数
输出结果:
me@me:/$ ./psql
口令:
psql (2.0.1)
-----------------------------------------------
Login User: me                                     //用户名
Login Time: 2018-02-28 09:07:57                    //登录时间
Login Address: localhost                           //主机地址
Last Login Status: Success                         //上次登录时间
Login Failures: 0                                  //登录失败的次数
Password Expiry Time: 2018-03-05 11:25:42          //密码失效时间
(5 days 02:17:45 time left!)                       //据今天多长时间
-----------------------------------------------
输入 "help" 来获取帮助信息.

me=# 

这两个宏定义命令指明了对psql命令行窗口定制化信息:

PsqlSettings pset;

#ifndef WIN32                        //window
#define SYSPSQLRC	"psqlrc"
#define PSQLRC		".psqlrc"
#else                                //else e.g linux
#define SYSPSQLRC	"psqlrc"
#define PSQLRC		"psqlrc.conf"
#endif

进入main() 函数:

int
main(int argc, char *argv[])
{
	struct adhoc_opts options;
	int			successResult;
	char	   *password = NULL;
	char	   *password_prompt = NULL;
	bool		new_pass;
        char		*current_username;
	/* Set application specific locale and service directory  将输入的第一个参数设置为 特定的字段值    比如"psql" */
	set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));

	if (argc > 1)
	{
		if (strcmp(argv[1], "--help") == 0 || strcmp(a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值