在Windows上为PostgreSQL编译Stata插件需要什么?

时间:2015-02-07 13:21:29

标签: windows postgresql stata

我是PostgreSQL的狂热用户,我想鼓励其他人使用它。我(学术界)的很多人都使用Stata,我已经设法在Mac OS X上编译 一个允许Stata直接访问PostgreSQL的插件;这得到了那些尝试过的人的好评(尽管我认为还有改进的余地)。但是,我的许多使用Stata的同事都运行Windows,如果这个插件可以为他们工作也会很棒。

以下是我在OS X上编译插件的步骤(插件来自牛津的一个站点);我从我的博客here复制了这些步骤。

我的问题是:如何修改这些指令以在Windows上运行? (我无法访问Windows,所以如果你能确认你可以修改它以便为你工作,那就太好了。)

请注意,我从MacPorts安装了PostgreSQL,我也有wgetsudo 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。编辑Makefile

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;

1 个答案:

答案 0 :(得分:2)

通过一些工作,我成功地构建并运行了pgload。在此过程中出现了一些错误,我在下面进行了讨论。然而,在测试插件之后,我建议只使用ODBC,因为它更容易设置并且更快一点。

我正在运行Windows 7 x64,postgres 9.3 64位,stata-SE 11.2 64位

  • 为PGSQL扩展设置Visual Studio(VS Express 2015 for Desktop)(关注http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/
  • 为stata文件添加include目录
  • 将libpq.lib添加到链接库
  • 改变了“char tmpsql_buf [tmpsql_buf_len + 1];” to“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,'\0', tmpsql_buf_len + 1);
  • 别名_strnicmp到strncasecmp(#define strncasecmp _strnicmp
  • 从互联网上的某个地方获取strptime.c和strptime.h并将这些文件与stata文件放在一起;在time.h的include之后在pg.c #include <strptime.h>中添加了一个include。
  • 获得libintl.h并将其添加到PostgreSQL包含目录(从这里:https://gist.github.com/ringerc/d57978ca0d3a3a13b5d7)。由于某些原因,这些不在postgresql 9.3 x64服​​务器包含。
  • 将postgres.exe的路径添加到Windows PATH环境变量
  • 确保架构符合ST64,PGSQL和目标机器等的x64(64位)
  • 构建项目 - 编译DLL OK,无警告
  • 将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>

    -Joe

    P.S。感谢您的博客/ github;我无耻地从两个人那里偷走了一些东西。