在 Windows 上为 PostgreSQL 编译 Stata 插件需要什么?
What do I need to compile a Stata plugin for PostgreSQL on Windows?
我是 PostgreSQL 的狂热用户,我想鼓励其他人使用它。我的(学术)圈子里有很多人使用 Stata,我已经设法在 on Mac OS X 上编译了一个允许 Stata 直接访问 PostgreSQL 的插件;这得到了那些尝试过它的人的好评(尽管我认为还有改进的余地)。然而,我的许多使用 Stata 的同事 运行 Windows 如果这个插件也能为他们工作,那就太好了。
下面是我在OS X 上编译插件的步骤(插件来自牛津的一个站点);我从我的博客 here 中复制了这些步骤。
我的问题是:需要如何修改这些说明才能在 Windows 上运行? (我无权访问 Windows,所以如果您能确认您可以修改它以适合您,那就太好了。)
请注意,我从 MacPorts 安装了 PostgreSQL,我还有 wget
(sudo port install wget
).
1。从 Stata 和 Oxford 站点获取文件
cd ~/Downloads
wget http://code.ceu.ox.ac.uk/stata/pgload-0.1.tar.gz
tar -zxvf pgload-0.1.tar.gz
mkdir ~/Downloads/stata
cd ~/Downloads/stata/
wget http://www.stata.com/plugins/stplugin.c
wget http://www.stata.com/plugins/stplugin.h
2。编辑生成文件
vim ~/Downloads/pgload-0.1/Makefile
最后一步打开Makefile。我更改了五行(如果您从 MacPorts 以外的其他地方安装 PostgreSQL 9.3,最后两行会有所不同)。
PLUGIN_SYS=APPLEMAC
INSTALL_LOCATION=~/Library/Application\ Support/Stata/ado/personal
STATAPLUG_INC=~/Downloads/stata
PQ_INC=/opt/local/include/postgresql93
PG_SERVER_INC=/opt/local/include/postgresql93/server
然后我保存退出。那么
3。编译安装
cd ~/Downloads/pgload-0.1
make
sudo make install
4。添加 loadsql.ado 文件
loadsql.ado
文件位于 ~/Library/Application\ Support/Stata/ado/personal
并包含以下内容:
program define loadsql
*! Load the output of an SQL file into Stata, version 1.4 (iandgow@gmail.com)
version 13.1
syntax using/, CONN(string)
#delimit;
tempname sqlfile exec line;
file open `sqlfile' using `"`using'"', read text;
file read `sqlfile' `line';
while r(eof)==0 {;
local `exec' `"``exec'' ``line''
"';
file read `sqlfile' `line';
};
file close `sqlfile';
* display "`conn'";
pgload "`conn'" "``exec''", clear;
* pgload "``dsn''" "SELECT permno, date, abs(prc) AS prc FROM crsp.dsf LIMIT 10", clear;
end;
经过一些工作,我成功地构建并 运行 pgload。一路上有一些错误,我在下面已经解决了。然而,在测试插件之后,我建议只使用 ODBC,因为它更容易设置并且速度更快。
我 运行宁 Windows 7 x64,postgres 9.3 64 位,stata-SE 11.2 64 位
为 PGSQL 扩展设置 Visual Studio(桌面版 VS Express 2015)(跟随 http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/)
为 stata 文件添加包含目录
添加了 libpq.lib 链接库
将 "char tmpsql_buf[tmpsql_buf_len + 1];" 更改为 "char tmpsql_buf[1024 + 1];",因为此处需要常量值时出错。
将 strncpy 更改为 strncpy_s(例如 strncpy_s(svalue, 244, valuetmp, 244);
可能不需要,但此处有关于安全的警告)
将 strcat 更改为 strcat_s(例如 strcat_s(stata_mac_vars, sizeof stata_mac_vars, fname);
可能不需要,但此处有关于安全的警告)
将 bzero 更改为 memset(例如 memset(tmpsql_buf,'[=12=]', tmpsql_buf_len + 1);
)
将 _strnicmp 别名为 strncasecmp (#define strncasecmp _strnicmp
)
从互联网上的某个地方得到 strptime.c 和 strptime.h 并将它们与 stata 文件放在一起;在 time.h. 的包含之后添加了 pg.c #include <strptime.h>
中的包含
得到 libintl.h 并将其添加到 PostgreSQL 包含目录(来自此处:https://gist.github.com/ringerc/d57978ca0d3a3a13b5d7)。由于某些原因,这些不在 postgresql 9.3 x64 服务器包含中。
将 postgres.exe 的路径添加到 windows PATH 环境变量
确保体系结构与 STATA、PGSQL 和目标计算机(等)的 x64(64 位)相匹配
构建项目 -- 编译 DLL 正常,没有警告
将pg.dll、pglaod.ado、pgload.hlp复制到ado目录
将 pg.dll 重命名为 pg.plugin
使用 program pg,plugin
测试插件 -- 加载正常,没有警告
尝试了 运行 pgload "dbname=research host=localhost user=XXX password=XXXX" "SELECT permno, date, abs(prc) AS prc FROM crsp.dsf LIMIT 10",clear
,应该看起来很熟悉。
-- 当尝试执行此操作时,Stata 硬崩溃且没有错误消息(但不用担心;Windows 正在检查解决方案:P) 按预期加载
-乔
P.S。感谢您的 blog/github;我无耻地从他们两个那里偷了点东西。
我是 PostgreSQL 的狂热用户,我想鼓励其他人使用它。我的(学术)圈子里有很多人使用 Stata,我已经设法在 on Mac OS X 上编译了一个允许 Stata 直接访问 PostgreSQL 的插件;这得到了那些尝试过它的人的好评(尽管我认为还有改进的余地)。然而,我的许多使用 Stata 的同事 运行 Windows 如果这个插件也能为他们工作,那就太好了。
下面是我在OS X 上编译插件的步骤(插件来自牛津的一个站点);我从我的博客 here 中复制了这些步骤。
我的问题是:需要如何修改这些说明才能在 Windows 上运行? (我无权访问 Windows,所以如果您能确认您可以修改它以适合您,那就太好了。)
请注意,我从 MacPorts 安装了 PostgreSQL,我还有 wget
(sudo port install wget
).
1。从 Stata 和 Oxford 站点获取文件
cd ~/Downloads
wget http://code.ceu.ox.ac.uk/stata/pgload-0.1.tar.gz
tar -zxvf pgload-0.1.tar.gz
mkdir ~/Downloads/stata
cd ~/Downloads/stata/
wget http://www.stata.com/plugins/stplugin.c
wget http://www.stata.com/plugins/stplugin.h
2。编辑生成文件
vim ~/Downloads/pgload-0.1/Makefile
最后一步打开Makefile。我更改了五行(如果您从 MacPorts 以外的其他地方安装 PostgreSQL 9.3,最后两行会有所不同)。
PLUGIN_SYS=APPLEMAC
INSTALL_LOCATION=~/Library/Application\ Support/Stata/ado/personal
STATAPLUG_INC=~/Downloads/stata
PQ_INC=/opt/local/include/postgresql93
PG_SERVER_INC=/opt/local/include/postgresql93/server
然后我保存退出。那么
3。编译安装
cd ~/Downloads/pgload-0.1
make
sudo make install
4。添加 loadsql.ado 文件
loadsql.ado
文件位于 ~/Library/Application\ Support/Stata/ado/personal
并包含以下内容:
program define loadsql
*! Load the output of an SQL file into Stata, version 1.4 (iandgow@gmail.com)
version 13.1
syntax using/, CONN(string)
#delimit;
tempname sqlfile exec line;
file open `sqlfile' using `"`using'"', read text;
file read `sqlfile' `line';
while r(eof)==0 {;
local `exec' `"``exec'' ``line''
"';
file read `sqlfile' `line';
};
file close `sqlfile';
* display "`conn'";
pgload "`conn'" "``exec''", clear;
* pgload "``dsn''" "SELECT permno, date, abs(prc) AS prc FROM crsp.dsf LIMIT 10", clear;
end;
经过一些工作,我成功地构建并 运行 pgload。一路上有一些错误,我在下面已经解决了。然而,在测试插件之后,我建议只使用 ODBC,因为它更容易设置并且速度更快。
我 运行宁 Windows 7 x64,postgres 9.3 64 位,stata-SE 11.2 64 位
strncpy_s(svalue, 244, valuetmp, 244);
可能不需要,但此处有关于安全的警告)strcat_s(stata_mac_vars, sizeof stata_mac_vars, fname);
可能不需要,但此处有关于安全的警告)memset(tmpsql_buf,'[=12=]', tmpsql_buf_len + 1);
)#define strncasecmp _strnicmp
)#include <strptime.h>
中的包含
program pg,plugin
测试插件 -- 加载正常,没有警告pgload "dbname=research host=localhost user=XXX password=XXXX" "SELECT permno, date, abs(prc) AS prc FROM crsp.dsf LIMIT 10",clear
,应该看起来很熟悉。
-乔
P.S。感谢您的 blog/github;我无耻地从他们两个那里偷了点东西。