PGDLLEXPORT覚書

放っておくと忘れてしまうので覚書。
最近PGDLLEXPORTというマクロが導入され、たとえばsrc/include/fmgr.h内の次のマクロ定義に使用されている。


#define PG_MODULE_MAGIC \
extern PGDLLEXPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \
const Pg_magic_struct * \
PG_MAGIC_FUNCTION_NAME(void) \
{ \
static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \
return &Pg_magic_data; \
} \
extern int no_such_variable


ここでPGDLLEXPORTは関数PG_MAGIC_FUNCTION_NAMEがdll(もしくはexe)から何らかの形でexportされるべき対象であることを示し、ソースレベルでexport指定可能なWindows環境(MSVC、mingwまたはcygwin)下では実際に__declspec(dllexport)に置き換えられる....予定であったのだがmingwで(cygwinでも?)不具合を引き起こし、現状はMSVC環境でのみ__declspec(dllexport)指定が残っている。


問題点は二つ。

1.mingw及びcygwin下での対応の仕方。__declspec(dllexport)が駄目ならということで何故か__declspec(dllimport)に置き換えられている。これは基本的に間違いである。__declspec(dllimport)で実体はモジュールの外にあると宣言した直後に関数の実装本体が続くのだから全く奇妙なマクロ定義というしかない。__declspec(dllexport)がどうしても駄目なら__declspec宣言そのものをなくすべきであろう。

2.そもそもなぜmingw(cygwin?)下で不具合が発生するのかということ。
dllをbuildするために利用しているdllwrap(dlltoolも?)と__declspec(dllexport)の相性が悪いこと。具体的にいうとDLLのrelocセクションに重複が発生してしまい実際にrelocateが発生した場合にクラッシュを引き起こしてしまう。これに関してはdllwrapでなくgccを利用すれば解決可能である。

 単独記録

年間200本安打

  • 連続記録  メジャー歴代1位タイ(Willie Keelerと同, 現役2位はMichael Youngの5年)
  • 達成回数  メジャー歴代3位タイ(1位はPete Roseの10回、現役では1位 2位はDerek Jeterの6回)

年間100得点

  • 連続記録  メジャー歴代10位タイ(1位はAlex Rodriguez等13年、現役では3位タイ A-Rod13年, Johnny Damon 9年に続く)
  • 達成回数  メジャー歴代?????(1位はHank Aaron15回、現役5位タイ 1位はAlex Rodriguez 13回)

年間30盗塁

  • 連続記録  メジャー歴代12位タイ(1位はRickey Henderson15年, 現役ではJuan Pierreと並んで1位)
  • 達成回数  メジャー歴代21位?タイ(1位はRickey Henderson21回、現役ではJuan Pierreと並んで1位)

 100得点し8年連続ノルマを達成

本日100得点を記録し今年も3割200安打100得点30盗塁を達成。しかし100得点はまさに冷や汗もの、自分の力だけでできる者ではないので来年がかなり心配である。200安打もかなり苦労したが達成、ついに単独の連続年記録でメジャー記録に並んだ。とりあえず更新した記録を整理しておくと、

まず年間200本安打に関連するものとして

  • 8年連続200本安打(100得点を加えても同) メジャータイ(Willie Keelerと同, Wade Boggsが7年連続)
  • 200本安打達成8回             メジャー歴代3位タイ(1位はPete Roseの10回)

200本安打を含む組み合わせの記録としては

  • 8年連続200本安打30盗塁       メジャー記録更新中(2位は4年連続 Willie Keeler)
  • 200本安打30盗塁8回達成       メジャー新記録(2位は7回 Ty Cobb)
  • 200本安打100得点8回達成      メジャータイ(Lou Gehrig,Willie Keeler と同、7回達成は4人)
  • 200本安打100得点30盗塁8回達成  メジャー記録更新中(2位は6回 Ty Cobb, Willie Keeler)

200本安打抜きでも盗塁と得点の組み合わせでのメジャー記録を更新中。盗塁と得点は意外と関連性に乏しくイチローがさりげなくクリアしているのは実は凄いことなのです。

  • 8年連続100得点30盗塁        メジャー記録更新中(2位は6年連続 Joe Morgan、3位は5年連続 Rickey Henderson)
  • 8年連続3割100得点30盗塁      メジャー記録更新中(2位は4年連続 Ty Cobb, Willie Keeler)
  • 100得点30盗塁達成8回        メジャー2位(多分、1位はRickey Hendersonの11回)

8.3.0201

最近コミットしたいくつかの修正の覚書

  1. GUID型のサポート ODBC3.5xサポートで手抜きしていた部分。Jan-Willem Goossens氏のコードをお借りして実装。
  2. 昨年10月29日の修正3にからむバグの修正
  3. 初めて64ビットドライバのバグレポートがあり、mylogから推測した修正を試してもらう。パラメーター配列におけるバッファ長インジケーターのアドレスシフト処理に32ビットの名残りが残っており、64ビットでも通用する形に修正した。
  4. サーバー側の外部キーの実装に変更があったようでSQLForeignKeys()が情報を返さなくなってしまった。とりあえず8.3以後についてのみ違う実装に変更した。コードそのものは新方式の方が旧方式よりずっとシンプルで、問題ないようなら8.0位から適用するかもしれない。実装用のSQLに初めてgenerate_series()関数を使ってみました。
  5. Use Declare/Fetchモードでは、カーソルを使用しやすくするため、自動コミットモードであっても内部的にトランザクションを発生させている。そして関連カーソルがすべて閉じられた時にそのトランザクションを終了するようにしている。しかしすべて閉じられたという判定に誤りがありオープンカーソルがあるにもかかわらずトランザクションを終了させてしまうケースがあり、これを修正した。致命的なバグとはいえないかもしれないがもしかしたらパフォーマンスにはかなり影響があったかもしれない。

8.2.0501

まだバイナリに組み込んではいないが、今回WindowsのSSPI(Security Support Provider Interface)利用を試みている。とりあえずSSL通信の場合を取り組んでみたがこれがなかなかわかりにくい。サンプルコードを真似てはみたが自信はほとんどない。パフォーマンス等も含めて使い物になるかどうかは今後のテスト結果次第である。

8.2.0501

  1. 5月9日の修正1でLENGTHだけでなくDISPLAY_SIZEまで修正していしまったのを、DISPLAY_SIZEの方は元に戻した。
  2. SQLGetInfoのSQL_DATABASE_NAME問い合わせに対しデータベース名を答えているが、MS Queryに関してはこれがまずい結果を生むようなので空文字列を返すように変更。
  3. 以前からSELECT文をDECLARE CURSOR ...とFETCHに変換しようとするUseDeclareFetchモードでも、SELECT文がFOR UPDATEを含む場合はこの変換を回避していた。これをFOR SHAREを含む場合にも適用、更にどちらも含まない場合はDECLARE文の最後にFOR READ ONLYを補う(8.3以後)ように変更した。8.3ではupdatable cursorが実装され、DECLARE文にFOR UPDATE/SHAREが記述できるようにはなったのであるが、使いづらいスペックであるためやはり適用を回避することにした。また、FOR READ ONLYを省略しても、暗黙でFOR UPDATE/SHAREと解釈されることはないようであるが、SQL標準はそんなケースがありうることを示しているため、用心のためFOR READ ONLYを補うことにした。
  4. pgsql-jpメーリングリストでの樋口氏のバグレポート対応。lo型がうまく認識できない場合、bookmarkのfetch操作から呼び出されるcopy_and_convert_field()がlo型変換ととして誤認識される場合がある不具合を修正。

 7年連続100得点も達成

イチロー今年も年間100得点を達成。今期も色々な記録を達成しているが今までの連続記録に加えて通算回数記録も見られるようになってきたのが特徴か。
まず年間200本安打に関連するものとして

  • 7年連続200本安打(100得点を加えても同) メジャー歴代2位タイ(Wade Boggsと同、Willie Keelerが8年連続を記録)
  • 200本安打達成7回             メジャー歴代6位タイ(1位はPete Roseの10回)

200本安打を含む組み合わせの記録としては

  • 7年連続200本安打30盗塁       メジャー記録更新中(2位は4年連続 Willie Keeler)
  • 200本安打100得点30盗塁7回達成  メジャー新記録(2位は6回 Ty Cobb, Willie Keeler)
  • 200本安打30盗塁7回達成       メジャータイ記録(Ty Cobbと同)
  • 200本安打100得点7回達成      メジャー歴代3位タイ(Lou Gehrig,Willie Keeler 8回達成、7回達成は他に4人)

200本安打が絡まない記録としては

  • 7年連続100得点30盗塁        メジャー新記録(2位は6年連続 Joe Morgan、3位は5年連続 Rickey Henderson)
  • 7年連続3割100得点30盗塁      メジャー記録更新中(2位は4年連続 Ty Cobb, Willie Keeler)