[前][次][番号順一覧][スレッド一覧]

mysql:162

From: Kengo Jinno <Kengo Jinno <kengo@xxxxxxxxxx>>
Date: Wed, 27 May 1998 21:59:50 +0900
Subject: [mysql 162] Re: MyODBC でトラブル


神野です。

Wed, 27 May 1998 21:20:49 +0900 ごろに
<356C0521285.5105TAMON@xxxxxxxxxx> の
"[mysql 161] Re[2]: MyODBC でトラブル" のメールで
Tamon Nomura <tamon@xxxxxxxxxx> さんは書きました。

> ばっちり出来ました。変更したソースなんかみせていただけるとうれしいです。

まず、mysql-3.21.30のSJIS用のマクロをdefineしてしまってます。
本来ならm_ctype.hあたりでdefineすべきなんでしょうが、こいつをincludeして
ないファイルもあるのでmyodbc.hでもいいんじゃないでしょうか。

#ifdef	USE_MB
#define issjishead(c)   ((0x81<=(uchar)(c) && (uchar)(c)<=0x9f) || (0xe0<=(uchar)(c) && (uchar)(c)<=0xfc))
#define issjistail(c)   ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || (0x80<=(uchar)(c) && (uchar)(c)<=0xfc))
#endif

で、このマクロを利用して、SJIS判定してます。

[utility.c]
void remove_escape(char *name)
{
  char *to;
  for (to=name ; *name ; name++)
  {
#ifdef USE_MB
    if( issjishead( name[0] ) && issjistail( name[1] ) ) {
        *to++ = *name++;
        *to++ = *name;
        continue;
    }
#endif
    if (*name == '\\' && name[1])
      name++;
    *to++= *name;
  }
  *to=0;
}

[prepare.c]
RETCODE my_SQLPrepare(HSTMT hstmt,UCHAR FAR *szSqlStr, SDWORD cbSqlStr)
{
  STMT FAR *stmt=(STMT FAR*) hstmt;
  char in_string,*pos;
  uint param_count;
  DBUG_ENTER("my_SQLPrepare");
(中略)
  for (pos=stmt->query; *pos ; pos++)
  {
#ifdef  USE_MB
    if( issjishead( pos[0] ) && issjistail( pos[1] ) ) {
        pos += 2-1;
        continue;
    }
#endif
    if (*pos == '\\' && pos[1])                 /* Next char is escaped */
    {
      pos++;
      continue;
    }

[execute.c]
static char *insert_param(NET *net,char *to,PARAM_BIND *param)
{
  uint length;
  char buff[128],*data;
  bool convert=0;
(ずずっと中略)
  switch (param->SqlType) {
  case SQL_CHAR:
  case SQL_VARCHAR:
  case SQL_LONGVARCHAR:
  {
    char *data_end=data+length;
    char *to_end=net->buff+net->max_packet-3;

    *to++='\'';

    while (data != data_end)
    {
      if (to >= to_end)
      {
        if (!(to=extend_buffer(net,to,(data_end-data)+256)))
          return 0;
        to_end=net->buff+net->max_packet-3;
      }
      /* Escape \0, \r and \n for better logging */
#ifdef USE_MB
      if( issjishead( data[0] ) && issjistail( data[1] ) ) {
        *to++ = *data++;
        *to++ = *data++;
        continue;
      }
#endif
      if (*data == 0)
      {
        data++;
        *to++= '\\';
        *to++= '0';
      }

てな感じです。

> ところで、MyODBC 2.50.16bを使っていらっしゃるようですが
> DATEのカラムがおかしくなりませんか?

そこまで見てないです。ごめんなさい。Access97は他の者がつついてますんで。

-----------------------------
神野健吾 <kengo@xxxxxxxxxx>


[前][次][番号順一覧][スレッド一覧]

       159 1998-05-27 13:36 ["Toshiyuki Fujii" <f] MyODBCでトラブル                        
       160 1998-05-27 14:16 ┗[Kengo Jinno <kengo@x]                                       
       161 1998-05-27 21:20  ┣[Tamon Nomura <tamon@] Re[2]: MyODBC でトラブル            
->     162 1998-05-27 21:59  ┃┗[Kengo Jinno <kengo@x] Re: MyODBC でトラブル             
       163 1998-05-27 22:50  ┃ ┗[Tamon Nomura <tamon@]                                 
       164 1998-05-27 23:15  ┃  ┗[<takeshi@xxxxxxxxxx>]                               
       166 1998-05-28 01:40  ┗[Hiroshi Marui <bant@]                                     
       169 1998-05-28 15:16   ┗[Kengo Jinno <kengo@x] SJIS&lt;--&gt;UJIS on MyODBC ( Re: MyODBCでトラブル )
       172 1998-05-28 15:54    ┣["民斗 " <tommy@xxxxx]                                 
       175 1998-05-29 01:32    ┗[Hiroshi Marui <bant@]