Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5b32850

Browse files
author
Hiroshi Inoue
committed
Fix the bug about boolean type handling reported by
Kristis Markis.
1 parenta8385d0 commit5b32850

File tree

3 files changed

+66
-58
lines changed

3 files changed

+66
-58
lines changed

‎src/interfaces/odbc/convert.c

Lines changed: 62 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,9 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
167167
BOOLchanged;
168168
staticchar*tempBuf=NULL;
169169
staticunsignedinttempBuflen=0;
170-
constchar*neutstr=value;
171-
charmidtemp[16];
170+
constchar*neut_str=value;
171+
charmidtemp[2][32];
172+
intmtemp_cnt=0;
172173

173174
if (!tempBuf)
174175
tempBuflen=0;
@@ -265,27 +266,18 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
265266
break;
266267

267268
casePG_TYPE_BOOL:
268-
{/* change T/F to 1/0 */
269-
char*s= (char*)value;
269+
{/* change T/F to 1/0 */
270+
char*s;
270271

271-
/* Aidan Mountford (aidan@oz.to) 1/08/2001:
272-
273-
>> if (s[0] == 'T' || s[0] == 't') <<< This wont work...
274-
275-
When MoveFirst is called twice on one set of tuples,
276-
this will have the effect of setting s[0] to 1 on the
277-
first pass, and s[0] on the second.
278-
279-
This is bad ;)
280-
281-
*/
282-
283-
strcpy(midtemp,value);
272+
s=midtemp[mtemp_cnt];
273+
strcpy(s, (char*)value);
284274
if (s[0]=='f'||s[0]=='F'||s[0]=='n'||s[0]=='N'||s[0]=='0')
285-
midtemp[0]='0';
275+
s[0]='0';
286276
else
287-
midtemp[0]='1';
288-
neutstr=midtemp;
277+
s[0]='1';
278+
s[1]='\0';
279+
neut_str=midtemp[mtemp_cnt];
280+
mtemp_cnt++;
289281

290282
}
291283
break;
@@ -406,7 +398,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
406398
len=1;
407399
if (cbValueMax>len)
408400
{
409-
strcpy(rgbValueBindRow,neutstr);
401+
strcpy(rgbValueBindRow,neut_str);
410402
mylog("PG_TYPE_BOOL: rgbValueBindRow = '%s'\n",rgbValueBindRow);
411403
}
412404
break;
@@ -426,7 +418,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
426418
*/
427419
casePG_TYPE_BYTEA:/* convert binary data to hex strings
428420
* (i.e, 255 = "FF") */
429-
len=convert_pgbinary_to_char(value,rgbValueBindRow,cbValueMax);
421+
len=convert_pgbinary_to_char(neut_str,rgbValueBindRow,cbValueMax);
430422

431423
/***** THIS IS NOT PROPERLY IMPLEMENTED *****/
432424
break;
@@ -437,7 +429,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
437429
if (stmt->current_col<0||stmt->bindings[stmt->current_col].data_left<0)
438430
{
439431
/* convert linefeeds to carriage-return/linefeed */
440-
len=convert_linefeeds(value,NULL,0,&changed);
432+
len=convert_linefeeds(neut_str,NULL,0,&changed);
441433
if (cbValueMax==0)/* just returns length info */
442434
{
443435
result=COPY_RESULT_TRUNCATED;
@@ -450,7 +442,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
450442
tempBuf=realloc(tempBuf,len+1);
451443
tempBuflen=len+1;
452444
}
453-
convert_linefeeds(value,tempBuf,tempBuflen,&changed);
445+
convert_linefeeds(neut_str,tempBuf,tempBuflen,&changed);
454446
ptr=tempBuf;
455447
}
456448
else
@@ -460,7 +452,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
460452
free(tempBuf);
461453
tempBuf=NULL;
462454
}
463-
ptr=value;
455+
ptr=neut_str;
464456
}
465457
}
466458
else
@@ -534,7 +526,15 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
534526
* those.
535527
*/
536528
if (field_type==PG_TYPE_MONEY)
537-
convert_money(value);
529+
{
530+
if (convert_money(neut_str,midtemp[mtemp_cnt],sizeof(midtemp[0])))
531+
{
532+
neut_str=midtemp[mtemp_cnt];
533+
mtemp_cnt++;
534+
}
535+
else
536+
returnCOPY_UNSUPPORTED_TYPE;
537+
}
538538

539539
switch (fCType)
540540
{
@@ -590,94 +590,94 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
590590
caseSQL_C_BIT:
591591
len=1;
592592
if (bind_size>0)
593-
*(UCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neutstr);
593+
*(UCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neut_str);
594594
else
595-
*((UCHAR*)rgbValue+bind_row)=atoi(neutstr);
595+
*((UCHAR*)rgbValue+bind_row)=atoi(neut_str);
596596

597597
/*
598598
* mylog("SQL_C_BIT: bind_row = %d val = %d, cb = %d, rgb=%d\n",
599-
* bind_row, atoi(neutstr), cbValueMax, *((UCHAR *)rgbValue));
599+
* bind_row, atoi(neut_str), cbValueMax, *((UCHAR *)rgbValue));
600600
*/
601601
break;
602602

603603
caseSQL_C_STINYINT:
604604
caseSQL_C_TINYINT:
605605
len=1;
606606
if (bind_size>0)
607-
*(SCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(value);
607+
*(SCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neut_str);
608608
else
609-
*((SCHAR*)rgbValue+bind_row)=atoi(value);
609+
*((SCHAR*)rgbValue+bind_row)=atoi(neut_str);
610610
break;
611611

612612
caseSQL_C_UTINYINT:
613613
len=1;
614614
if (bind_size>0)
615-
*(UCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(value);
615+
*(UCHAR*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neut_str);
616616
else
617-
*((UCHAR*)rgbValue+bind_row)=atoi(value);
617+
*((UCHAR*)rgbValue+bind_row)=atoi(neut_str);
618618
break;
619619

620620
caseSQL_C_FLOAT:
621621
len=4;
622622
if (bind_size>0)
623-
*(SFLOAT*) ((char*)rgbValue+ (bind_row*bind_size))= (float)atof(value);
623+
*(SFLOAT*) ((char*)rgbValue+ (bind_row*bind_size))= (float)atof(neut_str);
624624
else
625-
*((SFLOAT*)rgbValue+bind_row)= (float)atof(value);
625+
*((SFLOAT*)rgbValue+bind_row)= (float)atof(neut_str);
626626
break;
627627

628628
caseSQL_C_DOUBLE:
629629
len=8;
630630
if (bind_size>0)
631-
*(SDOUBLE*) ((char*)rgbValue+ (bind_row*bind_size))=atof(value);
631+
*(SDOUBLE*) ((char*)rgbValue+ (bind_row*bind_size))=atof(neut_str);
632632
else
633-
*((SDOUBLE*)rgbValue+bind_row)=atof(value);
633+
*((SDOUBLE*)rgbValue+bind_row)=atof(neut_str);
634634
break;
635635

636636
caseSQL_C_SSHORT:
637637
caseSQL_C_SHORT:
638638
len=2;
639639
if (bind_size>0)
640-
*(SWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(value);
640+
*(SWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neut_str);
641641
else
642-
*((SWORD*)rgbValue+bind_row)=atoi(value);
642+
*((SWORD*)rgbValue+bind_row)=atoi(neut_str);
643643
break;
644644

645645
caseSQL_C_USHORT:
646646
len=2;
647647
if (bind_size>0)
648-
*(UWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(value);
648+
*(UWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atoi(neut_str);
649649
else
650-
*((UWORD*)rgbValue+bind_row)=atoi(value);
650+
*((UWORD*)rgbValue+bind_row)=atoi(neut_str);
651651
break;
652652

653653
caseSQL_C_SLONG:
654654
caseSQL_C_LONG:
655655
len=4;
656656
if (bind_size>0)
657-
*(SDWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atol(value);
657+
*(SDWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atol(neut_str);
658658
else
659-
*((SDWORD*)rgbValue+bind_row)=atol(value);
659+
*((SDWORD*)rgbValue+bind_row)=atol(neut_str);
660660
break;
661661

662662
caseSQL_C_ULONG:
663663
len=4;
664664
if (bind_size>0)
665-
*(UDWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atol(value);
665+
*(UDWORD*) ((char*)rgbValue+ (bind_row*bind_size))=atol(neut_str);
666666
else
667-
*((UDWORD*)rgbValue+bind_row)=atol(value);
667+
*((UDWORD*)rgbValue+bind_row)=atol(neut_str);
668668
break;
669669

670670
caseSQL_C_BINARY:
671671

672672
/* truncate if necessary */
673673
/* convert octal escapes to bytes */
674674

675-
if (len=strlen(value),len >= (int)tempBuflen)
675+
if (len=strlen(neut_str),len >= (int)tempBuflen)
676676
{
677677
tempBuf=realloc(tempBuf,len+1);
678678
tempBuflen=len+1;
679679
}
680-
len=convert_from_pgbinary(value,tempBuf,tempBuflen);
680+
len=convert_from_pgbinary(neut_str,tempBuf,tempBuflen);
681681
ptr=tempBuf;
682682

683683
if (stmt->current_col >=0)
@@ -1811,23 +1811,27 @@ convert_escape(char *value)
18111811
}
18121812

18131813

1814-
char*
1815-
convert_money(char*s)
1814+
BOOL
1815+
convert_money(constchar*s,char*sout,size_tsoutmax)
18161816
{
1817-
size_ti=0,
1818-
out=0;
1817+
size_ti=0,out=0;
18191818

1820-
for (i=0;i<strlen(s);i++)
1819+
for (i=0;s[i];i++)
18211820
{
18221821
if (s[i]=='$'||s[i]==','||s[i]==')')
18231822
;/* skip these characters */
1824-
elseif (s[i]=='(')
1825-
s[out++]='-';
18261823
else
1827-
s[out++]=s[i];
1824+
{
1825+
if (out+1 >=soutmax)
1826+
return FALSE;/* sout is too short */
1827+
if (s[i]=='(')
1828+
sout[out++]='-';
1829+
else
1830+
sout[out++]=s[i];
1831+
}
18281832
}
1829-
s[out]='\0';
1830-
returns;
1833+
sout[out]='\0';
1834+
returnTRUE;
18311835
}
18321836

18331837

@@ -2270,6 +2274,7 @@ convert_lo(StatementClass *stmt, const void *value, Int2 fCType, PTR rgbValue,
22702274
lo_lseek(conn,stmt->lobj_fd,0L,SEEK_SET);
22712275
}
22722276
}
2277+
mylog("lo data left = %d\n",left);
22732278

22742279
if (left==0)
22752280
returnCOPY_NO_DATA_FOUND;

‎src/interfaces/odbc/convert.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ int copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, I
3535

3636
intcopy_statement_with_parameters(StatementClass*stmt);
3737
char*convert_escape(char*value);
38-
char*convert_money(char*s);
38+
BOOLconvert_money(constchar*s,char*sout,size_tsoutmax);
3939
charparse_datetime(char*buf,SIMPLE_TIME*st);
4040
intconvert_linefeeds(constchar*s,char*dst,size_tmax,BOOL*changed);
4141
intconvert_special_chars(constchar*si,char*dst,intused);

‎src/interfaces/odbc/drvconn.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,9 @@ dconn_get_connect_attributes(const UCHAR FAR *connect_string, ConnInfo *ci)
355355
char*strtok_arg;
356356

357357
memset(ci,0,sizeof(ConnInfo));
358+
#ifdefDRIVER_CURSOR_IMPLEMENT
359+
ci->updatable_cursors=1;
360+
#endif/* DRIVER_CURSOR_IMPLEMENT */
358361

359362
our_connect_string=strdup(connect_string);
360363
strtok_arg=our_connect_string;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp