[pgsql-jp: 41601] Re: C言語によるユーザ定義関数について

高岡 尚美 takaoka.naomi @ syskg.co.jp
2014年 3月 17日 (月) 13:50:28 JST


高岡です。
実現できましたので、ご報告しておきます。

FILEのIOは
#include "postgres.h"
#include "fmgr.h"
のインクルードをしないソースファイルに書くことにより
入出力が正しく動きました。

文字コードの変換はご教授いただいたとおりの関数でうまく変換できました。
(高橋様、ありがとうございます。)
SJISからUTF-8の変換はSJIS->UTF-16->UTF8のように行いました。

//SJIS->UTF-16
BSTR CStringToBSTR(char* cstring, int *len ){
    int    cstringlen, out_size;
    BSTR   wstr;
    cstringlen = strlen(cstring);
    // Shift-JIS文字列からUTF-16に変換したときの文字列長を求める。
    out_size   = MultiByteToWideChar(CP_ACP, 0, cstring, cstringlen, NULL, 
0);
 *len = out_size;
    // UTF-16文字列の領域を確保する。
    wstr       = SysAllocStringLen(NULL, out_size);
    // Shift-JIS文字列からUTF-16に変換する。
    MultiByteToWideChar(CP_ACP, 0, cstring, cstringlen, wstr, out_size);
    return wstr;
}
//UTF-16->UTF-8
char* BSTRtoUTF8(BSTR bstr, int *len){
    int    out_size;
    char   *cstring;
    // UTF-16文字列からUTF-8に変換したときの文字列長を求める。
    out_size = WideCharToMultiByte(CP_UTF8, 0, (OLECHAR*)bstr, -1,NULL, 0, 
NULL, NULL);
 (*len) = out_size;
    elog(NOTICE, "unicode->UTF-8 out_size=%d", out_size);
    // Shift-JIS文字列の領域を確保する。
    cstring  = (char*)palloc((out_size+1) * sizeof(char));
    // UTF-16文字列からUTF-8に変換する。
    WideCharToMultiByte(CP_UTF8, 0, (OLECHAR*)bstr, -1, cstring,out_size, 
NULL, NULL);
    return cstring;
}

----- Original Message ----- 
From: <pgsql-jp-request @ ml.postgresql.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Thursday, March 13, 2014 12:00 PM
Subject: pgsql-jp まとめ読み, 107 巻, 4 号


> pgsql-jp メーリングリストへの投稿は以下のアドレスに送ってください.
> pgsql-jp @ ml.postgresql.jp
>
> Webブラウザを使って入退会するには以下のURLにどうぞ.
> http://ml.postgresql.jp/mailman/listinfo/pgsql-jp
> メールを使う場合,件名(Subject:)または本文に help と書いて以下の
> アドレスに送信してください.
> pgsql-jp-request @ ml.postgresql.jp
>
> メーリングリストの管理者への連絡は,以下のアドレスにお願いします.
> pgsql-jp-owner @ ml.postgresql.jp
>
> 返信する場合,件名を書き直して内容がわかるようにしてください.
> そのままだと,以下のようになってしまいます. "Re: pgsql-jp まとめ読み,
> XX 巻 XX 号"
>
>
> 本日の話題:
>
>   1. [pgsql-jp: 41589] order by での indexの利用について
>      (prod2011 @ yahoo.co.jp)
>   2. [pgsql-jp: 41590] Re: C言語によるユーザ定義関数について
>      (高岡 尚美)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 13 Mar 2014 11:32:02 +0900 (JST)
> From: prod2011 @ yahoo.co.jp
> To: "pgsql-jp @ ml.postgresql.jp" <pgsql-jp @ ml.postgresql.jp>
> Subject: [pgsql-jp: 41589] order by での indexの利用について
> Message-ID: <786791.17022.qm @ web100302.mail.kks.yahoo.co.jp>
> Content-Type: text/plain; charset=utf-8
>
> こんにちは、prodと申します。
>
> テーブルを連結してOrder byした後で、limit かけて500件表示
>
> といった処理をしていますがデータの取得が遅く、
> 困っています。
>
> 環境は以下です
>
> サーバOS:Red Hat Enterprise Linux Server release 5.3
> Postgresバージョン:PostgreSQL 9.1.2
>
> 具体的には以下のようなSQLです
>
> select
> a.col1
> ,a.col2
> ,a.col3
> ,b.col1
> ,b.col2
> from table_a a
> inner join table_b b (a.col1=b.col1)
> order by a.col1,a.col2,b.col1
> offset 0 limit 500
>
>
> table_a には ?a.col1,a.col2 で indexを作成しており、
> table_b には ?b.col1 で indexを作成しております。
> (index は btreeです)
>
> このまま実行すると、データの取得に時間がかかり、
> 困っています。
>
>
> order byからb.col1を除くと、Order byで、
> a.col1,a.col2のindexを使ってくれるようになり、非常に高速となるのですが、
> b.col1を order by に追加すると、indexを使ってくれません。
>
>
> order by a.col1,a.col2,b.col1
> としても、 a.col1,a.col2 のindexは使ってくれる。
> といったようにはならないものなのでしょうか?
> また、他の方法でもいいですが、高速かすために良い方法は
>
> ございますでしょうか?
>
> 件数:table_a 20万件
> ? ? ? table_b 100万件
> 程度です。
>
> アドバイスいただけますと、幸いです。
>
>
> ------------------------------
>
> Message: 2
> Date: Thu, 13 Mar 2014 11:33:55 +0900
> From: 高岡 尚美 <takaoka.naomi @ syskg.co.jp>
> To: "Toshiya Takahashi" <toshiya.t @ gmail.com>, "PostgreSQL Japanese
> Mailing List" <pgsql-jp @ ml.postgresql.jp>
> Subject: [pgsql-jp: 41590] Re: C言語によるユーザ定義関数について
> Message-ID: <619FC6AAD2E8426A96FC11AECA259402 @ nezumi>
> Content-Type: text/plain; format=flowed; charset="iso-2022-jp";
> reply-type=original
>
> 高岡です。
>
> ありがとうございます。
> 参考にしてチャレンジしてみます。
>
> ----- Original Message ----- 
> From: "Toshiya Takahashi" <toshiya.t @ gmail.com>
> To: "高岡 尚美" <takaoka.naomi @ syskg.co.jp>; "PostgreSQL Japanese Mailing
> List" <pgsql-jp @ ml.postgresql.jp>
> Sent: Thursday, March 13, 2014 10:46 AM
> Subject: Re: [pgsql-jp: 41588] C言語によるユーザ定義関数について
>
>
>> はじめまして高橋と申します。
>>
>> 私は、VC++での開発から離れて久しいので、的外れかもしれませんが、
>> Windows APIの MultiByteToWideChar 関数を利用することはできませんか?
>>  http://www.lab.its55.com/?p=33
>>  http://www.softist.com/programming/sjis-utf8/sjis-utf8.htm
>>
>> どうしても、[ユーザ定義関数]で[一文字づつ]の実装が必要なら、
>> iconv のソースが参考になると思います。
>>  http://q.hatena.ne.jp/1151070625
>>
>>
>> 2014年3月11日 11:57 高岡 尚美 <takaoka.naomi @ syskg.co.jp>:
>>
>>> はじめまして、高岡です。
>>>
>>> C言語のユーザ定義関数で、
>>> SJISコードのファイルを読込、1文字ずつ
>>> unicode(UTF-16)やUTF-8の文字コードに
>>> 変換してファイルに書き出し、読み込んだ内容を
>>> 返却する処理を作成したいと思っております。
>>> やりかたをご教授いただけないでしょうか
>>> よろしくお願いします。
>>>
>>> DBサーバ:
>>> Windows Server 2008 R2
>>> PostgreSQL 9.1.2, compiled by Visual C++ build 1500, 64-bit
>>>
>>> ユーザ定義関数 開発環境
>>> Microsoft Visual Studio 2010 VC++
>>>
>>>
>>
>>
>> -- 
>> --------------------
>> Name : Toshiya Takahashi(高橋 俊也)
>> E-mail : toshiya.t @ gmail.com
>>
>
>
>
> ------------------------------
>
> _______________________________________________
> pgsql-jp mailing list
> pgsql-jp @ ml.postgresql.jp
> http://ml.postgresql.jp/mailman/listinfo/pgsql-jp
>
>
> 以上: pgsql-jp まとめ読み, 107 巻, 4 号
> *************************************** 



pgsql-jp メーリングリストの案内