PgAdmin 内部
pgAdmin 开发
简介
有关 pgAdmin 开发的信息可以在以下位置找到
- pgAdmin 开发者邮件列表是 [email protected]
物理源代码行数 [SLOC]
pgAdmin 的源代码具有以下主要属性,这些属性是使用 sloccount 程序 [2] 找到的
使用版本 | 1.14.2 |
---|---|
总物理源代码行数 (SLOC) | 172,137 |
开发工作量估计,人年(人月) (基本 COCOMO 模型,人月 = 2.4 * (KSLOC**1.05)) |
44.53 (534.42) |
进度估计,年(月) (基本 COCOMO 模型,月 = 2.5 * (人月**0.38)) |
2.27 (27.20) |
预计平均开发人员数量 (工作量/进度) | 19.65 |
开发总预计成本 (平均工资 = $56,286/年,管理费用 = 2.40)。 |
$ 6,016,024 |
另一个有趣的信息是项目中不同编程语言的物理源代码行数分布
C++ | 163662 (95.08%) |
---|---|
sh | 4331 (2.52%) |
Ansi C | 1636 (0.95%) |
Pascal | 1120 (0.65%) |
yacc | 927 (0.54%) |
lex | 421 (0.24%) |
perl | 40 (0.02%) |
最后是物理源代码行数在目录之间的分布
目录名称 | Sloc | 按语言划分的 Sloc |
---|---|---|
ui | 34183 | cpp=34182,sh=1 |
include | 23547 | cpp=22651,ansic=896 |
schema | 19165 | cpp=19165 |
dlg | 17987 | cpp=17987 |
frm | 15931 | cpp=15931 |
ogl | 12693 | cpp=12693 |
pgscript | 11561 | cpp=10172,yacc=927,lex=421,sh=41 |
utils | 5320 | cpp=3883,pascal=1120,ansic=295,perl=22 |
gqb | 4724 | cpp=4724 |
slony | 4480 | cpp=4480 |
ctl | 4335 | cpp=4335 |
debugger | 2932 | cpp=2932 |
agent | 2535 | cpp=2535 |
top_dir | 1455 | cpp=1054 |
db | 1364 | cpp=1281,ansic=83 |
类命名规范
命名规范使程序更易于理解,因为它们更容易阅读。它们还可以提供有关标识符功能的信息——例如,它是否是常量、包或类——这有助于理解代码。出于这个原因,遵循以下规则
- foo 表示 Foo 类型的对象
- fooFactory 创建 foos
- fooCollection 是 foos 的集合
- fooCollectionFactory 创建一个 fooCollection
- fooObject 是 位于/在 foo 下面的对象
- fooObjCollection 是 fooObjects 的集合
- fooObjFactory 创建 fooObjects
编码风格
以下规则提供了 pgAdmin 的编码约定
- 花括号始终位于自己的行上。
- 通常情况下,只有预处理器指令、全局变量和函数头/结束花括号应该左对齐
- 缩进 == Tab(大多数开发人员将他们的 Tab 宽度设置为 4)。
- 为了清晰起见,在逻辑代码块之间留一个空行。
- 为了清晰起见,在 for 循环中,除了最后一个分号之外,在所有分号之后添加一个空格。
- 在注释中介绍每个函数
示例
应用编码约定之前的源代码
bool gqbArrayCollection::existsObject(gqbObject *item){ gqbObject *found=NULL; int size=gqbArray.GetCount(); for(int i=0;i<size;i++){ if (gqbArray.Item(i)==item){ found=gqbArray.Item(i); break; } } if(found) return true; else return false; }
应用编码约定之后的源代码
// Check if an item exists in the array. bool gqbArrayCollection::existsObject(gqbObject *item) { gqbObject *found=NULL; int size=gqbArray.GetCount(); for (int i=0; i<size; i++) { if (gqbArray.Item(i)==item) { found=gqbArray.Item(i); break; } } if (found) return true; else return false; }
wxWidgets
由于 pgAdmin 是使用 wxWidgets 在 C++ 中编写的,因此我们应该了解一些有关它的相关信息 [1]
- wxWidgets(以前称为 wxWindows)是一个用于为跨平台应用程序创建图形用户界面 (GUI) 的小部件工具包。wxWidgets 使程序的 GUI 代码能够在几个计算机平台上编译和运行,而无需或只需进行最少的代码更改。它涵盖了诸如 Microsoft Windows、Mac OS、Linux/Unix(X11、Motif 和 GTK+)、OpenVMS、OS/2 和 AmigaOS 之类的系统。一个用于嵌入式系统的版本正在开发中。
- wxWidgets 库是用 C++ 实现的,它为许多常用的编程语言提供了绑定,其中包括 Python (wxPython)、Erlang (wxErlang)、Haskell (wxHaskell)、Lua (wxLua)、Perl (wxPerl)、Ruby (wxRuby)、Smalltalk (wxSqueak)、Java (wx4j) 甚至 JavaScript (wxJavaScript)。
- wxWidgets 最好被描述为原生模式工具包,因为它提供了一个对平台原生小部件的薄抽象,而不是使用图形基元模拟小部件的显示。在目标平台上调用原生小部件会产生比诸如 Swing(用于 Java)之类的工具包更原生外观的界面,同时还提供性能和其他优势。
- 一本很好的免费 PDF 书籍,用于学习 wxWidgets,可以在以下位置找到:http://www.informit.com/store/product.aspx?isbn=0131473816(在下载部分)。
开发环境
pgAdmin 的开发环境理论上可以是任何被用于为跨平台应用程序创建图形用户界面 (GUI) 的小部件工具包(称为 wxWidgets)所接受的。它涵盖了诸如 Microsoft Windows、Mac OS、Linux/Unix(X11、Motif 和 GTK+)、OpenVMS、OS/2 和 AmigaOS 之类的系统。这里描述了如何在 *nix、Mac 和 Windows 上从源代码构建 pgAdmin
Linux、FreeBSD、Solaris 和其他 Unix 变体
您将需要
- 现代开发环境
- GTK 2.2 或更高版本。
- GNU automake 1.9 或更高版本。
- GNU autoconf 2.59 或更高版本。
- GNU gcc 3.4 或更高版本。
- 以下库
- wxGTK 2.8.x 来自 http://www.wxwidgets.org/
- libxml2 2.6.18 或更高版本 来自 http://www.xmlsoft.org/
- libxslt 1.1.x 或更高版本 来自 http://www.xmlsoft.org/
- PostgreSQL 8.1 或更高版本 来自 https://postgresql.ac.cn/
构建
- 如果您系统上尚未安装 libxml2 和 libxslt,请根据随附的说明进行安装。
- 根据随附的说明安装 PostgreSQL。建议您使用 --with-openssl 配置选项构建带有 OpenSSL 支持的版本。
- 将 wxGTK tarball 解压缩到方便的位置,然后按以下步骤构建和安装它
- 注意:pgAdmin 源代码 tarball(xtra/wx-build/build-wxgtk)中包含一个脚本,它将为您在共享/静态/调试/发布构建的每种组合中构建和安装 wxWidgets。(您也可以按照以下步骤手动编译 wxGTK)。
- cd /path/to/wxGTK/source/
- ./configure --with-gtk --enable-gtk2 --enable-unicode
- make
- sudo make install
- 安装 wxWidgets contrib 模块。
- cd contrib/
- make
- sudo make install
- 将 pgAdmin tarball 解压缩到方便的位置,然后按以下步骤构建和安装它
- bash bootstrap #仅在从 SVN / Git 检出构建时才需要
- ./configure
- make all
- sudo make install
If any of the prerequisite components are installed in locations that the configure script cannot find, you may specify their locations on the command line. See the configure help (./configure --help) for details.
Mac OS X
您将需要
- 现代开发环境
- XCode 2.0 或更高版本
- GNU automake 1.9 或更高版本。
- GNU autoconf 2.59 或更高版本。
- wxMac 2.8.x 来自 http://www.wxwidgets.org/
- libxml2 2.6.18 或更高版本 来自 http://www.xmlsoft.org/
- libxslt 1.1.x 或更高版本 来自 http://www.xmlsoft.org/
- PostgreSQL 8.1 或更高版本 来自 https://postgresql.ac.cn/
构建
- 按照随附的说明将 libxml2 和 libxslt 安装到非系统位置。OS X Panther 和 Tiger 中包含的默认版本太旧,无法与 pgAdmin 正确配合使用。
- 根据随附的说明安装 PostgreSQL。建议您使用 --with-openssl 配置选项构建带有 OpenSSL 支持的版本。
- 将 wxMac tarball 解压缩到方便的位置,然后按以下步骤构建和安装它
- cd /path/to/wxMac/source/
- ./configure --with-mac --enable-gtk2 --enable-unicode
- make
- sudo make install
- 安装 wxWidgets contrib 模块
- cd contrib/
- make
- sudo make install
- 注意 1:您也可以将 --enable-universal_binary 选项传递给 configure 以构建通用二进制文件。这还需要构建 PostgreSQL 的 libpq 库的通用版本。
- 注意 2:pgAdmin 源代码 tarball(xtra/wx-build/build-wxmac)中包含一个脚本,它将为您在共享/静态/调试/发布构建的每种组合中安装 wxWidgets 的通用版本。
- 将 pgAdmin tarball 解压缩到方便的位置,然后按以下步骤构建和安装它
- bash bootstrap # 仅在从 SVN / Git 检出构建时才需要
- ./configure --enable-appbundle
- make all
- make install
- 最后一步将在您的源代码树的根目录中构建一个名为 pgAdmin3.app 的 OSX 应用程序包。由于这可能需要一两分钟的时间,因此可以使用 pkg/mac/debug-bundle.sh 脚本使用符号链接直接构建一个不可重定位的“伪造”应用程序包到可执行文件。此应用程序包称为 pgAdmin3-debug.app,并且在重新编译 pgAdmin 时无需重新构建。
If any of the prerequisite components are installed in locations that the configure script cannot find, you may specify their locations on the command line. See the configure help (./configure --help) for details.
Windows
您将需要
- Windows 2000 或更高版本。
- Microsoft Visual C++ 2005。
- Windows 2003 R2 平台 SDK [安装时,选择自定义安装,然后仅添加 Microsoft Windows Core SDK 和 Microsoft Data Access Service (MDAC) SDK]。 (VC++ Express Edition 不包含,需要下载并安装)
- Windows Installer XML v3。
- 从 http://www.wxwidgets.org/ 获取 wxMSW 2.8.x
- 从 http://www.xmlsoft.org/ 获取 libxml2 2.6.18 或更高版本
- 从 http://www.xmlsoft.org/ 获取 libxslt 1.1.x 或更高版本
- 从 http://gnuwin32.sourceforge.net/ 获取 iconv 1.9.x 或更高版本
- 从 https://postgresql.ac.cn/ 获取 PostgreSQL 8.1 或更高版本
Precompiled XML/XSLT and dependency packages for Windows can be found at http://zlatkovic.com. You probably need zlib 1.2.x as well as libxml2 and libxslt.
构建
- 将 wxMSW 源代码解压缩到由 %WXWIN% 环境变量指向的方便位置。
- 将 PostgreSQL 安装到由 %PGDIR% 环境变量指向的方便位置。
- 将 pgAdmin 源代码解压缩到方便的位置。
- 从 Visual Studio 命令提示符中,运行 pgAdmin 源代码树中包含的 wxWidgets 构建脚本,位于 xtra/wx-build/build-wxmsw.bat
- 将 libxml2、libxslt 和依赖项二进制文件解压缩到由 %PGBUILD% 环境变量指向的目录中。
- 启动 Visual C++ 并加载 pgAdmin 解决方案文件。构建所需的 target。
Microsoft 站点针对 Visual C++ Express Edition 2005 用户的说明:
更新: 首先阅读 http://www.microsoft.com/express/2005/platformsdk/default.aspx
您可以在安装后立即使用 Visual C++ Express 构建 .NET Framework 应用程序。为了使用 Visual C++ Express 构建 Win32 应用程序,您需要再执行几个步骤。我将列出使用 Visual C++ Express 构建 Win32 应用程序所需的步骤。
1. 安装 Microsoft Platform SDK: 按照说明安装 x86 平台的 SDK。
2. 在“选项”对话框的“项目和解决方案”部分更新 Visual C++ 目录。将路径添加到相应的子部分
● 可执行文件:C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin
● 包含文件:C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include
● 库文件:C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib
注意:或者,您可以通过修改 Visual C++ Express 安装位置的 \vc\vcpackages 子目录中的 VCProjectEngine.dll.express.config 文件来更新 Visual C++ 目录。请确保在重新启动 Visual C++ Express Edition 之前,还删除了位于“%USERPROFILE%\Local Settings\Application Data\Microsoft\VCExpress\8.0”中的文件“vccomponents.dat”。
或者,只需运行此操作:开始菜单 -> Microsoft Platform SDK for Windows Server 2003 R2 -> Visual Studio 注册 -> 将 PSDK 目录注册到 Visual Studio。
仅当遇到以下错误时才使用此建议
更新 corewin_express.vsprops 文件:使 Win32 模板在 Visual C++ Express 中正常工作还需要执行一个步骤。这可以通过两种方式完成。
1. 单击项目(每个项目 pgAdmin3、pgaevent、pgAgent),属性,链接器,输入,附加依赖项,并确保以下内容都在列表中(否则您将收到对 Windows API 的未解析外部错误)。
user32.lib gdi32.lib oleaut32.lib ole32.lib comdlg32.lib shell32.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib advapi32.lib
这避免了类型为 LNK2019 的错误
2. 您需要编辑 corewin_express.vsprops 文件(位于 C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults 中)并将读取的字符串:AdditionalDependencies="kernel32.lib" 更改为 AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"
为了避免在非英语版本的 Visual C++ Express Edition(西班牙语、法语等)中出现错误 VCBLD0001 "VCProjectEngine.dll" 无法加载。此问题似乎是对于非英语版本,vcbuild 无法加载特定语言的 dll。解决方案:将本地化文件夹的内容(对于法语,它是 ...vcpackages\1036,对于西班牙语,它是 ...vcpackages\3082)复制到 vcpackages 中。这在法语和西班牙语版本中有效。
3. VC++ 2005 Express 错误:一些错误与无法升级 vcbuild /nologo /upgrade wx_%%f.dsp 有关,可以通过以下方式解决:使用 VC C++ Express 打开每个 .DSP 文件(adv aui base core html net wxexpat wxjpeg wxpng wxregex wxtiff wxzlib xml xrc ogl stc)并允许格式转换,保存,然后执行此步骤后,只需再次运行脚本 build-wxmsw.bat。
4. 有时,在某些机器上,pgadmin 构建脚本 build-wxmsw.bat 无法编译 wxwidgets(cmd vc++ 提示符中的某种错误),只需使用 IDE(adv aui base core html net wxexpat wxjpeg wxpng wxregex wxtiff wxzlib xml xrc ogl stc)以可视方式打开每个 .dsp 文件,并在 Unicode Debug 和 Release 模式(两者)下手动编译。
查看此 URL: http://wiki.wxwidgets.org/Troubleshooting_building_wxWidgets_using_Microsoft_VC
5. 有时,如果您使用 build-wxmsw.bat 脚本,并且仅按照上述说明操作并尝试编译 wxwidgets 库,则可以避免错误 fatal error C1083: Cannot Open file: 'windows.h': No such file or directory。此解决方案对我有用
a.) 打开 build-wxmsw.bat 脚本,以及以下几行
REM wxWidgets 源代码的位置 set WX=%WXWIN% set HERE=%CD% 在此之后添加以下几行
REM 修复错误 error C1083 'windows.h'(编译时使用 /useenv 选项) set PDSKWIN=C:\Archivos de programa\Microsoft Platform SDK for Windows Server 2003 R2 set INCLUDE=%PDSKWIN%\Include;%INCLUDE% set LIB=%PDSKWIN%\Lib;%LIB%
b.) 查找此字符串 "vcbuild /nohtmllog /nologo" 并将其更改为 " vcbuild /useenv /nohtmllog /nologo 两次。在 cd %WX%\build\msw 循环内部 ... vcbuild /useenv /nohtmllog /nologo wx_%%f.vcproj "Unicode %%b" 以及在 cd ..\..\contrib\build 循环内部 vcbuild /useenv /nohtmllog /nologo %%f.vcproj "Unicode %%b"
6. 错误:...\include\wx/platform.h(196) : fatal error C1083: Cannot open include file: 'wx/setup.h': No such file or directory 此错误发生在您未添加以下目录时... %WXWIN%\include\msvc(将 %WXWIN% 替换为正确的值)
...在以下选项中:VC> 工具> 选项> 项目和解决方案> 目录> 包含文件(右上角组合框)
添加上述目录:%WXWIN%\include\msvc
类层次结构
[在此处添加信息!]
SVN 目录结构
pgadmin
agent
与 pgAdmin Agent 相关的类
- dlgJob.cpp - PostgreSQL 作业属性
- dlgSchedule.cpp - PostgreSQL 调度属性
- dlgStep.cpp - PostgreSQL 步骤属性
- pgaStep.cpp - PostgreSQL Agent 步骤
- pgaJob.cpp - PostgreSQL Agent 作业
- pgaSchedule.cpp - PostgreSQL Agent 调度
- pgaStep.cpp - PostgreSQL Agent 步骤
db
包含与 postgresql 数据库相关的文件
- keywords.c - PostgreSQL 中保留字的词法标记查找
- pgConn.cpp - PostgreSQL 连接类
- pgQueryThread.cpp - PostgreSQL 线程化查询类
- pgSet.cpp - PostgreSQL 结果集类
dlg
包含 pgAdmin 使用的所有对话框的源代码,例如
- dlgOperator.cpp - PostgreSQL 操作符属性
- dlgHbaConfig.cpp - 配置设置
- dlgFindReplace.cpp - 搜索和替换
等等...
include
包含 pgAdmin 使用的所有头文件 (.h),为了组织目的,它被划分为几个文件夹。
schema
包含与 postgresql 模式相关的类,例如
- pgSchema.cpp - 模式类
- pgCollection.cpp - 用于“集合”节点的简单对象
- pgForeignKey.cpp - 外键类
等等。
ui
包含 xrc 对话框资源文件。
ctl
包含 pgAdmin 使用的控件的源代码
- calbox.cpp - 日期选择器控件框
- ctlComboBox.cpp - 增强型组合框控件
- ctlListView.cpp - 增强型列表视图控件
- ctlMenuToolbar.cpp - 菜单工具栏
- 注意: 此代码在 Paul Nelson (http://www.pnelsoncomposer.com/) 的许可下使用。
- ctlSecurityPanel.cpp - 包含安全信息的 панели
- ctlSQLBox.cpp - SQL 语法高亮显示文本框
- ctlSQLGrid.cpp - SQL 查询结果窗口
- ctlSQLResult.cpp - SQL 查询结果窗口
- ctlTree.cpp - 包含 pgObjects 的 wxTreeCtrl
- explainCanvas.cpp - 解释画布
- explainShape.cpp - 解释形状
- timespin.cpp - timeSpin SpinCtrl
- xh_calb.cpp - wxCalendarBox 处理程序
- xh_ctlcombo.cpp - ctlComboBox 处理程序
- xh_ctltree.cpp - ctlTree 处理程序
- xh_sqlbox.cpp - ctlSQLBox 处理程序
- xh_timespin.cpp - wxTimeSpinCtrl 处理程序
debugger
包含调试器相关的类,例如
- debugger.cpp - 调试器工厂
- dlgDirectDbg.cpp - 调试器
- frmDebugger.cpp - 调试器
等等
frm
包含与表单相关的类,例如
- frmAbout.cpp - 关于框
- frmMain.cpp - 主表单
- events.cpp - 事件处理程序、浏览器和 frmMain 的统计功能。
- frmPassword.cpp - 更改密码
- frmQuery.cpp - SQL 查询框
- frmReport.cpp - 报告文件对话框
slony
包含与 Slony-I 集群管理相关的类。
utils
pgAdmin 使用的实用程序类,例如
- factory.cpp - 对象类工厂
- favourites.cpp - 查询收藏夹
- md5.cpp - MD5 密码加密函数
- misc.cpp - 杂项实用程序
- pgconfig.cpp - 后端配置类
- sysLogger.cpp - 日志处理类
- sysProcess.cpp - 外部进程
- sysSettings.cpp - 设置处理类
- utffile.cpp - 带有 BOM 解释的文件 I/O
等等。
开发人员说明
向主窗口 (frmMain) 添加操作
- 创建将呈现新功能的 frmXXX 类。
- 为要执行的每个操作创建派生的 actionFactory(或 contextActionFactory,如果操作也要在上下文菜单中显示),并在 frmMain::CreateMenus() 中注册它。不要触碰 menu.h 或任何其他内容。frmGrantWizard 或 frmEditGrid 是简单的示例。
- 为每个工厂实现 CheckEnable(),检查当前对象,查看操作是否适用。
- 实现 StartDialog(),它将打开对话框。
Following this, you should be able to add new actions on objects by just adding the source and registering the new menu in frmMain.cpp. If you think you need to modify more files, you're probably wrong.
向对象树添加对象
- 使用正确的层次结构实现类。pgCast 和 dlgCast 是简单的示例。
- 在它应该位于其下的 pgXXX 对象中实例化一个集合。
属性页对话框布局
对话框的设计应尽可能遵循以下规则
- 标准对话框高度为 150、250 和 280
- 标准对话框宽度为 220 和 300
- 笔记本位于 2,2d,大小为 (216,216d)
- 标准按钮大小为 (50,15d)
- 第一个控件位于 (5,5d)
- 标准控件位于 (70,[y] d),大小为 (135,12d)
- 垂直控件间距为 15d,对于单选按钮和复选框,间距为 12d
- 静态文本相对于其他控件具有 2 的垂直偏移量
- 静态文本应预留 50% 的空间,以便为翻译后的字符串留出足够的空间。
参考文献
[1] http://en.wikipedia.org/wiki/WxWidgets
[2] http://www.dwheeler.com/sloccount/