【问题标题】:What do I need to compile a Stata plugin for PostgreSQL on Windows?在 Windows 上为 PostgreSQL 编译 Stata 插件需要什么?
【发布时间】:2015-02-07 13:21:28
【问题描述】:

我是 PostgreSQL 的狂热用户,我想鼓励其他人使用它。我(学术)圈子中的许多人都使用 Stata,我设法在 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。编辑 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;

【问题讨论】:

    标签: windows postgresql stata


    【解决方案1】:

    通过一些工作,我成功地构建并运行了 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文件添加包含目录
  • 将 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,'\0', tmpsql_buf_len + 1);)
  • 别名 _strnicmp 到 strncasecmp (#define strncasecmp _strnicmp )
  • 从 Internet 上的某个地方获取 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) 按预期加载
  • -乔

    附:感谢您的博客/github;我无耻地偷了他们俩的东西。

    【讨论】:

    • 我想知道这些更改是否会导致问题。我做了一个GitHub repository,这可能有助于进行调整以隔离问题。我将特定于 OS X 的编辑放在一个单独的分支上,我想 Windows 也可以这样做。
    • 你说:“获取 libintl.h 并将其添加到 PostgreSQL 包含目录(来自这里:gist.github.com/ringerc/d57978ca0d3a3a13b5d7)。由于某种原因,这些不在 postgresql 9.4 服务器包含中。”这些也不在我的 PostgreSQL 包含目录中。
    • 另外,你不使用makefile吗?如果你这样做了,你认为它会有所作为吗?或者你是否在密切复制它正在做的事情?你可以使用CMake(另见here)。
    • @IanGow,你是我的一些更改导致了错误。具体来说,对strncpy 和str_cat 的更改。我搞砸了内存分配部分。我刚把它们改回原来的样子,现在似乎工作正常。我将编辑答案以说明这一点。我现在正在运行一些测试,看看性能与 ODBC 相比如何。我刚刚做了一个 10 次拉动 10,000 行的快速循环。该插件在 13.30 秒内完成此操作,而 ODBC 在 13.13 秒内完成此操作。这与我在 Macbook 上得到的类似。
    • 我同意性能差异非常小。 odbc load 函数的工作方式应该与 pgload 类似,只是对连接字符串进行了细微更改。所以理论上,你的loadsql 应该可以正常工作。您可能会修改它以检查加载插件的错误并使用插件(如果可用)和 odbc 否则,尽管我不确定它是否值得工作。另请注意,除了读取数据库之外,ODBC 还允许您写入数据库等。有关更多信息,请参阅 stata 中的help odbc。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2014-03-15
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多