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