API Guide
API Guide
API Guide
InterBase
SOFTWARE CORPORATION
®
InterBase Software Corp. and Borland International may have patents and/or pending patent applications covering
subject matter in this document. The furnishing of this document does not convey any license to these patents.
Copyright 1998 InterBase Software Corporation. All rights reserved. All InterBase products are trademarks or
registered trademarks of InterBase Software Corporation. All Borland products are trademarks or registered
trademarks of Borland International, Inc. Other brand and product names are trademarks or registered trademarks
of their respective holders.
INT0050WW21003 5E3R0298
9899000102-9 8 7 6 5 4 3 2 1
D4
Table of Contents
/LVWRI7DEOHV L[ 6SHFLI\LQJXVHUQDPHDQGSDVVZRUG
8VLQJHQYLURQPHQWYDULDEOHV
Chapter 1 Using the API Guide 6HWWLQJDGHIDXOWGDWDEDVHGLUHFWRU\
:KRVKRXOGXVHWKLVJXLGH 6HWWLQJDXVHUQDPHDQGSDVVZRUG
7RSLFVFRYHUHGLQWKLVJXLGH 'DWDW\SHV
6DPSOHGDWDEDVHDQGDSSOLFDWLRQV &DOOLQJFRQYHQWLRQV
%XLOGLQJDSSOLFDWLRQV
3DUW, $3,8VHU·V*XLGH
&RPSLOHUV
Chapter 2 Application Requirements /LQNLQJ
5HTXLUHPHQWVIRUDOODSSOLFDWLRQV ,QFOXGHILOHV
,QFOXGLQJLEDVHK 8VLQJ0LFURVRIW&
'DWDEDVHUHTXLUHPHQWV 8VLQJ%RUODQG&&
'HFODULQJGDWDEDVHKDQGOHV 8VLQJWKH%RUODQGLQWHJUDWHGGHYHORSPHQW
HQYLURQPHQW ,'(
6HWWLQJXSD'3%
,'(GHIDXOW
7UDQVDFWLRQUHTXLUHPHQWV
,'(3URMHFW2SWLRQVGLDORJER[
'HFODULQJWUDQVDFWLRQKDQGOHV
0RGXOHGHILQLWLRQILOH
6HWWLQJXSD73%
8VLQJG\QDPLFOLQNOLEUDULHV '//V
$GGLWLRQDOUHTXLUHPHQWV
([DPSOHSURJUDPV
0LFURVRIW:LQGRZVUHTXLUHPHQWV
'64/UHTXLUHPHQWV Chapter 4 Working with Databases
%OREUHTXLUHPHQWV &RQQHFWLQJWRGDWDEDVHV
$UUD\UHTXLUHPHQWV &UHDWLQJGDWDEDVHKDQGOHV
(YHQWUHTXLUHPHQWV 'HFODULQJGDWDEDVHKDQGOHV
(UURUKDQGOLQJUHTXLUHPHQWV ,QLWLDOL]LQJGDWDEDVHKDQGOHV
&RPSLOLQJDQGOLQNLQJ &UHDWLQJDQGSRSXODWLQJD'3%
$GGLQJSDUDPHWHUVWRD'3%
Chapter 3 Programming with
the InterBase API $WWDFKLQJWRDGDWDEDVH
%DVLFSURFHGXUHIRUDSSOLFDWLRQGHYHORSPHQW 5HTXHVWLQJLQIRUPDWLRQDERXWDQDWWDFKPHQW
6XSSRUWHGGHYHORSPHQWHQYLURQPHQWV 5HTXHVWLQJEXIIHULWHPVDQGUHVXOW
EXIIHUYDOXHV
8VHUQDPHDQGSDVVZRUGUHTXLUHPHQWV
iv INTERBASE 5
3UHSDULQJWKHRXWSXW;64/'$ $VVRFLDWLQJWKHQHZ%OREZLWKWKH
3UHSDULQJDTXHU\VWDWHPHQWVWULQJ %OREFROXPQ
ZLWKRXWSDUDPHWHUV 'HOHWLQJD%ORE
([HFXWLQJDVWDWHPHQWVWULQJZLWKLQ 5HTXHVWLQJLQIRUPDWLRQDERXWDQRSHQ%ORE
WKHFRQWH[WRIDFXUVRU ,WHPOLVWEXIIHULWHPVDQGUHVXOWEXIIHUYDOXHV
5HH[HFXWLQJDTXHU\VWDWHPHQWVWULQJ LVFBEOREBLQIR FDOOH[DPSOH
ZLWKRXWSDUDPHWHUV
%OREGHVFULSWRUV
0HWKRG4XHU\VWDWHPHQWVZLWKSDUDPHWHUV
3RSXODWLQJD%OREGHVFULSWRU
3UHSDULQJWKHLQSXW;64/'$
)LOWHULQJ%OREGDWD
3UHSDULQJWKHRXWSXW;64/'$
8VLQJ\RXURZQILOWHUV
3UHSDULQJDTXHU\VWDWHPHQWVWULQJ
'HFODULQJDQH[WHUQDO%OREILOWHU
ZLWK SDUDPHWHUV
WRWKHGDWDEDVH
([HFXWLQJDTXHU\VWDWHPHQWVWULQJ
:ULWLQJDQH[WHUQDO%OREILOWHU
ZLWKLQWKHFRQWH[WRIDFXUVRU
'HILQLQJWKHILOWHUIXQFWLRQ
5HH[HFXWLQJDTXHU\VWDWHPHQWVWULQJ
ZLWK SDUDPHWHUV 'HILQLQJWKH%OREFRQWUROVWUXFWXUH
'HWHUPLQLQJDQXQNQRZQVWDWHPHQWW\SH 3URJUDPPLQJILOWHUIXQFWLRQDFWLRQV
DWUXQWLPH :ULWLQJDQDSSOLFDWLRQWKDWUHTXHVWVILOWHULQJ
8QGHUVWDQGLQJWKH%ORESDUDPHWHUEXIIHU
Chapter 7 Working with Blob Data
5HTXHVWLQJILOWHUXVDJH
:KDWLVD%ORE"
+RZDUH%OREGDWDVWRUHG" Chapter 8 Working with Array Data
%OREVXEW\SHV ,QWURGXFWLRQWRDUUD\V
%OREGDWDEDVHVWRUDJH $UUD\GDWDEDVHVWRUDJH
%OREGDWDRSHUDWLRQV $UUD\GHVFULSWRUV
5HDGLQJGDWDIURPD%ORE 3RSXODWLQJDQDUUD\GHVFULSWRU
&UHDWLQJWKH6(/(&7VWDWHPHQW $FFHVVLQJDUUD\GDWD
3UHSDULQJWKHRXWSXW;64/'$ 5HDGLQJGDWDIURPDQDUUD\
3UHSDULQJWKH6(/(&7VWDWHPHQW &UHDWLQJWKH6(/(&7VWDWHPHQW
IRUH[HFXWLRQ 3UHSDULQJWKHRXWSXW;64/'$
([HFXWLQJWKHVWDWHPHQW 3UHSDULQJWKH6(/(&7VWDWHPHQW
)HWFKLQJVHOHFWHGURZV IRUH[HFXWLRQ
5HDGLQJDQGSURFHVVLQJWKH%OREGDWD ([HFXWLQJWKHVWDWHPHQW
:ULWLQJGDWDWRD%ORE 3RSXODWLQJWKHDUUD\GHVFULSWRU
3UHSDULQJWKH83'$7(RU,16(57 )HWFKLQJVHOHFWHGURZV
VWDWHPHQW 5HDGLQJDQGSURFHVVLQJWKHDUUD\GDWD
&UHDWLQJDQHZ%OREDQGVWRULQJGDWD :ULWLQJGDWDWRDQDUUD\
API GUIDE v
3UHSDULQJWKHDUUD\GHVFULSWRU &UHDWLQJ(3%VZLWKLVFBHYHQWBEORFN
3UHSDULQJWKHDUUD\EXIIHUZLWKGDWD :DLWLQJRQHYHQWVZLWKLVFBZDLWBIRUBHYHQW
3UHSDULQJWKH83'$7(RU,16(57 &RQWLQXRXVSURFHVVLQJZLWKLVFBTXHBHYHQWV
VWDWHPHQW &UHDWLQJDQ$67
&DOOLQJLVFBDUUD\BSXWBVOLFH $FRPSOHWHLVFBTXHBHYHQWV H[DPSOH
$VVRFLDWLQJWKHQHZDUUD\ZLWKWKH 'HWHUPLQLQJZKLFKHYHQWVRFFXUUHGZLWK
DUUD\FROXPQ LVFBHYHQWBFRXQWV
'HOHWLQJDQDUUD\ &DQFHOLQJLQWHUHVWLQDV\QFKURQRXVHYHQWV
ZLWKLVFBFDQFHOBHYHQWV
Chapter 9 Working with Conversions
&RQYHUWLQJGDWHVIURP,QWHU%DVHWR&IRUPDW 3DUW,, $3,5HIHUHQFH*XLGH
&RQYHUWLQJGDWHVIURP&WR,QWHU%DVHIRUPDW
Chapter 12 API Function Reference
5HYHUVLQJE\WHRUGHURIQXPEHUVZLWK
LVFBYD[BLQWHJHU )XQFWLRQFDWHJRULHV
$UUD\IXQFWLRQV
Chapter 10 Handling Error Conditions %OREIXQFWLRQV
6HWWLQJXSDQHUURUVWDWXVYHFWRU 'DWDEDVHIXQFWLRQV
8VLQJLQIRUPDWLRQLQWKHVWDWXVYHFWRU &RQYHUVLRQIXQFWLRQV
&KHFNLQJWKHVWDWXVYHFWRUIRUHUURUV '64/IXQFWLRQV
'LVSOD\LQJ,QWHU%DVHHUURUPHVVDJHV (UURUKDQGOLQJIXQFWLRQV
&DSWXULQJ,QWHU%DVHHUURUPHVVDJHV (YHQWIXQFWLRQV
6HWWLQJDQ64/&2'(YDOXHRQHUURU ,QIRUPDWLRQIXQFWLRQV
'LVSOD\LQJ64/HUURUPHVVDJHV 6HFXULW\IXQFWLRQV
&DSWXULQJ64/HUURUPHVVDJHV 7UDQVDFWLRQFRQWUROIXQFWLRQV
3DUVLQJWKHVWDWXVYHFWRU 8VLQJIXQFWLRQGHILQLWLRQV
+RZWKHVWDWXVYHFWRULVSDUVHG LVFBDGGBXVHU
0HDQLQJRIWKHILUVWORQJLQDFOXVWHU LVFBDUUD\BJHWBVOLFH
0HDQLQJRIWKHVHFRQGORQJLQDFOXVWHU LVFBDUUD\BORRNXSBERXQGV
0HDQLQJRIWKHWKLUGORQJLQDFOXVWHU LVFBDUUD\BORRNXSBGHVF
6WDWXVYHFWRUSDUVLQJH[DPSOH LVFBDUUD\BSXWBVOLFH
LVFBDUUD\BVHWBGHVF
Chapter 11 Working with Events
LVFBDWWDFKBGDWDEDVH
8QGHUVWDQGLQJWKHHYHQWPHFKDQLVP
LVFBEOREBGHIDXOWBGHVF
(YHQWSDUDPHWHUEXIIHUV
LVFBEOREBJHQBESE
6\QFKURQRXVHYHQWQRWLILFDWLRQ
LVFBEOREBLQIR
$V\QFKURQRXVHYHQWQRWLILFDWLRQ
LVFBEOREBORRNXSBGHVF
7UDQVDFWLRQFRQWURORIHYHQWV
vi INTERBASE 5
LVFBEOREBVHWBGHVF LVFBSUHSDUHBWUDQVDFWLRQ
LVFBFDQFHOBEORE LVFBSUHSDUHBWUDQVDFWLRQ
LVFBFDQFHOBHYHQWV LVFBSULQWBVTOHUURU
LVFBFORVHBEORE LVFBSULQWBVWDWXV
LVFBFRPPLWBUHWDLQLQJ LVFBSXWBVHJPHQW
LVFBFRPPLWBWUDQVDFWLRQ LVFBTXHBHYHQWV
LVFBFUHDWHBEORE LVFBUROOEDFNBWUDQVDFWLRQ
LVFBGDWDEDVHBLQIR LVFBVTOFRGH
LVFBGHFRGHBGDWH LVFBVTOBLQWHUSUHWH
LVFBGHOHWHBXVHU LVFBVWDUWBPXOWLSOH
LVFBGHWDFKBGDWDEDVH LVFBVWDUWBWUDQVDFWLRQ
LVFBGURSBGDWDEDVH LVFBWUDQVDFWLRQBLQIR
LVFBGVTOBDOORFDWHBVWDWHPHQW LVFBYD[BLQWHJHU
LVFBGVTOBDOORFBVWDWHPHQW LVFBYHUVLRQ
LVFBGVTOBGHVFULEH LVFBZDLWBIRUBHYHQW
LVFBGVTOBGHVFULEHBELQG
Appendix A InterBase Document
LVFBGVTOBH[HFXWH
Conventions
LVFBGVTOBH[HFXWH
7KH,QWHU%DVHGRFXPHQWDWLRQVHW
LVFBGVTOBH[HFXWHBLPPHGLDWH
3ULQWLQJFRQYHQWLRQV
LVFBGVTOBH[HFBLPPHG
6\QWD[FRQYHQWLRQV
LVFBGVTOBIHWFK
LVFBGVTOBIUHHBVWDWHPHQW Appendix B Data Structures
'64/BFORVH $UUD\GHVFULSWRU
'64/BGURS 'DWDW\SHVIRUDUUD\GHVFULSWRUV
LVFBGVTOBSUHSDUH %OREGHVFULSWRU
LVFBGVTOBVHWBFXUVRUBQDPH &KDUDFWHUVHWV
LVFBGVTOBVTOBLQIR %ORELQIRUPDWLRQEXIIHUV
LVFBHQFRGHBGDWH ,WHPOLVWEXIIHU
LVFBHYHQWBEORFN 5HVXOWEXIIHU
LVFBHYHQWBFRXQWV %OREEXIIHULWHPV
LVFBH[SDQGBGSE %ORESDUDPHWHUEXIIHU
LVFBJHWBVHJPHQW 'DWDEDVHLQIRUPDWLRQUHTXHVWEXIIHUDQG
LVFBLQWHUSUHWH UHVXOWEXIIHU
LVFBPRGLI\BXVHU 5HTXHVWEXIIHU
LVFBRSHQBEORE 5HVXOWEXIIHU
viii INTERBASE 5
List of Tables
API GUIDE ix
7DEOH GHILQHVIRUVWDWXVYHFWRUQXPHULFGHVFULSWRUV
7DEOH $3,HYHQWIXQFWLRQV
7DEOH $UUD\IXQFWLRQV
7DEOH %OREIXQFWLRQV
7DEOH 'DWDEDVHIXQFWLRQV
7DEOH 'DWHDQGFRQYHUVLRQIXQFWLRQV
7DEOH '64/IXQFWLRQV
7DEOH (UURUKDQGOLQJIXQFWLRQV
7DEOH (YHQWIXQFWLRQV
7DEOH ,QIRUPDWLRQIXQFWLRQV
7DEOH 6HFXULW\IXQFWLRQV
7DEOH 7UDQVDFWLRQFRQWUROIXQFWLRQV
7DEOH )XQFWLRQGHVFULSWLRQIRUPDW
7DEOH (UURUPHVVDJHVIRUXVHUVHFXULW\IXQFWLRQV
7DEOH 'DWDW\SHVIRUDUUD\GHVFULSWRUILHOGV
7DEOH 'DWDW\SHVIRUDUUD\GHVFULSWRUILHOGV
7DEOH 'DWDW\SHVIRUDUUD\GHVFULSWRUILHOGV
7DEOH %OREGHVFULSWRUILHOGV
7DEOH %OREGHVFULSWRUILHOGV
7DEOH (UURUPHVVDJHVIRUXVHUVHFXULW\IXQFWLRQV
7DEOH (UURUPHVVDJHVIRUXVHUVHFXULW\IXQFWLRQV
7DEOH 7UDQVDFWLRQLQIRUPDWLRQUHTXHVWLWHP
7DEOH 6WDWXVPHVVDJHUHWXUQLWHPV
7DEOH$ %RRNVLQWKH,QWHU%DVHGRFXPHQWDWLRQVHW
7DEOH$ 7H[WFRQYHQWLRQV
7DEOH$ 6\QWD[FRQYHQWLRQV
7DEOH% $UUD\GHVFULSWRUILHOGV
7DEOH% 'DWDW\SHVIRUDUUD\GHVFULSWRUV
7DEOH% %OREGHVFULSWRUILHOGV
7DEOH% %ORELQIRUPDWLRQLWHPVDQGUHWXUQYDOXHV
7DEOH% 6WDWXVPHVVDJHUHWXUQLWHPV
7DEOH% %ORESDUDPHWHUEXIIHUSDUDPHWHUW\SHV
7DEOH% 6WDWXVPHVVDJHUHWXUQLWHPV
7DEOH% 'DWDEDVHLQIRUPDWLRQLWHPVIRUGDWDEDVHFKDUDFWHULVWLFV
7DEOH% 'DWDEDVHLQIRUPDWLRQLWHPVIRUHQYLURQPHQWDOFKDUDFWHULVWLFV
7DEOH% 'DWDEDVHLQIRUPDWLRQLWHPVIRUSHUIRUPDQFHVWDWLVWLFV
x INTERBASE 5
7DEOH% 'DWDEDVHLQIRUPDWLRQLWHPVIRURSHUDWLRQFRXQWV
7DEOH% '3%SDUDPHWHUV
7DEOH% $OSKDEHWLFDOOLVWRI'3%SDUDPHWHUV
7DEOH% 64/GDWDW\SHVPDFURH[SUHVVLRQVDQG&GDWDW\SHV
7DEOH% ,QWHUSUHWDWLRQRIVWDWXVYHFWRUFOXVWHUV
7DEOH% GHILQHVIRUVWDWXVYHFWRUQXPHULFGHVFULSWRUV
7DEOH% 73%FRQVWDQWV
7DEOH% ;64/'$ILHOGGHVFULSWLRQV
7DEOH% ;64/9$5ILHOGGHVFULSWLRQV
API GUIDE xi
CHAPTER
1
CHAPTER 1 USING THE API GUIDE
Chapter Description
Chapter 2, “Application Requirements” Describes support structures and elements common to programming with
API calls
Chapter 3, “Programming with the InterBase API” Describes special requirements for programming InterBase applications
with the InterBase API
Chapter 4, “Working with Databases” Describes how to attach to and detach from databases, and how to request
information about attachments
Chapter 5, “Working with Transactions” Explains how to start transactions in different modes, and how to commit
them or roll them back
Chapter 6, “Working with Dynamic SQL” Describes how to process DSQL data definition and data manipulation
statements using API calls
Chapter 7, “Working with Blob Data” Describes how to select, insert, update, and delete Blob data in applications
Chapter 8, “Working with Array Data” Describes how to select, insert, update, and delete array data in applications
Chapter 9, “Working with Conversions” Describes how to select, insert, update, and delete DATE data in
applications, and how to reverse the byte order of numbers with
isc_vax_integer()
Chapter 10, “Handling Error Conditions” Describes how to trap and handle database errors in applications
Chapter 11, “Working with Events” Explains how triggers interact with applications and describes how to
register interest in events, wait on them, and respond to them in
applications
TABLE 1.1 API Guide chapters
2 INTERBASE 5
SAMPLE DATABASE AND APPLICATIONS
Chapter Description
Chapter 12, “API Function Reference” Describes the syntax of each function call in detail.
Appendix A, “InterBase Document Conventions” Lists typefaces and special characters used in this book to describe syntax
and identify object types.
Appendix B, “Data Structures” Lists and describes the data structures, constants, and buffers that are
defined in ibase.h.
TABLE 1.1 API Guide chapters (continued)
API GUIDE 3
PART I
API PartI
User’s
Guide
3DUW,$3,8VHU·V*XLGH
CHAPTER
Application Requirements
Chapter2
2
7KLVFKDSWHUVXPPDUL]HVSURJUDPPLQJUHTXLUHPHQWVIRUXVLQJFDWHJRULHVRI$3,IXQFWLRQV
LQGDWDEDVHDSSOLFDWLRQVDQGSURYLGHVFURVVUHIHUHQFHVWRPRUHGHWDLOHGLQIRUPDWLRQLQODWHU
FKDSWHUV
$OO$3,DSSOLFDWLRQVPXVWXVHFHUWDLQ$3,IXQFWLRQVDQGVXSSRUWVWUXFWXUHV)RUH[DPSOHDOO
DSSOLFDWLRQVFRQQHFWWRDWOHDVWRQHGDWDEDVHDQGUXQDWOHDVWRQHWUDQVDFWLRQ$OO
DSSOLFDWLRQVWKHUHIRUHPXVWGHFODUHDQGLQLWLDOL]HGDWDEDVHKDQGOHVDQGWUDQVDFWLRQKDQGOHV
7KH\PD\DOVRQHHGWRGHFODUHDQGSRSXODWHGDWDEDVHSDUDPHWHUEXIIHUV '3%V DQG
WUDQVDFWLRQSDUDPHWHUEXIIHUV 73%V 7KLVFKDSWHURXWOLQHVWKRVHUHTXLUHPHQWVDQGSRLQWV
\RXWRPRUHGHWDLOHGLQIRUPDWLRQODWHULQWKLVERRN
6RPH$3,DSSOLFDWLRQVPD\XVHVSHFLILF$3,IXQFWLRQVVXFKDVWKHIXQFWLRQVWKDWSHUPLWDQ
DSSOLFDWLRQWRSURFHVVG\QDPLF64/ '64/ VWDWHPHQWV7KHVHDSSOLFDWLRQVKDYHDGGLWLRQDO
UHTXLUHPHQWVWKDWDUHDOVRRXWOLQHGLQWKLVFKDSWHUDORQJZLWKSRLQWHUVWRPRUHGHWDLOHG
LQIRUPDWLRQHOVHZKHUHLQWKLVERRN
7
CHAPTER 2 APPLICATION REQUIREMENTS
Including ibase.h
7KH,QWHU%DVHVXEGLUHFWRU\LQFOXGHFRQWDLQVWKHLEDVHKKHDGHUILOHZKLFKVKRXOGEHLQFOXGHG
LQDOOVRXUFHFRGHPRGXOHVIRU$3,DSSOLFDWLRQVLEDVHKFRQWDLQV$3,IXQFWLRQSURWRW\SHV,W
DOVRFRQWDLQVVWUXFWXUHW\SHGHIVSDUDPHWHUGHILQLWLRQVDQGPDFURVUHTXLUHGE\YDULRXV$3,
IXQFWLRQV
7RLQFOXGHLEDVHKLQDVRXUFHFRGHPRGXOHLQVHUWWKHIROORZLQJLQFOXGHQHDUWKHVWDUWRIWKH
VRXUFHFRGH
#include <ibase.h>
,ILEDVHKLVQRWRQ\RXUFRPSLOHU·VVHDUFKSDWK\RXPD\QHHGWRSURYLGHDIXOOSDWK
VSHFLILFDWLRQDQGHQFORVHWKHILOHQDPHLQTXRWDWLRQPDUNV
)DLOXUHWRLQFOXGHLEDVHKFDQSUHYHQWWKHVXFFHVVIXOFRPSLODWLRQDQGOLQNLQJRIDQDSSOLFDWLRQ
Database requirements
$OODSSOLFDWLRQVWKDWZRUNZLWKGDWDEDVHVPXVWSURYLGHRQHGDWDEDVHKDQGOHIRUHDFKGDWDEDVH
WREHDFFHVVHG$GDWDEDVHKDQGOHLVDORQJSRLQWHUWKDWLVXVHGLQ$3,IXQFWLRQVWRDWWDFKWRD
GDWDEDVHDQGWRUHIHUHQFHLWLQVXEVHTXHQW$3,FDOOV7KH,QWHU%DVHKHDGHUILOHLEDVHK
FRQWDLQVDGHILQHXVHIXOIRUGHFODULQJGDWDEDVHKDQGOHV
:KHQHVWDEOLVKLQJDFRQQHFWLRQWRDGDWDEDVHRSWLRQDOGDWDEDVHDWWDFKPHQWFKDUDFWHULVWLFV
VXFKDVDXVHUQDPHDQGSDVVZRUGFRPELQDWLRQFDQEHSDVVHGWRWKHDWWDFKPHQWWKURXJKD
GDWDEDVHSDUDPHWHUEXIIHU '3% 8VXDOO\RQH'3%LVVHWXSIRUHDFKGDWDEDVHDWWDFKPHQW
DOWKRXJKGDWDEDVHDWWDFKPHQWVFDQDOVRVKDUHD'3%
4 'HFODULQJGDWDEDVHKDQGOHV
$GDWDEDVHKDQGOHPXVWEHGHFODUHGDQGLQLWLDOL]HGWR]HUREHIRUHXVH7KHIROORZLQJFRGH
LOOXVWUDWHVKRZWRGHFODUHDQGLQLWLDOL]HDGDWDEDVHKDQGOH
#include <ibase.h>
8 INTERBASE 5
REQUIREMENTS FOR ALL APPLICATIONS
. . .
/* Declare a database handle. */
isc_db_handle db1;
. . .
/* Initialize the handle. */
db1 = 0L;
)RUPRUHLQIRUPDWLRQDERXWGHFODULQJLQLWLDOL]LQJDQGXVLQJGDWDEDVHKDQGOHVVHH&KDSWHU
´:RUNLQJZLWK'DWDEDVHVµ
4 6HWWLQJXSD'3%
$'3%LVDE\WHDUUD\GHVFULELQJRSWLRQDOGDWDEDVHDWWDFKPHQWFKDUDFWHULVWLFV$'3%PXVW
EHVHWXSDQGSRSXODWHGEHIRUHDWWDFKLQJWRDGDWDEDVH3DUDPHWHUVWKDWFDQEHSDVVHGWRWKH
'3%DUHGHILQHGLQLEDVHK
)RUPRUHLQIRUPDWLRQDERXWVHWWLQJXSSRSXODWLQJDQGXVLQJD'3%VHH&KDSWHU
´:RUNLQJZLWK'DWDEDVHVµ
Transaction requirements
$OODSSOLFDWLRQVPXVWSURYLGHRQHWUDQVDFWLRQKDQGOHIRUHDFKWUDQVDFWLRQWREHDFFHVVHG$
WUDQVDFWLRQKDQGOHLVDORQJSRLQWHUWKDWLVXVHGLQ$3,IXQFWLRQVWRVWDUWDWUDQVDFWLRQDQGWR
UHIHUHQFHLWLQVXEVHTXHQW$3,FDOOV7KH,QWHU%DVHKHDGHUILOHLEDVHKFRQWDLQVDGHILQH
XVHIXOIRUGHFODULQJWUDQVDFWLRQKDQGOHV
:KHQVWDUWLQJDWUDQVDFWLRQRSWLRQDOWUDQVDFWLRQFKDUDFWHULVWLFVVXFKDVDFFHVVPHWKRGDQG
LVRODWLRQOHYHOFDQEHSDVVHGWRWKHVWDUWXSFDOOWKURXJKDWUDQVDFWLRQSDUDPHWHUEXIIHU
73% 8VXDOO\RQH73%LVVHWXSIRUHDFKWUDQVDFWLRQDOWKRXJKWUDQVDFWLRQVZLWKWKHVDPH
RSHUDWLQJFKDUDFWHULVWLFVFDQDOVRVKDUHD73%
4 'HFODULQJWUDQVDFWLRQKDQGOHV
$WUDQVDFWLRQKDQGOHPXVWEHGHFODUHGDQGLQLWLDOL]HGWR]HUREHIRUHXVH7KHIROORZLQJFRGH
LOOXVWUDWHVKRZWRGHFODUHDQGLQLWLDOL]HDWUDQVDFWLRQKDQGOH
#include "ibase.h"
. . .
/* Declare a transaction handle. */
isc_tr_handle tr1;
. . .
/* Initialize the handle. */
tr1 = 0L;
API GUIDE 9
CHAPTER 2 APPLICATION REQUIREMENTS
)RUPRUHLQIRUPDWLRQDERXWGHFODULQJLQLWLDOL]LQJDQGXVLQJWUDQVDFWLRQKDQGOHVVHH&KDSWHU
´:RUNLQJZLWK7UDQVDFWLRQVµ
4 6HWWLQJXSD73%
$73%LVDE\WHDUUD\FRQWDLQLQJSDUDPHWHUVWKDWGHVFULEHRSWLRQDOWUDQVDFWLRQFKDUDFWHULVWLFV
,QWKHVHFDVHVWKH73%PXVWEHVHWXSDQGSRSXODWHGEHIRUHVWDUWLQJDWUDQVDFWLRQ
3DUDPHWHUVWKDWFDQEHSDVVHGWRWKH73%DUHGHILQHGLQLEDVHK
)RUPRUHLQIRUPDWLRQDERXWVHWWLQJXSSRSXODWLQJDQGXVLQJD73%VHH&KDSWHU
´:RUNLQJZLWK7UDQVDFWLRQVµ
Additional requirements
7KHIROORZLQJVHFWLRQVRXWOLQHSRVVLEOHDGGLWLRQDOUHTXLUHPHQWVIRU$3,DSSOLFDWLRQV
GHYHORSHGRQFHUWDLQV\VWHPSODWIRUPVVXFKDV0LFURVRIW:LQGRZVDQGIRUJHQHUDOFODVVHV
RI$3,IXQFWLRQVVXFKDVWKRVHWKDWSURFHVV'64/VWDWHPHQWV
)RUH[DPSOHWKHisc_attach_database()SURWRW\SHLQLEDVHKLV
ISC_STATUS ISC_EXPORT isc_attach_database(
ISC_STATUS ISC_FAR *,
short,
char ISC_FAR,
isc_db_handle ISC FAR *,
short,
char ISC_FAR *);
:KHQ:LQGRZVFOLHQWDSSOLFDWLRQVPDNHFDOOVDQGFDVW&GDWDW\SHVWKH\VKRXOGPDNHH[SOLFLW
XVHRIWKH,6&B)$5GHFODUDWLRQ
Note 7KH,6&B(;3257NH\ZRUGLVRPLWWHGIURPWKH$3,IXQFWLRQUHIHUHQFHEHFDXVHRQDOO
QRQ:LQGRZVSODWIRUPVLWLVXQGHILQHG
10 INTERBASE 5
ADDITIONAL REQUIREMENTS
)RUPRUHLQIRUPDWLRQDERXW:LQGRZVUHTXLUHPHQWVVHH&KDSWHU´3URJUDPPLQJZLWK
WKH ,QWHU%DVH $3,µ
DSQL requirements
$3,DSSOLFDWLRQVWKDWEXLOGRUSURPSWIRU'64/TXHULHVDWUXQWLPHUHTXLUHFDUHIXO
GHFODUDWLRQLQLWLDOL]DWLRQDQGSRSXODWLRQRIH[WHQGHG64/GHVFULSWRUDUHD ;64/'$
VWUXFWXUHVIRUGDWDWUDQVIHUWRDQGIURPWKHGDWDEDVH,QDGGLWLRQPDQ\$3,IXQFWLRQVVXFK
DVisc_dsql_allocate_statement()DQGisc_dsql_describe()DOVRPDNHXVHRIVWDWHPHQW
KDQGOHVIRU'64/SURFHVVLQJ
LEDVHKSURYLGHVW\SHGHIVIRUWKH;64/'$VWUXFWXUHDQGLWVXQGHUO\LQJVWUXFWXUHWKH
;64/9$5,WDOVRSURYLGHVDGHILQHIRUWKHVWDWHPHQWKDQGOHDPDFURIRUDOORFDWLQJWKH
DSSURSULDWHDPRXQWRIVSDFHIRUDQLQVWDQFHRIDQ;64/'$LQDQDSSOLFDWLRQDQGGHILQHV
IRU'64/LQIRUPDWLRQSDUDPHWHUVSDVVHGWRisc_dsql_sql_info()
7KHIROORZLQJFRGHLOOXVWUDWHVKRZWRGHFODUHDQ;64/'$VWUXFWXUHIRUXVHLQDQDSSOLFDWLRQ
DQGKRZWRGHFODUHDVWDWHPHQWKDQGOH
#include <ibase.h>
. . .
XSQLDA *insqlda;
isc_stmt_handle sql_stmt;
. . .
)RUPRUHLQIRUPDWLRQDERXW'64/SURJUDPPLQJZLWKWKH$3,VHH&KDSWHU´:RUNLQJ
ZLWK'\QDPLF64/µ
Blob requirements
7RZRUNZLWK%OREGDWDWKDWPXVWEHILOWHUHGDQ$3,DSSOLFDWLRQPXVWVHWXSD%ORE
SDUDPHWHUEXIIHU %3% IRUHDFK%ORE$%3%LVDYDULDEOHOHQJWKE\WHYHFWRUGHFODUHGLQDQ
DSSOLFDWLRQWRVWRUHFRQWUROLQIRUPDWLRQWKDWGLFWDWHV%OREDFFHVV7KH%3%FDQFRQWDLQD
QXPEHURIFRQVWDQWVGHILQHGLQLEDVHKWKDWGHVFULEHWKH%OREDQGWKH%OREVXEW\SHVWKDW
VSHFLI\%OREILOWHULQJ
,03257$17 %OREILOWHULQJLVQRWDYDLODEOHRQ1HW:DUHVHUYHUV
$SSOLFDWLRQVWKDWZRUNZLWK%OREGDWDLQDQLQWHUQDWLRQDOHQYLURQPHQWPXVWDOVRGHFODUHDQG
SRSXODWHD%OREGHVFULSWRUWKDWFRQWDLQVFKDUDFWHUVHWLQIRUPDWLRQIRUWKH%ORE7KH%ORE
GHVFULSWRUVWUXFWXUHLVGHILQHGLQLEDVHK7RGHFODUHD%OREGHVFULSWRUDQDSSOLFDWLRQPXVW
SURYLGHFRGHOLNHWKLV
API GUIDE 11
CHAPTER 2 APPLICATION REQUIREMENTS
#include <ibase.h>
. . .
ISC_BLOB_DESC to_desc;
([FHSWRQ1HW:DUHVHUYHUVZKHUHWKH\DUHQRWVXSSRUWHG%OREILOWHUVHQDEOHD%OREWREH
WUDQVODWHGIURPRQHIRUPDWWRDQRWKHUVXFKDVIURPDFRPSUHVVHGVWDWHWRDQGHFRPSUHVVHG
VWDWHRUYLFHYHUVD,I%OREILOWHUVDUHGHVLUHGVHSDUDWHILOWHUIXQFWLRQVPXVWEHFUHDWHGDQG
GHILQHGWRWKHGDWDEDVHWRHQVXUHWKHLUXVHZKHQ%OREGDWDLVDFFHVVHG
)LQDOO\WRDFFHVV%OREGDWDDSSOLFDWLRQVPXVWPDNHH[WHQVLYHXVHRI$3,'64/IXQFWLRQV
)RUPRUHLQIRUPDWLRQDERXWZRUNLQJZLWK%OREGDWDDQG%OREILOWHUVVHH
&KDSWHU´:RUNLQJZLWK%ORE'DWDµ)RUPRUHLQIRUPDWLRQDERXW'64/VHH&KDSWHU
´:RUNLQJZLWK'\QDPLF64/µ
Array requirements
$3,IXQFWLRQVWKDWKDQGOHDUUD\SURFHVVLQJUHTXLUHWKHXVHRIDQDUUD\GHVFULSWRUVWUXFWXUH
DQGDUUD\,'VGHILQHGLQLEDVHK,QDGGLWLRQDSSOLFDWLRQVDFFHVVLQJDUUD\VPXVWPDNH
H[WHQVLYHXVHRI$3,'64/IXQFWLRQV
7KHIROORZLQJFRGHLOOXVWUDWHVKRZWRGHFODUHDQDUUD\GHVFULSWRUDQGDUUD\,'YDULDEOHDQG
KRZWRLQLWLDOL]HDQDUUD\,'WR]HUREHIRUHXVH
#include <ibase.h>
. . .
ISC_ARRAY_DESC desc;
ISC_QUAD array_id;
. . .
array_id = 0L;
. . .
)RUPRUHLQIRUPDWLRQDERXWZRUNLQJZLWKDUUD\VVHH&KDSWHU´:RUNLQJZLWK$UUD\
'DWDµ)RUPRUHLQIRUPDWLRQDERXW'64/VHH&KDSWHU´:RUNLQJZLWK'\QDPLF64/µ
Event requirements
,QWHU%DVHHYHQWVDUHPHVVDJHVSDVVHGIURPDWULJJHURUVWRUHGSURFHGXUHWRDQDSSOLFDWLRQWR
DQQRXQFHWKHRFFXUUHQFHRIVSHFLILHGFRQGLWLRQVRUDFWLRQVXVXDOO\GDWDEDVHFKDQJHVVXFKDV
LQVHUWLRQVPRGLILFDWLRQVRUGHOHWLRQVRIUHFRUGV
12 INTERBASE 5
COMPILING AND LINKING
%HIRUHDQDSSOLFDWLRQFDQUHVSRQGWRDQHYHQWLWPXVWUHJLVWHULQWHUHVWLQDQHYHQW7RUHJLVWHU
LQWHUHVWLQDQHYHQWWKHDSSOLFDWLRQPXVWHVWDEOLVKDQGSRSXODWHWZRHYHQWSDUDPHWHUEXIIHUV
(3%V RQHIRUKROGLQJWKHLQLWLDORFFXUUHQFHFRXQWYDOXHVIRUHDFKHYHQWRILQWHUHVWDQG
DQRWKHUIRUKROGLQJWKHFKDQJHGRFFXUUHQFHFRXQWYDOXHV7KHVHEXIIHUVDUHSDVVHGDV
SDUDPHWHUVWRVHYHUDO$3,HYHQWIXQFWLRQVDQGDUHXVHGWRGHWHUPLQHZKLFKHYHQWVKDYH
RFFXUUHG
,Q&HDFK(3%LVGHFODUHGDVDFKDUSRLQWHUDVIROORZV
char *event_buffer, *result_buffer;
2QFHWKHEXIIHUVDUHGHFODUHGisc_event_block()LVFDOOHGWRDOORFDWHVSDFHIRUWKHPDQGWR
SRSXODWHWKHPZLWKVWDUWLQJYDOXHV
)RUPRUHLQIRUPDWLRQDERXWHYHQWVVHH&KDSWHU´:RUNLQJZLWK(YHQWVµ
Error-handling requirements
0RVW$3,IXQFWLRQVUHWXUQVWDWXVLQIRUPDWLRQLQDQHUURUVWDWXVYHFWRUDQDUUD\RIORQJV7R
KDQGOH,QWHU%DVHHUURUFRQGLWLRQVVKRXOGWKH\DULVHDSSOLFDWLRQVVKRXOGGHFODUHDVWDWXV
YHFWRUDVIROORZV
#include <ibase.h>
. . .
ISC_STATUS status_vector[20];
,6&B67$786LVDGHILQHLQLEDVHKSURYLGHGIRUSURJUDPPLQJFRQYHQLHQFHDQGSODWIRUP
LQGHSHQGHQFH
LEDVHKDOVRFRQWDLQVGHILQHVIRUDOO,QWHU%DVHHUURUFRQGLWLRQV$SSOLFDWLRQVFDQXVH$3,
HUURUKDQGOLQJIXQFWLRQVWRFRQVWUXFWHUURUPHVVDJHVIURPWKHVWDWXVYHFWRUWKDWDUHEDVHG
RQWKHVHHUURUFRQGLWLRQVRUFDQH[DPLQHWKHVWDWXVYHFWRUGLUHFWO\IRUSDUWLFXODUHUURU
FRQGLWLRQVXVLQJWKHGHILQHVLQSODFHRIHUURUQXPEHUV8VLQJGHILQHVLQWKLVPDQQHU
PDNHVVRXUFHFRGHHDVLHUWRXQGHUVWDQGDQGPDLQWDLQ
)RUPRUHLQIRUPDWLRQDERXWHUURUKDQGOLQJVHH&KDSWHU´:RUNLQJZLWK(YHQWVµ
API GUIDE 13
CHAPTER 2 APPLICATION REQUIREMENTS
2QPRVWSODWIRUPV,QWHU%DVHVXSSRUWVG\QDPLFOLQNLQJRILWVOLEUDU\DWUXQWLPH
2QHH[FHSWLRQWRWKLVVFHQDULRLVRQ0LFURVRIW:LQGRZVZKHUHDQDSSOLFDWLRQPXVWH[SOLFLWO\
OLQNWRWKH,QWHU%DVHOLEUDU\ JGVOLERUJGVBPVOLE
2Q0LFURVRIW:LQGRZVWKHUHDUHSDUWLFXODUFRPSLOLQJRSWLRQVWREHDZDUHRI)RUPRUH
LQIRUPDWLRQDERXWOLQNLQJXQGHU:LQGRZVVHH&KDSWHU´3URJUDPPLQJZLWK
WKH ,QWHU%DVH $3,µ
)RUDOORWKHUSODWIRUPVVHHWKH,QWHU%DVH3URJUDPPHU·V*XLGHIRUVSHFLILFFRPSLOLQJDQGOLQNLQJ
JXLGHOLQHV
14 INTERBASE 5
CHAPTER
Programming with
Chapter3
3
the InterBase API
7KLVFKDSWHUSURYLGHVLQIRUPDWLRQVSHFLILFWRSURJUDPPLQJ,QWHU%DVHDSSOLFDWLRQVRQD
FOLHQWZLWK&&,WDVVXPHVIDPLOLDULW\ZLWK%RUODQG&&RU0LFURVRIW&&
,QWHU%DVHDQGWKH,QWHU%DVHGRFXPHQWDWLRQVHWSDUWLFXODUO\WKH/DQJXDJH5HIHUHQFH
15
CHAPTER 3 PROGRAMMING WITH THE INTERBASE API
16 INTERBASE 5
SPECIFYING USER NAME AND PASSWORD
7KH,6&B86(5DQG,6&B3$66:25'HQYLURQPHQWYDULDEOHVDUHXVHGWRJHWKHUWRHVWDEOLVKD
YDOLGXVHUQDPHDQGSDVVZRUGFRPELQDWLRQWRSDVVWRWKHUHPRWH,QWHU%DVHGDWDEDVHVHUYHU
,03257$17 'RQRWXVHWKH,6&B3$66:25'HQYLURQPHQWYDULDEOHZKHQVHFXULW\LVDFRQFHUQ$Q\RQH
ZLWKDFFHVVWRDFOLHQWZKHUHDQ,6&B3$66:25'HQYLURQPHQWYDULDEOHLVGHILQHGLQDILOH
VXFKDVDXWRH[HFEDWFDQHDVLO\YLHZWKHSDVVZRUG
API GUIDE 17
CHAPTER 3 PROGRAMMING WITH THE INTERBASE API
Datatypes
,QWHU%DVHVXSSRUWVDZLGHYDULHW\RIGDWDW\SHVIRUDSSOLFDWLRQGHYHORSPHQW7KHVHGDWDW\SHV
DUHGHILQHGLQDW\SHGHIWREHSODWIRUPLQGHSHQGHQW7KH,QWHU%DVHFOLHQWOLEUDULHVDUHDOVR
FRPSLOHGZLWKSDFNHGGDWDVWUXFWXUHVWREHFRPSDWLEOHZLWKDYDULHW\RISODWIRUPV
)RUPRUHLQIRUPDWLRQDERXW,QWHU%DVHGDWDW\SHVVHHWKH/DQJXDJH5HIHUHQFH
Calling conventions
&RQYHQWLRQVIRUFDOOLQJIXQFWLRQVYDU\IURPSODWIRUPWRSODWIRUP6SHFLILFDOO\
g 2Q81,;SODWIRUPVXVHWKH&FDOOLQJFRQYHQWLRQV FGHFO LQDOOFDVHV
g 2Q:LQGRZVDQG:LQGRZV17XVHWKHVWDQGDUGFDOOLQJFRQYHQWLRQV BVWGFDOO IRUDOO
IXQFWLRQVWKDWKDYHDIL[HGQXPEHURIDUJXPHQWV7KHUHDUHRQO\WKUHHIXQFWLRQVWKDWKDYHD
YDULDEOHQXPEHURIDUJXPHQWV)RUWKHVHWKUHH³isc_start_transaction(),
isc_expand_dpb()DQGisc_event_block()³XVHWKHFGHFOFRQYHQWLRQV
18 INTERBASE 5
BUILDING APPLICATIONS
Building applications
7KLVVHFWLRQGLVFXVVHVFRPSLOHUVDQGOLEUDULHVWKDWDUHQHHGHGWREXLOG,QWHU%DVHDSSOLFDWLRQV
HELP WITH LINKING AND COMPILING 2QHDFKSODWIRUPWKHUHLVDPDNHILOHLQWKHH[DPSOHV
GLUHFWRU\WKDWFRQWDLQVGHWDLOHGSODWIRUPVSHFLILFLQIRUPDWLRQDERXWOLQNLQJDQGFRPSLOLQJ
2SHQWKHPDNHILOHLQDWH[WHGLWRUWRDFFHVVWKHLQIRUPDWLRQ
Compilers
7KHLPSRUWOLEUDULHVLQFOXGHGZLWK,QWHU%DVHKDYHEHHQWHVWHGZLWKWKHIROORZLQJFRPSLOHUV
Windows platforms
g %RUODQG&
g 0LFURVRIW9LVXDO&
g 0LFURVRIW9LVXDO&
Solaris
g & 63$5&:RUNV6&&FRPSLOHU
g & 63$5&:RUNV6&&FRPSLOHU
g &2%2/ 0LFUR)RFXV&RERO
g $'$ 63$5&:RUNV6&$GDFRPSLOHU
g )2575$1 63$5&:RUNV6&)RUWUDQFRPSLOHU
HP-UX
g & +3&+38;9HUVLRQ$
g & +3&+38;9HUVLRQ$
g &2%2/ 0LFUR)RFXV&RERO
g $'$ $OV\V$GD$GD:RUOG9
g )2575$1 +3)RUWUDQ5HOHDVH
API GUIDE 19
CHAPTER 3 PROGRAMMING WITH THE INTERBASE API
Linking
7KH,QWHU%DVHOLEUDU\ILOHVUHVLGHLQWKHOLEVXEGLUHFWRU\RIWKHLQVWDOODWLRQGLUHFWRU\
$SSOLFDWLRQVPXVWOLQNZLWKWKH,QWHU%DVHFOLHQWOLEUDU\7KLVOLEUDU\QDPHYDULHVGHSHQGLQJ
RQWKHSODWIRUPDQGWKHFRPSLOHU
%RUODQGFRPSLOHUVHDUOLHUWKDQGRQRWZRUNZLWKJGVOLE
Include files
$SSOLFDWLRQVPXVWLQFOXGHWKHLEDVHKKHDGHUILOHWRSLFNXSWKH,QWHU%DVHW\SHGHILQLWLRQVDQG
IXQFWLRQSURWRW\SHV7KLVILOHLVLQWKHLQFOXGHVXEGLUHFWRU\RIWKH,QWHU%DVHLQVWDOOGLUHFWRU\
2Q81,;SODWIRUPVWKHJGVKILOHLVDYDLODEOHLQWKHLQVWDOODWLRQGLUHFWRU\IRUEDFNZDUG
FRPSDWLELOLW\
Option Action
c Compile without linking (DLLs only)
Zi Generate complete debugging information
DWIN32 Defines “WIN32” to be the null string
D_MT Use a multi-thread, statically-linked library
TABLE 3.3 Microsoft C compiler options
20 INTERBASE 5
BUILDING APPLICATIONS
)RUH[DPSOHWKHVHFRPPDQGVXVHWKH0LFURVRIWFRPSLOHUWREXLOGD'//WKDWXVHV
,QWHU%DVH
cl -c -Zi -DWIN32 -D_MT -LD udf.c
lib -out:udf.lib -def:funclib.def -machine:i386 -subsystem:console
link -DLL -out:funclib.dll -DEBUG:full,mapped -DEBUGTYPE:CV
-machine:i386 -entry:_DllMainCRTStartup@12 -subsystem:console
-verbose udf.obj udf.exp gds32.lib crtdll.lib
7KLVFRPPDQGEXLOGVDQ,QWHU%DVHH[HFXWDEOHXVLQJWKH0LFURVRIWFRPSLOHU
cl -Zi -DWIN32 -D_MT -MD udftest.c udf.lib gds32.lib crtdll.lib
Option Action
v Turns on source debugging
a4 Structure padding/byte alignment
DWIN32 Defines the string “WIN32”; with no argument, it defines it to the null string
tWM Makes the target multi-threaded
tWC: Makes the target a console .EXE with all functions exportable; cannot be used with
the -tWCD option
tWCD Makes the target a console .DLL with all functions exportable; cannot be used with
the -tWC option
TABLE 3.4 Borland C compiler options
)RUH[DPSOHWKLVFRPPDQGFUHDWHVD'//QDPHGIXQFOLEGOOIURPDVRXUFHILOHQDPHGXGIF
API GUIDE 21
CHAPTER 3 PROGRAMMING WITH THE INTERBASE API
7KHIROORZLQJFRPPDQGVFUHDWHDQ,QWHU%DVHH[HFXWDEOHQDPHGXGIWHVWH[H ZKLFKFDOOVLQWR
IXQFOLEGOO IURPDVRXUFHILOHQDPHGXGIWHVWHFRQWDLQLQJHPEHGGHG64/FRPPDQGV
implib udf.lib funclib.dll
gpre -e udftest.e
bcc32 -v -a4 -DWIN32 -tWM -tWC udftest.c udf.lib mygds32.lib
:KHQOLQNLQJDSSOLFDWLRQVZLWK%RUODQG&FRPPDQGOLQHOLQNHUXVHWKHFRSWLRQ FDVH
VHQVLWLYHOLQN
Note 7KHUHDUHHTXLYDOHQWJHQHUDOOLQNHURSWLRQVZLWKLQWKH%RUODQG,QWHJUDWHG
'HYHORSPHQW(QYLURQPHQW ,'( 7KHGHIDXOWLQWKH,'(LVFDVHVHQVLWLYHOLQN FRSWLRQ
DORQHZKLFKFDXVHVXQUHVROYHGOLQNHUHUURUVIRUDOORIWKH,QWHU%DVHHQWU\SRLQWV
8VHWKHIROORZLQJRSWLRQVZKHQFRPSLOLQJDSSOLFDWLRQVZLWK%RUODQG&&
4 ,'(GHIDXOW
7KHFDVHVHQVLWLYHOLQN FRSWLRQ LVWKHGHIDXOWLQWKH,'(
4 ,'(3URMHFW2SWLRQVGLDORJER[
&KRRVHWKHIROORZLQJRSWLRQVIURPWKH,'(3URMHFW2SWLRQVGLDORJER[7KHFRUUHVSRQGLQJ
FRPPDQGOLQHRSWLRQLVDOVROLVWHG
DIRECTORIES
,QFOXGHGLUHFWRU\F?3URJUDP)LOHV?,QWHU%DVH&RUS?,QWHU%DVH?LQFOXGH
/LEUDU\GLUHFWRU\F?3URJUDP)LOHV?,QWHU%DVH&RUS?,QWHU%DVH?OLE
Note 7KLVSDWKVSHFLILFDWLRQDVVXPHVWKDW,QWHU%DVHZDVLQVWDOOHGLQWKH
F?3URJUDP )LOHV?,QWHU%DVH&RUS?,QWHU%DVHGLUHFWRU\
COMPILER
6RXUFHODQJXDJHFRPSOLDQFH%RUODQGH[WHQVLRQV
ELW&RPSLOHU
22 INTERBASE 5
BUILDING APPLICATIONS
'DWDDOLJQPHQW%\WH DRSWLRQIRUE\WHDOLJQPHQW
LINKER
&KRRVH&DVHVHQVLWLYHOLQN21 FRSWLRQ
Example programs
([DPSOHSURJUDPVGHPRQVWUDWLQJKRZWRXVHWKH,QWHU%DVH$3,DUHLQFOXGHGLQWKHH[DPSOHV
VXEGLUHFWRU\RIWKH,QWHU%DVHLQVWDOODWLRQGLUHFWRU\7KHUHLVDOVRDVDPSOH GHIILOH
2Q17WKHUHDUHWZRPDNHILOHVPDNHILOHEFIRUWKH%RUODQGFRPSLOHUDQGOLQNHUDQG
PDNHILOHPVFIRUWKH0LFURVRIWFRPSLOHUDQGOLQNHU,QERWKILOHV\RXPXVWPRGLI\WKH,%$6(
HQYLURQPHQWYDULDEOHWRSRLQWWRDQDEVROXWHSDWK
,QWKH EFPDNHILOHPRGLI\WKH%&',5YDULDEOHWRSRLQWWRWKHDEVROXWHSDWKWRWKH%RUODQG
FRPSLOHUDQGOLQNHU
,QWKH PVFPDNHILOHPRGLI\WKH06&',5YDULDEOHWRSRLQWWRWKHDEVROXWHSDWKWRWKH
0LFURVRIWFRPSLOHUDQGOLQNHU
7REXLOGWKHH[DPSOHDSSOLFDWLRQVRQ17XVLQJ%RUODQG&XVHWKHIROORZLQJFRPPDQG
make -B -f makefile.bc all
7REXLOGWKHH[DPSOHDSSOLFDWLRQVXVLQJ0LFURVRIW&XVHWKLVFRPPDQG
nmake -B -f makefile.msc all
API GUIDE 23
CHAPTER 3 PROGRAMMING WITH THE INTERBASE API
2Q81,;V\VWHPVWKHFRPPDQGWREXLOGWKHH[DPSOHDSSOLFDWLRQVLVDVIROORZV
make all
24 INTERBASE 5
CHAPTER
25
CHAPTER 4 WORKING WITH DATABASES
7KHIROORZLQJWDEOHOLVWVWKH$3,IXQFWLRQVIRUZRUNLQJZLWKGDWDEDVHV7KHIXQFWLRQVDUH
OLVWHGLQWKHRUGHUWKDWWKH\W\SLFDOO\DSSHDULQDQDSSOLFDWLRQ
Call Purpose
isc_expand_dpb() Specifies additional parameters for database access, such as user names and
passwords elicited from a user at run time; uses a previously declared and
populated DPB
isc_attach_database() Connects to a database and establishes initial parameters for database access,
such as number of cache buffers to use; uses a previously declared and
populated DPB
isc_database_info() Retrieves requested information about an attached database, such as the
version of the on-disk structure (ODS) that it uses
isc_detach_database() Disconnects from an attached database and frees system resources allocated
to that attachment
isc_drop_database() Deletes a database and any support files, such as shadow files
TABLE 4.1 API database functions
Connecting to databases
&RQQHFWLQJWRRQHRUPRUHGDWDEDVHVLVDIRXUVWHSSURFHVV
&UHDWLQJDQGLQLWLDOL]LQJDGDWDEDVHKDQGOHIRUHDFKGDWDEDVHWREHDWWDFKHG
&UHDWLQJDQGSRSXODWLQJD'3%IRUHDFKGDWDEDVHWREHDWWDFKHG
2SWLRQDOO\FDOOLQJisc_expand_dpb()SULRUWRDFWXDODWWDFKPHQWWRDGGPRUH
GDWDEDVHSDUDPHWHUVWRDSUHYLRXVO\FUHDWHGDQGSRSXODWHG'3%
&DOOLQJisc_attach_database()IRUHDFKGDWDEDVHWRZKLFKWRFRQQHFW
7KHVHVWHSVDUHGHVFULEHGLQWKHIROORZLQJVHFWLRQVRIWKLVFKDSWHU
26 INTERBASE 5
CONNECTING TO DATABASES
7RXVHWKLVW\SHGHIIRUGHFODULQJGDWDEDVHKDQGOHVLQDQDSSOLFDWLRQLQFOXGHLEDVHKLQHDFK
VRXUFHILOHPRGXOH
#include <ibase.h>
4 'HFODULQJGDWDEDVHKDQGOHV
7RHVWDEOLVKGDWDEDVHKDQGOHVIRUXVHGHFODUHDYDULDEOHRIW\SHLVFBGEBKDQGOHIRUHDFKGDWDEDVH
WKDWZLOOEHDFFHVVHGDWWKHVDPHWLPH7KHIROORZLQJFRGHGHFODUHVWZRKDQGOHV
#include <ibase.h>
. . .
isc_db_handle db1;
iac_db_handle db2;
2QFHDGDWDEDVHLVQRORQJHUDWWDFKHGLWVKDQGOHFDQEHDVVLJQHGWRDGLIIHUHQWGDWDEDVHLQD
VXEVHTXHQWDWWDFKPHQW,IDQDSSOLFDWLRQDFFHVVHVVHYHUDOGDWDEDVHVEXWRQO\DFFHVVHVD
VXEVHWRIGDWDEDVHVDWWKHVDPHWLPHLWLVRQO\QHFHVVDU\WRGHFODUHDVPDQ\KDQGOHVDVWKHUH
ZLOOEHVLPXOWDQHRXVGDWDEDVHDFFHVVHV)RUH[DPSOHLIDQDSSOLFDWLRQDFFHVVHVDWRWDORIWKUHH
GDWDEDVHVEXWRQO\DWWDFKHVWRWZRRIWKHPDWDWLPHRQO\WZRGDWDEDVHKDQGOHVQHHGEH
GHFODUHG
4 ,QLWLDOL]LQJGDWDEDVHKDQGOHV
%HIRUHDGDWDEDVHKDQGOHFDQEHXVHGWRDWWDFKWRDGDWDEDVHLWPXVWEHVHWWR]HUR7KH
IROORZLQJFRGHLOOXVWUDWHVKRZWZRGDWDEDVHKDQGOHVDUHVHWWR]HUR
#include <ibase.h>
. . .
isc_db_handle db1;
isc_db_handle db2;
. . .
/* Set database handles to zero before attaching to a database. */
db1 = 0L;
db2 = 0L;
2QFHDGDWDEDVHKDQGOHLVLQLWLDOL]HGWR]HURLWFDQEHXVHGLQDFDOOWRisc_attach_database()
WRHVWDEOLVKDGDWDEDVHFRQQHFWLRQ,IDQRQ]HURGDWDEDVHKDQGOHLVSDVVHGWR
isc_attach_database()WKHFRQQHFWLRQIDLOVDQGDQHUURUFRGHLVUHWXUQHG)RUPRUH
LQIRUPDWLRQDERXWHVWDEOLVKLQJDGDWDEDVHFRQQHFWLRQZLWKisc_attach_database()VHH
´$WWDFKLQJWRDGDWDEDVHµRQSDJH
API GUIDE 27
CHAPTER 4 WORKING WITH DATABASES
7,3 6RPHRIWKH'3%SDUDPHWHUVFRUUHVSRQGGLUHFWO\WRJIL[RSWLRQV,QIDFWWKDW·VKRZJIL[LV
LPSOHPHQWHGLWVHWVFHUWDLQ'3%SDUDPHWHUVDQGDWWDFKHVWRDGDWDEDVHZKHUHLWSHUIRUPV
WKHUHTXHVWHGRSHUDWLRQ VZHHSVHWDV\QFZULWHVVKXWGRZQRUZKDWHYHU
$'3%LVDFKDUDUUD\YDULDEOHVSHFLILFDOO\GHFODUHGLQDQDSSOLFDWLRQWKDWFRQVLVWVRIWKH
IROORZLQJSDUWV
$E\WHVSHFLI\LQJWKHYHUVLRQRIWKHSDUDPHWHUEXIIHUDOZD\VWKHFRPSLOHWLPH
FRQVWDQWLVFBGSEBYHUVLRQ
$FRQWLJXRXVVHULHVRIRQHRUPRUHFOXVWHUVRIE\WHVHDFKGHVFULELQJDVLQJOH
SDUDPHWHU
(DFKFOXVWHUFRQVLVWVRIWKHIROORZLQJSDUWV
$RQHE\WHSDUDPHWHUW\SH7KHUHDUHFRPSLOHWLPHFRQVWDQWVGHILQHGIRUDOOWKH
SDUDPHWHUW\SHV IRUH[DPSOHLVFBGSEBQXPBEXIIHUV
$RQHE\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHU
RIWKHFOXVWHU
$YDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQ IRUH[DPSOHDVDQXPEHURU
DVDVWULQJRIFKDUDFWHUV GHSHQGVRQWKHSDUDPHWHUW\SH
)RUH[DPSOHWKHIROORZLQJFRGHFUHDWHVD'3%ZLWKDVLQJOHSDUDPHWHUWKDWVHWVWKHQXPEHU
RIFDFKHEXIIHUVWRXVHZKHQFRQQHFWLQJWRDGDWDEDVH
char dpb_buffer[256], *dpb, *p;
short dpb_length;
/* Construct the database parameter buffer. */
dpb = dpb_buffer;
*dpb++ = isc_dpb_version1;
*dpb++ = isc_num_buffers;
*dpb++ = 1;
28 INTERBASE 5
CONNECTING TO DATABASES
*dpb++ = 90;
dpb_length = dpb - dpb_buffer;
,03257$17 $OOQXPEHUVLQWKHGDWDEDVHSDUDPHWHUEXIIHUPXVWEHUHSUHVHQWHGLQDJHQHULFIRUPDWZLWK
WKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQWE\WHODVW6LJQHGQXPEHUVVKRXOGKDYH
WKHVLJQLQWKHODVWE\WH7KH$3,IXQFWLRQisc_vax_integer()FDQEHXVHGWRUHYHUVHWKH
E\WHRUGHURIDQXPEHU)RUPRUHLQIRUPDWLRQVHH´LVFBYD[BLQWHJHU µRQSDJH
7KHIROORZLQJWDEOHOLVWV'3%LWHPVE\SXUSRVH
User validation
User name isc_dpb_user_name
Password isc_dpb_password
Encrypted password isc_dpb_password_enc
Role name isc_dpb_sql_role_name
System database administrator’s user name isc_dpb_sys_user_name
Authorization key for a software license isc_dpb_license
Database encryption key isc_dpb_encrypt_key
Environmental control
Number of cache buffers isc_dpb_num_buffers
dbkey context scope isc_dpb_dbkey_scope
System management
Force writes to the database to be done asynchronously or synchronously isc_dpb_force_write
Specify whether or not to reserve a small amount of space on each database isc_dpb_no_reserve
page for holding backup versions of records when modifications are made
System management
Specify whether or not the database should be marked as damaged isc_dpb_damaged
Perform consistency checking of internal structures isc_dpb_verify
Shadow control
Activate the database shadow, an optional, duplicate, in-sync copy of the isc_dpb_activate_shado
database w
TABLE 4.2 DPB parameters
API GUIDE 29
CHAPTER 4 WORKING WITH DATABASES
7KHIROORZLQJWDEOHOLVWV'3%SDUDPHWHUVLQDOSKDEHWLFDORUGHU)RUHDFKSDUDPHWHULWOLVWVLWV
SXUSRVHWKHOHQJWKLQE\WHVRIDQ\YDOXHVSDVVHGZLWKWKHSDUDPHWHUDQGWKHYDOXHWRSDVV
30 INTERBASE 5
CONNECTING TO DATABASES
Note 6RPHSDUDPHWHUVVXFKDVLVFBGSEBGHOHWHBVKDGRZDUHGLUHFWLYHVWKDWGRQRWUHTXLUH
DGGLWLRQDOSDUDPHWHUV(YHQVR\RXPXVWVWLOOSURYLGHOHQJWKDQGYDOXHE\WHVIRUWKHVH
SDUDPHWHUV6HWOHQJWKWRDQGYDOXHWR,QWHU%DVHLJQRUHVWKHVHSDUDPHWHUYDOXHVEXWWKH\
DUHUHTXLUHGWRPDLQWDLQWKHIRUPDWRIWKH'3%
API GUIDE 31
CHAPTER 4 WORKING WITH DATABASES
Parameter Purpose
isc_dpb_user_name String user name, up to 255 characters
isc_dpb_password String password, up to 255 characters
isc_dpb_lc_messages String specifying a language-specific message file
isc_dpb_lc_ctype String specifying the character set to be utilized
TABLE 4.4 DPB parameters recognized by isc_expand_dpb()
,03257$17 ,I\RXH[SHFWWRDGGDQ\RIWKHVHSDUDPHWHUVDWUXQWLPHWKHQFUHDWHDODUJHUWKDQQHFHVVDU\
'3%EHIRUHFDOOLQJisc_expand_dpb()VRWKDWWKLVIXQFWLRQGRHVQRWQHHGWRUHDOORFDWH
'3%VWRUDJHVSDFHDWUXQWLPHisc_expand_dbp()FDQUHDOORFDWHVSDFHEXWWKDWVSDFHLV
QRWDXWRPDWLFDOO\IUHHGZKHQWKHGDWDEDVHLVGHWDFKHG
isc_expand_dpb()UHTXLUHVWKHIROORZLQJSDUDPHWHUV
7KHWKLUGSDUDPHWHULQWKHWDEOH«LQGLFDWHVDYDULDEOHQXPEHURIUHSODFHDEOHSDUDPHWHUV
HDFKZLWKGLIIHUHQWQDPHVEXWHDFKDFKDUDFWHUSRLQWHU
7KHIROORZLQJFRGHGHPRQVWUDWHVKRZisc_expand_dpb()LVFDOOHGWRDGGDXVHUQDPHDQG
SDVVZRUGWRWKH'3%DIWHUWKH\DUHHOLFLWHGIURPDXVHUDWUXQWLPH
char dpb_buffer[256], *dpb, *p;
char uname[256], upass[256];
short dpb_length;
32 INTERBASE 5
CONNECTING TO DATABASES
dpb = dpb_buffer;
*dpb++ = isc_dpb_version1;
*dpb++ = isc_num_buffers;
*dpb++ = 1;
*dpb++ = 90;
dpb_length = dpb - dpb_buffer;
/* Now ask user for name and password. */
prompt_user("Enter your user name: ");
gets(uname);
prompt_user("\nEnter your password: ");
gets(upass);
/* Add user name and password to DPB. */
dpb = dbp_buffer;
isc_expand_dpb(&dpb, &dpb_length,
isc_dpb_user_name, uname,
isc_dpb_password, upass,
NULL);
Attaching to a database
$IWHUFUHDWLQJDQGLQLWLDOL]LQJDGDWDEDVHKDQGOHDQGRSWLRQDOO\VHWWLQJXSD'3%WRVSHFLI\
FRQQHFWLRQSDUDPHWHUVXVHisc_attach_database()WRHVWDEOLVKDFRQQHFWLRQWRDQH[LVWLQJ
GDWDEDVH%HVLGHVDOORFDWLQJV\VWHPUHVRXUFHVIRUWKHGDWDEDVHFRQQHFWLRQ
isc_attach_database()DOVRDVVRFLDWHVDVSHFLILFGDWDEDVHZLWKDGDWDEDVHKDQGOHIRUXVHLQ
VXEVHTXHQW$3,FDOOVWKDWUHTXLUHDKDQGOH
isc_attach_database()H[SHFWVVL[SDUDPHWHUV
g $SRLQWHUWRDQHUURUVWDWXVDUUD\ZKHUHDWWDFKPHQWHUURUVFDQEHUHSRUWHGVKRXOGWKH\RFFXU
g 7KHOHQJWKLQE\WHVRIWKHGDWDEDVHQDPHIRUWKHGDWDEDVHWRRSHQ,IWKHGDWDEDVHQDPH
LQFOXGHVDQRGHQDPHDQGSDWKWKHVHHOHPHQWVPXVWEHFRXQWHGLQWKHOHQJWKDUJXPHQW
g $VWULQJFRQWDLQLQJWKHQDPHRIWKHGDWDEDVHWRDWWDFK7KHQDPHFDQLQFOXGHDQRGHQDPH
DQGSDWKVSHFLILFDWLRQ
g $SRLQWHUWRDSUHYLRXVO\GHFODUHGDQGLQLWLDOL]HGGDWDEDVHKDQGOHZLWKZKLFKWRDVVRFLDWHWKH
GDWDEDVHWRDWWDFK$OOVXEVHTXHQW$3,FDOOVXVHWKHKDQGOHWRVSHFLI\DFFHVVWRWKLVGDWDEDVH
g 7KHOHQJWKLQE\WHVRIWKH'3%,IQR'3%LVSDVVHGVHWWKLVYDOXHWR]HUR
g $SRLQWHUWRWKH'3%,IQR'3%LVSDVVHGVHWWKLVWR18//
(DFKGDWDEDVHDWWDFKPHQWUHTXLUHVDVHSDUDWHFDOOWRisc_attach_database()
API GUIDE 33
CHAPTER 4 WORKING WITH DATABASES
7KHIROORZLQJFRGHHVWDEOLVKHVDQDWWDFKPHQWWRWKH,QWHU%DVHH[DPSOHGDWDEDVHHPSOR\HHJGE
DQGVSHFLILHVD'3%WRXVHIRUWKHDWWDFKPHQW
#include <ibase.h>
. . .
isc_db_handle db1;
char dpb_buffer[256], *dpb, *p;
short dpb_length;
char *str = "employee.gdb";
ISC_STATUS status_vector[20];
. . .
/* Set database handle to zero before attaching to a database. */
db1 = 0L;
/* Initialize the DPB. */
dpb = dpb_buffer;
*dpb++ = isc_dpb_version1;
*dpb++ = isc_num_buffers;
*dpb++ = 1;
*dpb++ = 90;
dpb_length = dpb - dpb_buffer;
/* Attach to the database. */
isc_attach_database(status_vector, strlen(str), str, &db1, dpb_length,
dbp_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
error_exit();
}
. . .
7KHIROORZLQJFRGHLOOXVWUDWHVKRZWRDWWDFKWRDGDWDEDVHZLWKRXWSDVVLQJD'3%
#include <ibase.h>
. . .
isc_db_handle db1;
char *str = "employee.gdb";
ISC_STATUS status_vector[20];
. . .
/* Set database handle to zero before attaching to a database. */
db1 = 0L;
/* Attach to the database. */
isc_attach_database(status_vector, strlen(str), str, &db1, 0, NULL);
if (status_vector[0] == 1 && status_vector[1])
{
error_exit();
}
34 INTERBASE 5
REQUESTING INFORMATION ABOUT AN ATTACHMENT
. . .
API GUIDE 35
CHAPTER 4 WORKING WITH DATABASES
$FDOOLQJSURJUDPLVUHVSRQVLEOHIRULQWHUSUHWLQJWKHFRQWHQWVRIWKHUHVXOWEXIIHUDQGIRU
GHFLSKHULQJHDFKFOXVWHUDVDSSURSULDWH,QPDQ\FDVHVWKHYDOXHVLPSO\FRQWDLQVDQXPEHU
RUDVWULQJ VHTXHQFHRIFKDUDFWHUV %XWLQRWKHUFDVHVWKHYDOXHLVDQXPEHURIE\WHVZKRVH
LQWHUSUHWDWLRQGHSHQGVRQWKHLWHPUHWXUQW\SH
7KHFOXVWHUVUHWXUQHGWRWKHUHVXOWEXIIHUDUHQRWDOLJQHG)XUWKHUPRUHDOOQXPEHUVDUH
UHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQW
E\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUWWKHQXPEHUVWRDGDWDW\SH
QDWLYHWR\RXUV\VWHPLIQHFHVVDU\EHIRUHLQWHUSUHWLQJWKHP7KH$3,FDOO
isc_vax_integer()FDQEHXVHGWRSHUIRUPWKHFRQYHUVLRQ
4 'DWDEDVHFKDUDFWHULVWLFV
6HYHUDOLWHPVDUHDYDLODEOHIRUGHWHUPLQLQJGDWDEDVHFKDUDFWHULVWLFVVXFKDVLWVVL]HDQGPDMRU
DQGPLQRU2'6YHUVLRQQXPEHUV7KHIROORZLQJWDEOHOLVWVWKHUHTXHVWEXIIHULWHPVWKDWFDQ
EHSDVVHGDQGWKHLQIRUPDWLRQUHWXUQHGLQWKHUHVXOWEXIIHUIRUHDFKLWHPW\SH
36 INTERBASE 5
REQUESTING INFORMATION ABOUT AN ATTACHMENT
4 (QYLURQPHQWDOFKDUDFWHULVWLFV
6HYHUDOLWHPVDUHSURYLGHGIRUGHWHUPLQLQJHQYLURQPHQWDOFKDUDFWHULVWLFVVXFKDV
WKHDPRXQWRIPHPRU\FXUUHQWO\LQXVHRUWKHQXPEHURIGDWDEDVHFDFKHEXIIHUVFXUUHQWO\
DOORFDWHG7KHVHLWHPVDUHGHVFULEHGLQWKHIROORZLQJWDEOH
API GUIDE 37
CHAPTER 4 WORKING WITH DATABASES
Note 1RWDOOHQYLURQPHQWDOLQIRUPDWLRQLWHPVDUHDYDLODEOHRQDOOSODWIRUPV
4 3HUIRUPDQFHVWDWLVWLFV
7KHUHDUHIRXULWHPVWKDWUHTXHVWSHUIRUPDQFHVWDWLVWLFVIRUDGDWDEDVH7KHVHVWDWLVWLFV
DFFXPXODWHIRUDGDWDEDVHIURPWKHPRPHQWLWLVILUVWDWWDFKHGE\DQ\SURFHVVXQWLOWKHODVW
UHPDLQLQJSURFHVVGHWDFKHVIURPWKHGDWDEDVH
)RUH[DPSOHWKHYDOXHUHWXUQHGIRULVFBLQIRBUHDGVLVWKHQXPEHURIUHDGVVLQFHWKHFXUUHQW
GDWDEDVHZDVILUVWDWWDFKHGWKDWLVDQDJJUHJDWHRIDOOUHDGVGRQHE\DOODWWDFKHGSURFHVVHV
UDWKHUWKDQWKHQXPEHURIUHDGVGRQHIRUWKHFDOOLQJSURJUDPVLQFHLWDWWDFKHGWRWKHGDWDEDVH
7DEOHOLVWVWKHUHTXHVWSHUIRUPDQFHVWDWLVWLFVDUHVXPPDUL]HGLQWKHIROORZLQJWDEOH
4 'DWDEDVHRSHUDWLRQFRXQWV
6HYHUDOLQIRUPDWLRQLWHPVDUHSURYLGHGIRUGHWHUPLQLQJWKHQXPEHURIYDULRXVGDWDEDVH
RSHUDWLRQVSHUIRUPHGE\WKHFXUUHQWO\DWWDFKHGFDOOLQJSURJUDP7KHVHYDOXHVDUHFDOFXODWHG
RQDSHUWDEOHEDVLV
:KHQDQ\RIWKHVHLQIRUPDWLRQLWHPVLVUHTXHVWHG,QWHU%DVHUHWXUQVWRWKHUHVXOWEXIIHU
g E\WHVSHFLI\LQJWKHLWHPW\SH IRUH[DPSOHLVFBLQIRBLQVHUWBFRXQW
38 INTERBASE 5
REQUESTING INFORMATION ABOUT AN ATTACHMENT
g E\WHVWHOOLQJKRZPDQ\E\WHVFRPSRVHWKHVXEVHTXHQWYDOXHSDLUV
g $SDLURIYDOXHVIRUHDFKWDEOHLQWKHGDWDEDVHRQZKLFKWKHUHTXHVWHGW\SHRIRSHUDWLRQKDV
RFFXUUHGVLQFHWKHGDWDEDVHZDVODVWDWWDFKHG
(DFKSDLUFRQVLVWVRI
g E\WHVVSHFLI\LQJWKHWDEOH,'
g E\WHVOLVWLQJWKHQXPEHURIRSHUDWLRQV IRUH[DPSOHLQVHUWV GRQHRQWKDWWDEOH
7,3 7RGHWHUPLQHDQDFWXDOWDEOHQDPHIURPDWDEOH,'TXHU\WKHV\VWHPWDEOH5'%5(/$7,21
7KHIROORZLQJWDEOHGHVFULEHVWKHLWHPVZKLFKUHWXUQFRXQWYDOXHVIRURSHUDWLRQVRQWKH
GDWDEDVH
API GUIDE 39
CHAPTER 4 WORKING WITH DATABASES
isc_info_end};
char res_buffer[40], *p, item;
int length;
SLONG page_size = 0L, num_buffers = 0L;
ISC_STATUS status_vector[20];
isc_database_info(
status_vector,
&handle, /* Set in previous isc_attach_database() call. */
sizeof(db_items),
db_items,
sizeof(res_buffer),
res_buffer);
if (status_vector[0] == 1 && status_vector[1]) {
/* An error occurred. */
isc_print_status(status_vector);
return(1);
};
/* Extract the values returned in the result buffer. */
for (p = res_buffer; *p != isc_info_end ; ) {
item = *p++
length = isc_vax_integer(p, 2);
p += 2;
switch (item){
case isc_info_page_size:
page_size = isc_vax_integer(p, length);
break;
case isc_info_num_buffers:
num_buffers = isc_vax_integer(p, length);
break;
default:
break;
}
p += length;
};
40 INTERBASE 5
DISCONNECTING FROM DATABASES
(DFKGDWDEDVHWRGHWDFKUHTXLUHVDVHSDUDWHFDOOWRisc_detach_database()
Deleting a database
7RUHPRYHDGDWDEDVHIURPWKHV\VWHPLILWLVQRORQJHUQHHGHGXVHisc_drop_database()
7KLVIXQFWLRQSHUPDQHQWO\ZLSHVRXWDGDWDEDVHHUDVLQJLWVGDWDPHWDGDWDDQGDOORILWV
VXSSRUWLQJILOHVVXFKDVVHFRQGDU\ILOHVVKDGRZILOHVDQGZULWHDKHDGORJILOHV
$GDWDEDVHFDQRQO\EHGHOHWHGLILWLVSUHYLRXVO\DWWDFKHGZLWKDFDOOWR
isc_attach_database()7KHFDOOWRisc_attach_database()HVWDEOLVKHVDGDWDEDVHKDQGOH
IRUWKHGDWDEDVH7KDWKDQGOHPXVWEHSDVVHGLQWKHFDOOWRisc_drop_database()
)RUH[DPSOHWKHIROORZLQJFRGHGHOHWHVWKHGDWDEDVHSRLQWHGWRE\WKHGDWDEDVHKDQGOHGE
#include <ibase.h>
. . .
isc_db_handle db1;
char *str = "employee.gdb";
ISC_STATUS status_vector[20];
. . .
/* Set database handle to zero before attaching to a database. */
db1 = 0L;
/* Attach to the database. */
isc_attach_database(status_vector, strlen(str), str, &db1, 0, NULL);
if (status_vector[0] == 1 && status_vector[1])
{
error_exit();
}
isc_drop_database(status_vector, &db1);
if (status_vector[0] == 1 && status_vector[1])
{
API GUIDE 41
CHAPTER 4 WORKING WITH DATABASES
error_exit();
}
. . .
42 INTERBASE 5
CHAPTER
Function Purpose
isc_start_transaction() Starts a new transaction against one or more databases.; use a
previously declared and populated TPB
isc_commit_retaining() Commits a transaction’s changes, and preserves the transaction
context for further transaction processing
isc_commit_transaction() Commits a transaction’s changes, and ends the transaction
isc_rollback_transaction() Rolls back a transaction’s changes, and ends the transaction
TABLE 5.1 API transaction functions
43
CHAPTER 5 WORKING WITH TRANSACTIONS
,QDGGLWLRQWRWKHVHIXQFWLRQVWKHIROORZLQJWDEOHOLVWVOHVVIUHTXHQWO\XVHG$3,WUDQVDFWLRQ
IXQFWLRQVLQWKHRUGHUWKH\W\SLFDOO\DSSHDUZKHQXVHG
Function Purpose
isc_start_multiple() Starts a new transaction against one or more databases; used instead of
isc_start_transaction() for programming languages such as
FORTRAN, that do not support variable numbers of arguments to
functions
isc_prepare_transaction() Performs the first phase of a two-phase commit, prior to calling
isc_commit_transaction(); used only when it is absolutely necessary
to override InterBase’s automatic two-phase commit
isc_prepare_transaction2() Performs the first phase of a two-phase commit, prior to calling
isc_commit_transaction(); used only when absolutely necessary to
override InterBase’s automatic two-phase commit
TABLE 5.2 Additional API transaction functions
Starting transactions
6WDUWLQJWUDQVDFWLRQVLVDWKUHHVWHSSURFHVV
&UHDWLQJDQGLQLWLDOL]LQJDWUDQVDFWLRQKDQGOHIRUHDFKVLPXOWDQHRXVWUDQVDFWLRQ
WREHVWDUWHG
2SWLRQDOO\FUHDWLQJDQGSRSXODWLQJD73%IRUHDFKWUDQVDFWLRQ
&DOOLQJisc_start_transaction()IRUHDFKWUDQVDFWLRQWRVWDUW
7KHVHVWHSVDUHGHVFULEHGLQWKHIROORZLQJVHFWLRQVRIWKLVFKDSWHU
Note 3URJUDPPHUVZULWLQJDSSOLFDWLRQVWKDWGRQRWSHUPLWIXQFWLRQFDOOVWRSDVVDYDULDEOH
QXPEHURISDUDPHWHUVPXVWXVHisc_start_multiple()LQVWHDGRIisc_start_transaction()
44 INTERBASE 5
STARTING TRANSACTIONS
7RXVHWKLVW\SHGHIIRUGHFODULQJWUDQVDFWLRQKDQGOHVLQDQDSSOLFDWLRQLQFOXGHLEDVHKLQHDFK
VRXUFHILOHPRGXOH
#include <ibase.h>
4 'HFODULQJWUDQVDFWLRQKDQGOHV
7RHVWDEOLVKWUDQVDFWLRQKDQGOHVIRUXVHGHFODUHDYDULDEOHRIW\SHLVFBWUBKDQGOHIRUHDFK
VLPXOWDQHRXVO\DFWLYHWUDQVDFWLRQ7KHIROORZLQJFRGHGHFODUHVWZRKDQGOHV
#include <ibase.h>
. . .
isc_tr_handle tr1;
iac_tr_handle tr2;
2QFHDWUDQVDFWLRQLVFRPPLWWHGRUUROOHGEDFNLWVKDQGOHFDQEHDVVLJQHGWRDGLIIHUHQW
WUDQVDFWLRQLQDVXEVHTXHQWFDOOWRisc_start_transaction(),IDQDSSOLFDWLRQXVHVVHYHUDO
WUDQVDFWLRQVEXWRQO\VWDUWVDVXEVHWRIWUDQVDFWLRQVDWWKHVDPHWLPHLWLVRQO\QHFHVVDU\WR
GHFODUHDVPDQ\KDQGOHVDVWKHUHZLOOEHVLPXOWDQHRXVO\DFWLYHWUDQVDFWLRQV)RUH[DPSOHLI
DQDSSOLFDWLRQVWDUWVDWRWDORIWKUHHWUDQVDFWLRQVEXWRQO\UXQVWZRRIWKHPDWWKHVDPHWLPH
RQO\WZRWUDQVDFWLRQKDQGOHVQHHGEHGHFODUHG
4 ,QLWLDOL]LQJWUDQVDFWLRQKDQGOHV
%HIRUHDWUDQVDFWLRQKDQGOHFDQEHXVHGWRVWDUWDQHZWUDQVDFWLRQLWPXVWEHVHWWR]HUR7KH
IROORZLQJFRGHLOOXVWUDWHVKRZWZRWUDQVDFWLRQKDQGOHVDUHVHWWR]HUR
#include <ibase.h>
. . .
isc_tr_handle tr1;
isc_tr_handle tr2;
. . .
/* Set transaction handles to zero before starting a transaction. */
tr1 = 0L;
tr2 = 0L;
API GUIDE 45
CHAPTER 5 WORKING WITH TRANSACTIONS
2QFHDWUDQVDFWLRQKDQGOHLVLQLWLDOL]HGWR]HURLWFDQEHXVHGLQDFDOOWR
isc_start_transaction()WRHVWDEOLVKDQHZWUDQVDFWLRQ,IDQRQ]HURWUDQVDFWLRQKDQGOHLV
SDVVHGWRisc_start_transaction()WKHVWDUWXSIDLOVDQGDQHUURUFRGHLVUHWXUQHG)RUPRUH
LQIRUPDWLRQDERXWVWDUWLQJDQHZWUDQVDFWLRQZLWKisc_start_transaction()VHH´&DOOLQJ
LVFBVWDUWBWUDQVDFWLRQ µRQSDJH
7KLVH[DPSOHPDNHVXVHRISDUDPHWHUFRQVWDQWVGHILQHGLQWKH,QWHU%DVHKHDGHUILOHLEDVHK
7KHILUVWHOHPHQWLQHYHU\73%PXVWEHWKHLVFBWSEBYHUVLRQFRQVWDQW7KHIROORZLQJWDEOHOLVWV
DYDLODEOH73%FRQVWDQWVGHVFULEHVWKHLUSXUSRVHVDQGLQGLFDWHVZKLFKFRQVWDQWVDUHDVVLJQHG
DVDGHIDXOWVHWRIDWWULEXWHVZKHQD18//73%SRLQWHULVSDVVHGWRisc_start_transaction()
Parameter Description
isc_tpb_version3 InterBase version 3 transaction
isc_tpb_consistency Table-locking transaction model
isc_tpb_concurrency High throughput, high concurrency transaction with acceptable consistency;
use of this parameter takes full advantage of the InterBase multi-generational
transaction model [Default]
TABLE 5.3 TPB constants
46 INTERBASE 5
STARTING TRANSACTIONS
Parameter Description
isc_tpb_shared Concurrent, shared access of a specified table among all transactions; use in
conjunction with isc_tpb_lock_read and isc_tpb_lock_write to establish the
lock option [Default]
isc_tpb_protected Concurrent, restricted access of a specified table; use in conjunction with
isc_tpb_lock_read and isc_tpb_lock_write to establish the lock option
isc_tpb_wait Lock resolution specifies that the transaction is to wait until locked resources
are released before retrying an operation [Default]
isc_tpb_nowait Lock resolution specifies that the transaction is not to wait for locks to be
released, but instead, a lock conflict error should be returned immediately
isc_tpb_read Read-only access mode that allows a transaction only to select data from
tables
isc_tpb_write Read-write access mode of that allows a transaction to select, insert, update,
and delete table data [Default]
isc_tpb_lock_read Read-only access of a specified table. Use in conjunction with isc_tpb_shared,
isc_tpb_protected, and isc_tpb_exclusive to establish the lock option.
isc_tpb_lock_write Read-write access of a specified table. Use in conjunction with
isc_tpb_shared, isc_tpb_protected, and isc_tpb_exclusive to establish the lock
option [Default]
isc_tpb_read_committed High throughput, high concurrency transaction that can read changes
committed by other concurrent transactions. Use of this parameter takes full
advantage of the InterBase
multi-generational transaction model.
isc_tpb_rec_version Enables an isc_tpb_read_committed transaction to read the most recently
committed version of a record even if other, uncommitted versions are
pending.
isc_tpb_no_rec_version Enables an isc_tpb_read_committed transaction to read only the latest
committed version of a record. If an uncommitted version of a record is
pending and isc_tpb_wait is also specified, then the transaction waits for the
pending record to be committed or rolled back before proceeding. Otherwise,
a lock conflict error is reported at once.
TABLE 5.3 TPB constants (continued)
73%SDUDPHWHUVVSHFLI\WKHIROORZLQJFODVVHVRILQIRUPDWLRQ
g 7UDQVDFWLRQYHUVLRQQXPEHULVXVHGLQWHUQDOO\E\WKH,QWHU%DVHHQJLQH,WLVDOZD\VEHWKHILUVW
DWWULEXWHVSHFLILHGLQWKH73%DQGPXVWDOZD\VEHVHWWRLVFBWSEBYHUVLRQ
API GUIDE 47
CHAPTER 5 WORKING WITH TRANSACTIONS
g $FFHVVPRGHGHVFULEHVWKHDFWLRQVWKDWFDQEHSHUIRUPHGE\WKHIXQFWLRQVDVVRFLDWHGZLWKWKH
WUDQVDFWLRQ9DOLGDFFHVVPRGHVDUH
LVFBWSEBUHDG
LVFBWSEBZULWH
g ,VRODWLRQOHYHOGHVFULEHVWKHYLHZRIWKHGDWDEDVHJLYHQDWUDQVDFWLRQDVLWUHODWHVWRDFWLRQV
SHUIRUPHGE\RWKHUVLPXOWDQHRXVO\RFFXUULQJWUDQVDFWLRQV9DOLGLVRODWLRQOHYHOVDUH
LVFBWSEBFRQFXUUHQF\
LVFBWSEBFRQVLVWHQF\
LVFBWSEBUHDGBFRPPLWWHGLVFBWSEBUHFBYHUVLRQ
LVFBWSEBUHDGBFRPPLWWHGLVFBWSEBQRBUHFBYHUVLRQ
g /RFNUHVROXWLRQGHVFULEHVKRZDWUDQVDFWLRQVKRXOGUHDFWLIDORFNFRQIOLFWRFFXUV9DOLGORFN
UHVROXWLRQVDUH
LVFBWSEBZDLW
LVFBWSEBQRZDLW
g 7DEOHUHVHUYDWLRQRSWLRQDOO\GHVFULEHVDQDFFHVVPHWKRGDQGORFNUHVROXWLRQIRUDVSHFLILHGWDEOH
WKDWWKHWUDQVDFWLRQDFFHVVHV:KHQWDEOHUHVHUYDWLRQLVXVHGWDEOHVDUHUHVHUYHGIRUWKH
VSHFLILHGDFFHVVZKHQWKHWUDQVDFWLRQLVVWDUWHGUDWKHUWKDQZKHQWKHWUDQVDFWLRQDFWXDOO\
DFFHVVHVWKHWDEOH9DOLGUHVHUYDWLRQVDUH
LVFBWSEBVKDUHGLVFBWSEBORFNBZULWH
LVFBWSEBVKDUHGLVFBWSEBORFNBUHDG
LVFBWSEBSURWHFWHGLVFBWSEBORFNBZULWH
LVFBWSEBSURWHFWHGLVFBWSEBORFNBUHDG
73%SDUDPHWHUVDUHGHVFULEHGLQGHWDLOLQWKHIROORZLQJVHFWLRQV
4 6SHFLI\LQJWKHWUDQVDFWLRQYHUVLRQQXPEHU
7KHILUVWSDUDPHWHULQD73%PXVWDOZD\VVSHFLI\WKHYHUVLRQQXPEHUIRUWUDQVDFWLRQ
SURFHVVLQJ,WPXVWDOZD\VEHVHWWRLVFBWSEBYHUVLRQ7KHIROORZLQJ73%GHFODUDWLRQLOOXVWUDWHV
WKHFRUUHFWXVHDQGSRVLWLRQRIWKLVSDUDPHWHU
static char isc_tpb[] = {isc_tpb_version3, ...};
48 INTERBASE 5
STARTING TRANSACTIONS
4 6SHFLI\LQJDFFHVVPRGH
7KHDFFHVVPRGHSDUDPHWHUGHVFULEHVWKHDFWLRQVDWUDQVDFWLRQFDQSHUIRUPDJDLQVWDWDEOH
7KHGHIDXOWDFFHVVPRGHLVFBWSEBZULWHHQDEOHVDWUDQVDFWLRQWRUHDGGDWDIURPDWDEOHDQG
ZULWHGDWDWRLW$VHFRQGDFFHVVPRGHLVFBWSEBUHDGUHVWULFWVWDEOHDFFHVVWRUHDGRQO\)RU
H[DPSOHWKHIROORZLQJ73%GHFODUDWLRQVSHFLILHVDUHDGRQO\WUDQVDFWLRQ
static char isc_tpb[] = {isc_tpb_version3, isc_tpb_read};
$73%VKRXOGRQO\VSHFLI\RQHDFFHVVPRGHSDUDPHWHU,IPRUHWKDQRQHLVVSHFLILHGODWHU
GHFODUDWLRQVRYHUULGHHDUOLHURQHV
,ID73%LVGHFODUHGWKDWRPLWVWKHDFFHVVPRGHSDUDPHWHU,QWHU%DVHLQWHUSUHWVWUDQVDFWLRQ
DFFHVVDVUHDGDQGZULWH
4 6SHFLI\LQJLVRODWLRQOHYHO
7KHLVRODWLRQOHYHOSDUDPHWHUVSHFLILHVWKHYLHZRIWKHGDWDEDVHSHUPLWWHGDWUDQVDFWLRQDVLW
UHODWHVWRDFWLRQVSHUIRUPHGE\RWKHUVLPXOWDQHRXVO\RFFXUULQJWUDQVDFWLRQV
ISC_TPB_CONCURRENCY
%\GHIDXOWDIWHUDWUDQVDFWLRQVWDUWVLWFDQQRWDFFHVVFRPPLWWHGFKDQJHVWRDWDEOHPDGHE\
RWKHUVLPXOWDQHRXVWUDQVDFWLRQVHYHQWKRXJKLWVKDUHVDFFHVVWRWKHWDEOHZLWKWKHP6XFKD
WUDQVDFWLRQKDVDQLVRODWLRQOHYHORILVFBWSEBFRQFXUUHQF\PHDQLQJLWFDQKDYHFRQFXUUHQWDFFHVV
WRWDEOHVDOVRDFFHVVHGVLPXOWDQHRXVO\E\RWKHUWUDQVDFWLRQV7KHIROORZLQJGHFODUDWLRQ
FUHDWHVD73%VSHFLI\LQJDQLVRODWLRQOHYHORILVFBWSEBFRQFXUUHQF\
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency};
ISC_TPB_READ_COMMITTED
$VHFRQGLVRODWLRQOHYHOLVFBWSEBUHDGBFRPPLWWHGRIIHUVDOOWKHDGYDQWDJHVRIWKH
LVFBWSEBFRQFXUUHQF\LVRODWLRQOHYHODQGDGGLWLRQDOO\HQDEOHVDWUDQVDFWLRQWRDFFHVVFKDQJHV
FRPPLWWHGE\RWKHUVLPXOWDQHRXVWUDQVDFWLRQV7ZRRWKHUSDUDPHWHUVLVFBWSEBUHFBYHUVLRQDQG
LVFBWSEBQRBUHFBYHUVLRQVKRXOGEHXVHGZLWKWKHLVFBWSEBUHDGBFRPPLWWHGSDUDPHWHU7KH\RIIHU
UHILQHGFRQWURORYHUWKHFRPPLWWHGFKDQJHVDWUDQVDFWLRQLVSHUPLWWHGWRDFFHVV
à LVFBWSEBQRBUHFBYHUVLRQWKHGHIDXOWUHILQHPHQWVSHFLILHVWKDWDWUDQVDFWLRQFDQRQO\UHDGWKH
ODWHVWYHUVLRQRIDURZ,IDFKDQJHWRDURZLVSHQGLQJEXWQRW\HWFRPPLWWHGWKHURZ
FDQQRWEHUHDG
à LVFBWSEBUHFBYHUVLRQVSHFLILHVWKDWDWUDQVDFWLRQFDQUHDGWKHODWHVWFRPPLWWHGYHUVLRQRIDURZ
HYHQLIDPRUHUHFHQWXQFRPPLWWHGYHUVLRQLVSHQGLQJ
API GUIDE 49
CHAPTER 5 WORKING WITH TRANSACTIONS
7KHIROORZLQJGHFODUDWLRQFUHDWHVD73%ZLWKDUHDGFRPPLWWHGLVRODWLRQOHYHODQGVSHFLILHV
WKDWWKHWUDQVDFWLRQFDQUHDGWKHODWHVWFRPPLWWHGYHUVLRQRIDURZ
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_read_committed,
isc_tpb_rec_version};
ISC_TPB_CONSISTENCY
,QWHU%DVHDOVRVXSSRUWVDUHVWULFWLYHLVRODWLRQOHYHOLVFBWSEBFRQVLVWHQF\SUHYHQWVDWUDQVDFWLRQ
IURPDFFHVVLQJWDEOHVLIWKH\DUHZULWWHQWRE\RWKHUWUDQVDFWLRQVLWDOVRSUHYHQWVRWKHU
WUDQVDFWLRQVIURPZULWLQJWRDWDEOHRQFHWKLVWUDQVDFWLRQZULWHVWRLW7KLVLVRODWLRQOHYHOLV
GHVLJQHGWRJXDUDQWHHWKDWLIDWUDQVDFWLRQZULWHVWRDWDEOHEHIRUHRWKHUVLPXOWDQHRXVUHDG
DQGZULWHWUDQVDFWLRQVWKHQRQO\LWFDQFKDQJHDWDEOH·VGDWD%HFDXVHLWHVVHQWLDOO\UHVWULFWV
DQGRIWHQSUHYHQWV VKDUHGDFFHVVWRWDEOHVLVFBWSEBFRQVLVWHQF\VKRXOGEHXVHGZLWKFDUH
$73%VKRXOGRQO\VSHFLI\RQHLVRODWLRQPRGHSDUDPHWHU DQGRQHUHILQHPHQWSDUDPHWHULI
LVRODWLRQPRGHLVLVFBWSEBUHDGBFRPPLWWHG ,IPRUHWKDQRQHLVVSHFLILHGODWHUGHFODUDWLRQV
RYHUULGHHDUOLHURQHV
,ID73%LVGHFODUHGWKDWRPLWVWKHLVRODWLRQPRGHSDUDPHWHU,QWHU%DVHLQWHUSUHWVLWDV
LVFBWSEBFRQFXUUHQF\
isc_tpb_concurrency,
isc_tpb_read_committed isc_tpb_consistency
isc_tpb_rea
isc_tpb_write isc_tpb_read isc_tpb_write d
concurrency, isc_tpb_write Some simultaneous — Conflicts. Conflicts.
read_committed updates may conflict.
isc_tpb_read — — — —
consistency isc_tpb_write Conflicts. — Conflicts. Conflicts.
isc_tpb_read Conflicts. — Conflicts. —
TABLE 5.4 Isolation level interaction with read and write operations
50 INTERBASE 5
STARTING TRANSACTIONS
$VWKLVWDEOHLOOXVWUDWHVLVFBWSEBFRQFXUUHQF\DQGLVFBWSEBUHDGBFRPPLWWHGWUDQVDFWLRQVRIIHUWKH
OHDVWFKDQFHIRUFRQIOLFWV)RUH[DPSOHLIWLVDQLVFBWSEBFRQFXUUHQF\WUDQVDFWLRQZLWK
LVFBWSEBZULWHDFFHVVDQGWLVDQLVFBWSEBUHDGBFRPPLWWHGWUDQVDFWLRQZLWKLVFBWSEBZULWHDFFHVVW
DQGWRQO\FRQIOLFWZKHQWKH\DWWHPSWWRXSGDWHWKHVDPHURZV,IWDQGWKDYHLVFBWSEBUHDG
DFFHVVWKH\QHYHUFRQIOLFWZLWKRWKHUWUDQVDFWLRQV
$QLVFBWSEBFRQVLVWHQF\WUDQVDFWLRQZLWKLVFBWSEBZULWHDFFHVVLVJXDUDQWHHGWKDWLILWJDLQVDFFHVV
WRDWDEOHWKDWLWDORQHFDQXSGDWHDWDEOHEXWLWFRQIOLFWVZLWKDOORWKHUVLPXOWDQHRXV
WUDQVDFWLRQVH[FHSWIRULVFBWSEBFRQFXUUHQF\DQGLVFBWSEBUHDGBFRPPLWWHGWUDQVDFWLRQVUXQQLQJLQ
LVFBWSEBUHDGPRGH$QLVFBWSEBFRQVLVWHQF\WUDQVDFWLRQZLWKLVFBWSEBUHDGDFFHVVLVFRPSDWLEOHZLWK
DQ\RWKHUUHDGRQO\WUDQVDFWLRQEXWFRQIOLFWVZLWKDQ\WUDQVDFWLRQWKDWDWWHPSWVWRLQVHUW
XSGDWHRUGHOHWHGDWD
4 6SHFLI\LQJORFNUHVROXWLRQ
7KHORFNUHVROXWLRQSDUDPHWHUGHVFULEHVZKDWKDSSHQVLIDWUDQVDFWLRQHQFRXQWHUVDQDFFHVV
FRQIOLFWGXULQJDZULWHRSHUDWLRQ XSGDWHDQGGHOHWHRSHUDWLRQVRQH[LVWLQJURZV 7KHUHDUH
WZRSRVVLEOHFKRLFHVIRUWKLVSDUDPHWHU
g LVFBWSEBZDLWWKHGHIDXOWVSHFLILHVWKDWWKHWUDQVDFWLRQVKRXOGZDLWXQWLOORFNHGUHVRXUFHVDUH
UHOHDVHG2QFHWKHUHVRXUFHVDUHUHOHDVHGWKHWUDQVDFWLRQUHWULHVLWVRSHUDWLRQ
g LVFBWSEBQRZDLWVSHFLILHVWKDWWKHWUDQVDFWLRQVKRXOGUHWXUQDORFNFRQIOLFWHUURUZLWKRXWZDLWLQJ
IRUORFNVWREHUHOHDVHG
)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVD73%ZLWKZULWHDFFHVVDFRQFXUUHQF\
LVRODWLRQPRGHDQGDORFNUHVROXWLRQRILVFBWSEBQRZDLW
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency,
isc_tpb_nowait};
$73%VKRXOGRQO\VSHFLI\RQHORFNUHVROXWLRQSDUDPHWHU,IPRUHWKDQRQHLVVSHFLILHGODWHU
GHFODUDWLRQVRYHUULGHHDUOLHURQHV
,ID73%LVGHFODUHGWKDWRPLWVWKHORFNUHVROXWLRQSDUDPHWHU,QWHU%DVHLQWHUSUHWVLWDV
LVFBWSEBFRQFXUUHQF\
API GUIDE 51
CHAPTER 5 WORKING WITH TRANSACTIONS
4 6SHFLI\LQJWDEOHUHVHUYDWLRQ
2UGLQDULO\WUDQVDFWLRQVJDLQVSHFLILFDFFHVVWRWDEOHVRQO\ZKHQWKH\DFWXDOO\UHDGIURPRU
ZULWHWRWKHP2SWLRQDOWDEOHUHVHUYDWLRQSDUDPHWHUVFDQEHSDVVHGLQWKH73%7DEOH
UHVHUYDWLRQRSWLRQDOO\GHVFULEHVDQDFFHVVPHWKRGDQGORFNUHVROXWLRQIRUDVSHFLILHGWDEOH
WKDWWKHWUDQVDFWLRQDFFHVVHV:KHQWDEOHUHVHUYDWLRQLVXVHGWDEOHVDUHUHVHUYHGIRUWKH
VSHFLILHGDFFHVVZKHQWKHWUDQVDFWLRQLVVWDUWHGUDWKHUWKDQZKHQWKHWUDQVDFWLRQDFWXDOO\
DFFHVVHVWKHWDEOH7DEOHUHVHUYDWLRQLVRQO\XVHIXOLQDQHQYLURQPHQWZKHUHVLPXOWDQHRXV
WUDQVDFWLRQVVKDUHGDWDEDVHDFFHVV,WKDVWKUHHPDLQSXUSRVHV
g 3UHYHQWSRVVLEOHGHDGORFNVDQGXSGDWHFRQIOLFWVWKDWFDQRFFXULIORFNVDUHWDNHQRQO\ZKHQ
DFWXDOO\QHHGHG WKHGHIDXOWEHKDYLRU
g 3URYLGHIRUGHSHQGHQF\ORFNLQJWKHORFNLQJRIWDEOHVWKDWPD\EHDIIHFWHGE\WULJJHUVDQG
LQWHJULW\FRQVWUDLQWV:KLOHH[SOLFLWGHSHQGHQF\ORFNLQJLVQRWUHTXLUHGLWFDQDVVXUHWKDW
XSGDWHFRQIOLFWVGRQRWRFFXUEHFDXVHRILQGLUHFWWDEOHFRQIOLFWV
g &KDQJHWKHOHYHORIVKDUHGDFFHVVIRURQHRUPRUHLQGLYLGXDOWDEOHVLQDWUDQVDFWLRQ)RU
H[DPSOHDQLVFBWSEBZULWHWUDQVDFWLRQZLWKDQLVRODWLRQOHYHORILVFBWSEBFRQFXUUHQF\PD\QHHG
H[FOXVLYHXSGDWHULJKWVIRUDVLQJOHWDEOHDQGFRXOGXVHDUHVHUYDWLRQSDUDPHWHUWRJXDUDQWHH
LWVHOIVROHZULWHDFFHVVWRWKHWDEOH
9DOLGUHVHUYDWLRQVDUH
à LVFBWSEBVKDUHGLVFBWSEBORFNBZULWHZKLFKSHUPLWVDQ\WUDQVDFWLRQZLWKDQDFFHVVPRGHRI
LVFBWSEBZULWHDQGLVRODWLRQOHYHOVRILVFBWSEBFRQFXUUHQF\RULVFBWSEBUHDGBFRPPLWWHGWRXSGDWH
ZKLOHRWKHUWUDQVDFWLRQVZLWKWKHVHLVRODWLRQOHYHOVDQGDQDFFHVVPRGHRILVFBWSEBUHDGFDQ
UHDGGDWD
à LVFBWSEBVKDUHGLVFBWSEBORFNBUHDGZKLFKSHUPLWVDQ\WUDQVDFWLRQWRUHDGGDWDDQGDQ\
WUDQVDFWLRQZLWKDQDFFHVVPRGHRILVFBWSEBZULWHWRXSGDWH7KLVLVWKHPRVWOLEHUDO
UHVHUYDWLRQPRGH
à LVFBWSEBSURWHFWHGLVFBWSEBORFNBZULWHZKLFKSUHYHQWVRWKHUWUDQVDFWLRQVIURPXSGDWLQJ2WKHU
WUDQVDFWLRQVZLWKLVRODWLRQOHYHOVRILVFBWSEBFRQFXUUHQF\RULVFBWSEBUHDGBFRPPLWWHGFDQUHDG
GDWDEXWRQO\WKLVWUDQVDFWLRQFDQXSGDWH
à LVFBWSEBSURWHFWHGLVFBWSEBORFNBUHDGZKLFKSUHYHQWVDOOWUDQVDFWLRQVIURPXSGDWLQJEXW
SHUPLWVDOOWUDQVDFWLRQVWRUHDGGDWD
7KHQDPHRIWKHWDEOHWRUHVHUYHPXVWLPPHGLDWHO\IROORZWKHUHVHUYDWLRQSDUDPHWHUV)RU
H[DPSOHWKHIROORZLQJ73%GHFODUDWLRQUHVHUYHVDWDEOH(03/2<((IRUSURWHFWHGUHDG
DFFHVV
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency,
52 INTERBASE 5
STARTING TRANSACTIONS
isc_tpb_nowait,
isc_tpb_protected, isc_tpb_lock_read, "EMPLOYEE"};
6HYHUDOWDEOHVFDQEHUHVHUYHGDWWKHVDPHWLPH7KHIROORZLQJGHFODUDWLRQLOOXVWUDWHVKRZWZR
WDEOHVDUHUHVHUYHGRQHIRUSURWHFWHGUHDGWKHRWKHUIRUSURWHFWHGZULWH
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency,
isc_tpb_nowait,
isc_tpb_protected, isc_tpb_lock_read, "COUNTRY",
isc_tpb_protected, isc_tpb_lock_write, "EMPLOYEE"};
4 8VLQJWKHGHIDXOW73%
3URYLGLQJD73%IRUDWUDQVDFWLRQLVRSWLRQDO,IRQHLVQRWSURYLGHGWKHQD18//SRLQWHU
PXVWEHSDVVHGWRisc_start_transaction()LQSODFHRIDSRLQWHUWRWKH73%,QWKLVFDVH
,QWHU%DVHWUHDWVDWUDQVDFWLRQDVLIWKHIROORZLQJ73%KDGEHHQGHFODUHGIRULW
static char isc_tpb[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency,
isc_tpb_wait};
Calling isc_start_transaction( )
2QFHWUDQVDFWLRQKDQGOHVDQG73%VDUHSUHSDUHGDWUDQVDFWLRQFDQEHVWDUWHGE\FDOOLQJ
isc_start_transaction()XVLQJWKHIROORZLQJV\QWD[
ISC_STATUS isc_start_transaction(
ISC_STATUS *status vector,
isc_tr_handle *trans_handle,
short db_count,
isc_db_handle *&db_handle,
unsigned short tpb_length,
char *tpb_ad);
)RUDWUDQVDFWLRQWKDWUXQVDJDLQVWDVLQJOHGDWDEDVHVHWGEBFRXQWWRGEBKDQGOHVKRXOGEHD
GDWDEDVHKDQGOHVHWZLWKDSUHYLRXVFDOOWRisc_attach_database()WSEBOHQJWKLVWKHVL]HRI
WKH73%SDVVHGLQWKHQH[WSDUDPHWHUDQGWSEBDGLVWKHDGGUHVVRIWKH73%7KHIROORZLQJ
FRGHLOOXVWUDWHVDW\SLFDOFDOOWRisc_start_transaction()
#include <ibase.h>
. . .
ISC_STATUS status_vector[20];
API GUIDE 53
CHAPTER 5 WORKING WITH TRANSACTIONS
isc_db_handle db1;
isc_tr_handle tr1;
static char isc_tbp[] = {isc_tpb_version3,
isc_tpb_write,
isc_tpb_concurrency,
isc_tpb_wait};
. . .
/* Initialize database and transaction handles here. */
db1 = 0L;
tr1 = 0L;
. . .
/* Code for attaching to database here is omitted. */
isc_start_transaction(status_vector,
&tr1,
1,
&db1,
(unsigned short) sizeof(isc_tpb),
isc_tpb);
$WUDQVDFWLRQFDQEHRSHQHGDJDLQVWPXOWLSOHGDWDEDVHV7RGRVRVHWWKHGEBFRXQWSDUDPHWHU
WRWKHQXPEHURIGDWDEDVHVDJDLQVWZKLFKWKHWUDQVDFWLRQUXQVWKHQIRUHDFKGDWDEDVHUHSHDW
WKHGEBKDQGOHWSEBOHQJWKDQGWSEBDGSDUDPHWHUVDVDJURXSRQFHIRUHDFKGDWDEDVH)RU
H[DPSOHWKHIROORZLQJFRGHIUDJPHQWDVVXPHVWKDWWZRGDWDEDVHVDUHFRQQHFWHGZKHQWKH
WUDQVDFWLRQLVVWDUWHG
isc_start_transaction(status_vector,
&tr1,
2,
&db1,
(unsigned short) sizeof(isc_tpb),
&tpb);
&db2,
(unsigned short) sizeof(isc_tpb),
&tpb);
)RUWKHFRPSOHWHV\QWD[RIisc_start_transaction()VHHSDJH
Calling isc_start_multiple( )
$QDOWHUQDWHPHWKRGIRUVWDUWLQJDWUDQVDFWLRQDJDLQVWPXOWLSOHGDWDEDVHVLVWRXVH
isc_start_multiple()8VLQJisc_start_multiple()LVQRWUHFRPPHQGHGXQOHVV\RX
g $UHXVLQJDODQJXDJHWKDWGRHVQRWVXSSRUWDYDULDEOHQXPEHURIDUJXPHQWVLQDIXQFWLRQFDOO
54 INTERBASE 5
STARTING TRANSACTIONS
g 'RQRWNQRZKRZPDQ\GDWDEDVHV\RXZDQWWRDWWDFKWRZKHQFRGLQJWKHVWDUWRID
WUDQVDFWLRQ
&SURJUDPPHUVVKRXOGVHOGRPQHHGWRXVHWKLVIXQFWLRQ
isc_start_multiple()SDVVHVLQIRUPDWLRQDERXWHDFKWDUJHWGDWDEDVHWR,QWHU%DVHWKURXJKDQ
DUUD\RIWUDQVDFWLRQH[LVWHQFHEORFNV 7(%V 7KHUHPXVWEHRQH7(%IRUHDFKGDWDEDVH
DJDLQVWZKLFKDWUDQVDFWLRQUXQV$7(%LVDVWUXFWXUH\RXPXVWGHFODUHLQ\RXUDSSOLFDWLRQV
DVIROORZV
typdef struct {
long *db_ptr;
long tpb_len;
char *tpb_ptr;
} ISC_TEB;
GEBSWULVDSRLQWHUWRDSUHYLRXVO\GHFODUHGLQLWLDOL]HGDQGSRSXODWHGGDWDEDVHKDQGOHWSEBOHQ
LVWKHVL]HLQE\WHVRIWKHWUDQVDFWLRQSDUDPHWHUEXIIHU 73% WRXVHIRUWKHGDWDEDVHDQG
WSEBSWULVDSRLQWHUWRWKH73%LWVHOI)RULQIRUPDWLRQDERXWGHFODULQJLQLWLDOL]LQJDQG
SRSXODWLQJDGDWDEDVHKDQGOHVHH´&UHDWLQJGDWDEDVHKDQGOHVµRQSDJH )RUPRUH
LQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJD73%VHH´&UHDWLQJDWUDQVDFWLRQSDUDPHWHU
EXIIHUµRQSDJH
7RXVHD7(%VWUXFWXUHLQDQDSSOLFDWLRQGHFODUHDQDUUD\YDULDEOHRIW\SH,6&B7(%7KH
QXPEHURIDUUD\GLPHQVLRQVVKRXOGFRUUHVSRQGWRWKHQXPEHURIGDWDEDVHVWKDWWKH
WUDQVDFWLRQUXQVDJDLQVW)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVDQDUUD\RIWZR7(%V
FDSDEOHRIVXSSRUWLQJWZRGDWDEDVHV
ISC_TEB teb_array[2];
2QFHDQDUUD\RI7(%VLVGHFODUHGDQGFRUUHVSRQGLQJ7%3VDUHFUHDWHGDQGSRSXODWHGIRU
HDFKGDWDEDVHYDOXHVPD\EHDVVLJQHGWRWKHDSSURSULDWHILHOGVLQWKH7(%V)RUH[DPSOHWKH
IROORZLQJFRGHLOOXVWUDWHVKRZWZR7(%VDUHILOOHG
. . .
ISC_STATUS status_vector[20];
isc_db_handle db1, db2;
isc_tr_handle trans;
ISC_TEB teb_array[2];
. . .
db1 = db2 = 0L;
trans = 0L;
/* Code assumes that two TPBs, isc_tpb1, and isc_tpb2, are created here. */
/* Code assumes databases are attached here. */
/* assign values to TEB array */
teb_array[0].db_ptr = &db1;
teb_array[0].tpb_len = sizeof(isc_tpb1);
API GUIDE 55
CHAPTER 5 WORKING WITH TRANSACTIONS
teb_array[0].tpb_ptr = isc_tpb1;
teb_array[1].db_ptr = &db2;
teb_array[1].tpb_len = sizeof(isc_tpb2);
teb_array[1].tpb_ptr = isc_tpb2;
. . .
$IWHUWKH7(%VDUHORDGHGZLWKYDOXHVisc_start_multiple()FDQEHFDOOHGXVLQJWKH
IROORZLQJV\QWD[
ISC_STATUS isc_start_multiple(
ISC_STATUS *status_vector,
isc_tr_handle *trans_handle,
short db_handle_count,
void *teb_vector_address);
)RUH[DPSOHWKHIROORZLQJVWDWHPHQWVVWDUWVDWZRGDWDEDVHWUDQVDFWLRQ
. . .
ISC_STATUS status_vector[20];
isc_db_handle db1, db2;
isc_tr_handle trans;
ISC_TEB teb_array[2];
. . .
db1 = db2 = 0L;
trans = 0L;
/* Code assumes that two TPBs, isc_tpb1, and isc_tpb2, are created here. */
/* Code assumes databases are attached here. */
/* assign values to TEB array */
teb_array[0].db_ptr = &db1;
teb_array[0].tpb_len = sizeof(isc_tpb1);
teb_array[0].tpb_ptr = isc_tpb1;
teb_array[1].db_ptr = &db2;
teb_array[1].tpb_len = sizeof(isc_tpb2);
teb_array[1].tpb_ptr = isc_tpb2;
/* Start the transaction */
isc_start_multiple(status_vector, &trans, 2, teb_array);
. . .
Ending transactions
:KHQDWUDQVDFWLRQ·VWDVNVDUHFRPSOHWHRUDQHUURUSUHYHQWVDWUDQVDFWLRQIURPFRPSOHWLQJ
WKHWUDQVDFWLRQPXVWEHHQGHGWRVHWWKHGDWDEDVHWRDFRQVLVWHQWVWDWH7KHUHDUHWZR$3,
IXQFWLRQVWKDWHQGWUDQVDFWLRQV
56 INTERBASE 5
ENDING TRANSACTIONS
g isc_commit_transaction()PDNHVDWUDQVDFWLRQ·VFKDQJHVSHUPDQHQWLQWKHGDWDEDVH)RU
WUDQVDFWLRQVWKDWVSDQGDWDEDVHVWKLVIXQFWLRQSHUIRUPVDQDXWRPDWLFWZRSKDVHFRPPLWWR
HQVXUHWKDWDOOFKDQJHVDUHPDGHVXFFHVVIXOO\
g isc_rollback_transaction()XQGRHVDWUDQVDFWLRQ·VFKDQJHVUHWXUQLQJWKHGDWDEDVHWRLWV
SUHYLRXVVWDWHEHIRUHWKHWUDQVDFWLRQVWDUWHG7KLVIXQFWLRQLVW\SLFDOO\XVHGZKHQRQHRU
PRUHHUURUVRFFXUWKDWSUHYHQWDWUDQVDFWLRQIURPFRPSOHWLQJVXFFHVVIXOO\
%RWKisc_commit_transaction()DQGisc_rollback_transaction()FORVHWKHUHFRUGVWUHDPV
DVVRFLDWHGZLWKWKHWUDQVDFWLRQUHLQLWLDOL]HWKHWUDQVDFWLRQQDPHWR]HURDQGUHOHDVHV\VWHP
UHVRXUFHVDOORFDWHGIRUWKHWUDQVDFWLRQ)UHHGV\VWHPUHVRXUFHVDUHDYDLODEOHIRUVXEVHTXHQW
XVHE\DQ\DSSOLFDWLRQRUSURJUDP
isc_rollback_transaction()LVIUHTXHQWO\XVHGLQVLGHHUURUKDQGOLQJURXWLQHVWRFOHDQXS
WUDQVDFWLRQVZKHQHUURUVRFFXU,WFDQDOVREHXVHGWRUROOEDFNDSDUWLDOO\FRPSOHWHG
WUDQVDFWLRQSULRUWRUHWU\LQJLWDQGLWFDQEHXVHGWRUHVWRUHDGDWDEDVHWRLWVSULRUVWDWHLID
SURJUDPHQFRXQWHUVDQXQUHFRYHUDEOHHUURU
7KH$3,RIIHUVWKUHHDGGLWLRQDOIXQFWLRQVIRUFRQWUROOLQJWUDQVDFWLRQV
g isc_commit_retaining()FRPPLWVDWUDQVDFWLRQEXWUHWDLQVWKHFXUUHQWWUDQVDFWLRQ·V
FRQWH[W³WKHV\VWHPUHVRXUFHVDQGFXUVRUVWDWHVXVHGLQWKHWUDQVDFWLRQ³ZLWKRXWUHTXLULQJ
WKHRYHUKHDGRIHQGLQJDWUDQVDFWLRQVWDUWLQJDQHZRQHDQGUHHVWDEOLVKLQJFXUVRUVWDWHV,Q
DEXV\PXOWLXVHUHQYLURQPHQWPDLQWDLQLQJWUDQVDFWLRQFRQWH[WIRUHDFKXVHUVSHHGVXS
SURFHVVLQJDQGXVHVIHZHUV\VWHPUHVRXUFHVWKDQFORVLQJDWUDQVDFWLRQDQGRSHQLQJDQHZ
RQH
g isc_prepare_transaction()DQGisc_prepare_transaction2() HQDEOHDQDSSOLFDWLRQWR
SHUIRUPWKHILUVWSKDVHRIDQDXWRPDWLFWZRSKDVHFRPPLWLQLWVRZQWLPHWKHQLVVXHDFDOO
WRisc_commit_transaction()WRFRPSOHWHWKHFRPPLW
,03257$17 ,IWKHSURJUDPHQGVEHIRUHDWUDQVDFWLRQHQGVDWUDQVDFWLRQLVDXWRPDWLFDOO\UROOHGEDFNEXW
GDWDEDVHVDUHQRWFORVHG,IDSURJUDPHQGVZLWKRXWFORVLQJWKHGDWDEDVHGDWDORVVRU
FRUUXSWLRQLVSRVVLEOH7KHUHIRUHRSHQGDWDEDVHVVKRXOGDOZD\VEHFORVHGE\LVVXLQJDQ
H[SOLFLWFDOOWRisc_detach_database()
)RUPRUHLQIRUPDWLRQDERXWGHWDFKLQJIURPDGDWDEDVHVHH&KDSWHU´:RUNLQJZLWK
'DWDEDVHVµ
API GUIDE 57
CHAPTER 5 WORKING WITH TRANSACTIONS
Using isc_commit_transaction( )
8VHisc_commit_transaction()WRZULWHWUDQVDFWLRQFKDQJHVSHUPDQHQWO\WRDGDWDEDVH
isc_commit_transaction()FORVHVWKHUHFRUGVWUHDPVDVVRFLDWHGZLWKWKHWUDQVDFWLRQUHVHWV
WKHWUDQVDFWLRQQDPHWR]HURDQGIUHHVV\VWHPUHVRXUFHVDVVLJQHGWRWKHWUDQVDFWLRQIRURWKHU
XVHV7KHFRPSOHWHV\QWD[IRU isc_commit_transaction()LV
ISC_STATUS isc_commit_transaction(
ISC_STATUS *status_vector,
isc_tr_handle *trans_handle);
)RUH[DPSOHWKHIROORZLQJFDOOFRPPLWVDWUDQVDFWLRQ
isc_commit_transaction(status_vector, &trans);
ZKHUHVWDWXVBYHFWRULVDSRLQWHUWRDSUHYLRXVO\GHFODUHGHUURUVWDWXVYHFWRUDQGWUDQVLVD
SRLQWHUWRDSUHYLRXVO\GHFODUHGDQGLQLWLDOL]HGWUDQVDFWLRQKDQGOH
7,3 (YHQWUDQVDFWLRQVVWDUWHGZLWKDQDFFHVVPRGHRILVFBWSEBUHDGVKRXOGEHHQGHGZLWKDFDOOWR
isc_commit_transaction()UDWKHUWKDQisc_rollback_transaction()7KHGDWDEDVHLVQRW
FKDQJHGEXWWKHRYHUKHDGUHTXLUHGWRVWDUWVXEVHTXHQWWUDQVDFWLRQVLVJUHDWO\UHGXFHG
4 8VLQJLVFBFRPPLWBUHWDLQLQJ
7RZULWHWUDQVDFWLRQFKDQJHVWRWKHGDWDEDVHZLWKRXWHVWDEOLVKLQJDQHZWUDQVDFWLRQFRQWH[W³
WKHQDPHVV\VWHPUHVRXUFHVDQGFXUUHQWVWDWHRIFXUVRUVXVHGLQDWUDQVDFWLRQ³XVH
isc_commit_retaining()LQVWHDGRIisc_commit_transaction(),QDEXV\PXOWLXVHU
HQYLURQPHQWPDLQWDLQLQJWKHWUDQVDFWLRQFRQWH[WIRUHDFKXVHUVSHHGVXSSURFHVVLQJDQG
XVHVIHZHUV\VWHPUHVRXUFHVWKDQFORVLQJDQGVWDUWLQJDQHZWUDQVDFWLRQIRUHDFKDFWLRQ7KH
FRPSOHWHV\QWD[IRUisc_commit_retaining()LV
ISC_STATUS isc_commit_retaining(
ISC_STATUS *status_vector,
isc_tr_handle *trans_handle);
isc_commit_retaining()ZULWHVDOOSHQGLQJFKDQJHVWRWKHGDWDEDVHHQGVWKHFXUUHQW
WUDQVDFWLRQZLWKRXWFORVLQJLWVUHFRUGVWUHDPDQGFXUVRUVDQGZLWKRXWIUHHLQJLWVV\VWHP
UHVRXUFHVWKHQVWDUWVDQHZWUDQVDFWLRQDQGDVVLJQVWKHH[LVWLQJUHFRUGVWUHDPVDQGV\VWHP
UHVRXUFHVWRWKHQHZWUDQVDFWLRQ
)RUH[DPSOHWKHIROORZLQJFDOOFRPPLWVDVSHFLILHGWUDQVDFWLRQSUHVHUYLQJWKHFXUUHQWFXUVRU
VWDWXVDQGV\VWHPUHVRXUFHV
isc_commit_retaining(status_vector, &trans);
ZKHUHVWDWXVBYHFWRULVDSRLQWHUWRDSUHYLRXVO\GHFODUHGHUURUVWDWXVYHFWRUDQGWUDQVLVD
SRLQWHUWRDSUHYLRXVO\GHFODUHGDQGLQLWLDOL]HGWUDQVDFWLRQKDQGOH
58 INTERBASE 5
ENDING TRANSACTIONS
$FDOOWRisc_rollback_transaction()LVVXHGDIWHUisc_commit_retaining()RQO\UROOVEDFN
XSGDWHVDQGZULWHVRFFXUULQJDIWHUWKHFDOOWRisc_commit_retaining()
4 8VLQJLVFBSUHSDUHBWUDQVDFWLRQ
:KHQDWUDQVDFWLRQLVFRPPLWWHGDJDLQVWPXOWLSOHGDWDEDVHVXVLQJ
isc_commit_transaction(),QWHU%DVHDXWRPDWLFDOO\SHUIRUPVDWZRSKDVHFRPPLW'XULQJ
WKHILUVWSKDVHRIWKHFRPPLWWKH,QWHU%DVHHQJLQHSROOVDOOGDWDEDVHSDUWLFLSDQWVWRPDNH
VXUHWKH\DUHVWLOODYDLODEOHZULWHVDPHVVDJHGHVFULELQJWKHWUDQVDFWLRQWRWKH
5'%75$16$&7,21B'(6&5,37,21ILHOGRIWKH5'%75$16$&7,21V\VWHPWDEOHWKHQ
SXWVWKHWUDQVDFWLRQLQWRDOLPERVWDWH,WLVGXULQJWKHVHFRQGSKDVHWKDWWUDQVDFWLRQFKDQJHV
DUHDFWXDOO\FRPPLWWHGWRWKHGDWDEDVH
6RPHDSSOLFDWLRQVPD\KDYHWKHLURZQDGGLWLRQDOUHTXLUHPHQWVWRPDNHRIWKHWZRSKDVH
FRPPLW7KHVHDSSOLFDWLRQVFDQFDOO isc_prepare_transaction()WRH[HFXWHWKHILUVWSKDVHRI
WKHWZRSKDVHFRPPLWWKHQSHUIRUPWKHLURZQDGGLWLRQDOWDVNVEHIRUHFRPSOHWLQJWKH
FRPPLWZLWKDFDOOWRisc_commit_transaction()
7KHV\QWD[IRUisc_prepare_transaction()LV
ISC_STATUS isc_prepare_transaction(
ISC_STATUS *status_vector,
isc_tr_handle *trans_handle);
)RUH[DPSOHWKHIROORZLQJFRGHIUDJPHQWLOOXVWUDWHVKRZDQDSSOLFDWLRQPLJKWFDOO
isc_prepare_transaction()WKHQLWVRZQURXWLQHVEHIRUHFRPSOHWLQJDFRPPLWZLWK
isc_commit_transaction()
ISC_STATUS status_vector[20];
isc_db_handle db1;
isc_tr_handle trans;
. . .
/* Initialize handles. */
db1 = 0L;
trans = 0L;
. . .
/* Code assumes a database is attached here, */
/* and a transaction started. */
. . .
/* Perform first phase of two-phase commit. */
isc_prepare_transaction(status_vector, &trans);
/* Application does its own processing here. */
my_app_function();
/* Now complete the two-phase commit. */
isc_commit_transaction(status_vector, &trans);
API GUIDE 59
CHAPTER 5 WORKING WITH TRANSACTIONS
,03257$17 ,WLVJHQHUDOO\DGDQJHURXVSUDFWLFHWRGHOD\WKHVHFRQGSKDVHRIWKHFRPPLWDIWHU
FRPSOHWLQJWKHILUVWEHFDXVHGHOD\VLQFUHDVHWKHFKDQFHWKDWQHWZRUNRUVHUYHUSUREOHPVFDQ
RFFXUEHWZHHQSKDVHV
Using isc_prepare_transaction2( )
/LNHisc_prepare_transaction()isc_prepare_transaction2()SHUIRUPVWKHILUVWSKDVHRI
DWZRSKDVHFRPPLWH[FHSWWKDWisc_prepare_transaction2()HQDEOHV
DQDSSOLFDWLRQWRVXSSO\LWVRZQWUDQVDFWLRQGHVFULSWLRQIRULQVHUWLRQLQWRWKH
5'%75$16$&7,21B'(6&5,37,21ILHOGRIWKH5'%75$16$&7,21
V\VWHPWDEOH
,03257$17 'RQRWXVHWKLVFDOOZLWKRXWILUVWH[DPLQLQJDQGXQGHUVWDQGLQJWKHLQIRUPDWLRQ,QWHU%DVH
VWRUHVLQ5'%75$16$&7,21B'(6&5,37,21GXULQJDQDXWRPDWLFWZRSKDVHFRPPLW
6WRUDJHRILPSURSHURULQFRPSOHWHLQIRUPDWLRQFDQSUHYHQWGDWDEDVHUHFRYHU\LIWKH
WZRSKDVHFRPPLWIDLOV
)RUWKHFRPSOHWHV\QWD[RIisc_prepare_transaction2()VHHSDJH
Using isc_rollback_transaction( )
8VHisc_rollback_transaction()WRUHVWRUHWKHGDWDEDVHWRLWVFRQGLWLRQSULRUWRWKHVWDUWRI
WKHWUDQVDFWLRQisc_rollback_transaction()DOVRFORVHVWKHUHFRUGVWUHDPVDVVRFLDWHGZLWK
WKHWUDQVDFWLRQUHVHWVWKHWUDQVDFWLRQQDPHWR]HURDQGIUHHVV\VWHPUHVRXUFHVDVVLJQHGWR
WKHWUDQVDFWLRQIRURWKHUXVHVisc_rollback_transaction()W\SLFDOO\DSSHDUVLQ
HUURUKDQGOLQJURXWLQHV7KHV\QWD[IRUisc_rollback_transaction()LV
ISC_STATUS isc_rollback_transaction(
ISC_STATUS *status_vector,
isc_tr_handle *trans_handle);
)RUH[DPSOHWKHIROORZLQJFDOOUROOVEDFNDWUDQVDFWLRQ
isc_rollback_transaction(status_vector, &trans);
ZKHUHVWDWXVBYHFWRULVDSRLQWHUWRDSUHYLRXVO\GHFODUHGHUURUVWDWXVYHFWRUDQGWUDQVLVD
SRLQWHUWRDSUHYLRXVO\GHFODUHGDQGLQLWLDOL]HGWUDQVDFWLRQKDQGOH
60 INTERBASE 5
CHAPTER
61
CHAPTER 6 WORKING WITH DYNAMIC SQL
Accessing databases
7KH,QWHU%DVH$3,SHUPLWVDSSOLFDWLRQVWRDWWDFKWRPXOWLSOHGDWDEDVHVVLPXOWDQHRXVO\XVLQJ
GDWDEDVHKDQGOHV'DWDEDVHKDQGOHVPXVWEHGHFODUHGDQGLQLWLDOL]HGZKHQDQDSSOLFDWLRQLV
FRPSLOHG6HSDUDWHGDWDEDVHKDQGOHVVKRXOGEHVXSSOLHGDQGLQLWLDOL]HGIRUHDFKGDWDEDVH
DFFHVVHGVLPXOWDQHRXVO\)RUH[DPSOHWKHIROORZLQJFRGHFUHDWHVDVLQJOHKDQGOHGEDQG
LQLWLDOL]HVLWWR]HUR
#include <ibase.h>
isc_db_handle db1;
. . .
db1 = 0L;
2QFHGHFODUHGDQGLQLWLDOL]HGDGDWDEDVHKDQGOHFDQEHDVVLJQHGG\QDPLFDOO\WRDGDWDEDVHDW
UXQWLPHDVIROORZV
#include <ibase.h>
. . .
char dbname[129];
ISC_STATUS status_vector[20];
. . .
prompt_user("Name of database to open: ");
62 INTERBASE 5
DSQL API LIMITATIONS
gets(dbname);
isc_attach_database(status_vector, 0, dbname, &db1, NULL, NULL);
$GDWDEDVHKDQGOHFDQEHXVHGWRDWWDFKWRGLIIHUHQWGDWDEDVHVDVORQJDVDSUHYLRXVO\DWWDFKHG
GDWDEDVHLVILUVWGHWDFKHGZLWKisc_detach_database()ZKLFKDXWRPDWLFDOO\VHWVGDWDEDVH
KDQGOHVWR18//7KHIROORZLQJVWDWHPHQWVGHWDFKIURPDGDWDEDVHVHWWKHGDWDEDVHKDQGOH
WR]HURDQGDWWDFKWRDQHZGDWDEDVH
isc_detach_database(status_vector, &db1);
isc_attach_database(status_vector, 0, "employee.gdb", &db1, NULL, NULL);
)RUPRUHLQIRUPDWLRQDERXW$3,IXQFWLRQFDOOVIRUGDWDEDVHVVHH&KDSWHU´:RUNLQJZLWK
'DWDEDVHVµ
Handling transactions
,QWHU%DVHUHTXLUHVWKDWDOOWUDQVDFWLRQKDQGOHVEHGHFODUHGZKHQDQDSSOLFDWLRQLVFRPSLOHG
2QFHIL[HGDWFRPSLOHWLPHWUDQVDFWLRQKDQGOHVFDQQRWEHFKDQJHGDWUXQWLPHQRUFDQQHZ
KDQGOHVEHGHFODUHGG\QDPLFDOO\DWUXQWLPH0RVW$3,IXQFWLRQVWKDWSURFHVV64/
VWDWHPHQWVDWUXQWLPHVXFKDVisc_dsql_describe()isc_dsql_describe_bind()
isc_dsql_execute()isc_dsql_execute2()isc_dsql_execute_immediate()
isc_dsql_exec_immed2()DQGisc_dsql_prepare()VXSSRUWWKHLQFOXVLRQRIDWUDQVDFWLRQ
KDQGOHSDUDPHWHU7KH64/VWDWHPHQWVSURFHVVHGE\WKHVHIXQFWLRQVFDQQRWSDVVWUDQVDFWLRQ
KDQGOHVHYHQLIWKH64/V\QWD[IRUWKHVWDWHPHQWSHUPLWVWKHXVHRID75$16$&7,21FODXVH
%HIRUHDWUDQVDFWLRQKDQGOHFDQEHXVHGLWPXVWEHGHFODUHGDQGLQLWLDOL]HGWR]HUR7KH
IROORZLQJFRGHGHFODUHVLQLWLDOL]HVDQGXVHVDWUDQVDFWLRQKDQGOHLQDQ$3,FDOOWKDWDOORFDWHV
DQGSUHSDUHVDQ64/VWDWHPHQWIRUH[HFXWLRQ
#include <ibase.h>
. . .
isc_tr_handle trans; /* Declare a transaction handle. */
isc_stmt_handle stmt; /* Declare a statement handle. */
char *sql_stmt = "SELECT * FROM EMPLOYEE";
isc_db_handle db1;
ISC_STATUS status_vector[20];
. . .
trans = 0L; /* Initialize the transaction handle to zero. */
stmt = NULL; /* Set handle to NULL before allocation. */
/* This code assumes both that a database attachment is made, */
/* and a transaction is started here. */
. . .
/* Allocate the SQL statement handle. */
isc_dsql_allocate_statement(status_vector, &db1, &stmt);
API GUIDE 63
CHAPTER 6 WORKING WITH DYNAMIC SQL
Creating a database
7RFUHDWHDQHZGDWDEDVHLQDQ$3,DSSOLFDWLRQ
'HWDFKIURPDQ\FXUUHQWO\DWWDFKHGGDWDEDVHVZLWKisc_detach_database()
'HWDFKLQJIURPDGDWDEDVHDXWRPDWLFDOO\VHWVLWVGDWDEDVHKDQGOHWR18//
%XLOGWKH&5($7('$7$%$6(VWDWHPHQWWRSURFHVV
([HFXWHWKHVWDWHPHQWZLWKisc_dsql_execute_immediate()RU
isc_dsql_exec_immed2()
)RUH[DPSOHWKHIROORZLQJVWDWHPHQWVGLVFRQQHFWIURPDQ\FXUUHQWO\DWWDFKHGGDWDEDVHVDQG
FUHDWHDQHZGDWDEDVH$Q\H[LVWLQJGDWDEDVHKDQGOHVDUHVHWWR18//VRWKDWWKH\FDQEH
XVHGWRFRQQHFWWRWKHQHZGDWDEDVHLQIXWXUH'64/VWDWHPHQWV
char *str = "CREATE DATABASE \"new_emp.gdb\"";
. . .
isc_detach_database(status_vector, &db1);
isc_dsql_execute_immediate(status_vector, &db1, &trans, 0, str, 1,
NULL);
64 INTERBASE 5
WRITING AN API APPLICATION TO PROCESS SQL STATEMENTS
API GUIDE 65
CHAPTER 6 WORKING WITH DYNAMIC SQL
7KHIROORZLQJWDEOHOLVWV64/VWDWHPHQWVWKDWFDQQRWEHSURFHVVHGE\'64/IXQFWLRQV
Statement Statement
CLOSE DECLARE CURSOR
DESCRIBE EXECUTE
OPEN PREPARE
7KHVHVWDWHPHQWVDUHXVHGWRSURFHVV'64/UHTXHVWVRUWRKDQGOH64/FXUVRUVZKLFKPXVW
DOZD\VEHVSHFLILHGZKHQDQDSSOLFDWLRQLVZULWWHQ$WWHPSWLQJWRXVHWKHPZLWK'64/
UHVXOWVLQUXQWLPHHUURUV
Note 7KHVHPLFRORQWKDWDSSHDUVDWWKHHQGRIWKLVFKDUGHFODUDWLRQLVD&WHUPLQDWRUDQG
QRWSDUWRIWKH64/VWDWHPHQWVWULQJ
66 INTERBASE 5
UNDERSTANDING THE XSQLDA
,WLVDOVRSRVVLEOHWREXLOGVWULQJVDWUXQWLPHIURPDFRPELQDWLRQRIFRQVWDQWV7KLVPHWKRG
LVXVHIXOIRUVWDWHPHQWVZKHUHWKHYDULDEOHLVQRWDWUXHFRQVWDQWRULWLVDWDEOHRUFROXPQ
QDPHDQGZKHUHWKHVWDWHPHQWLVH[HFXWHGRQO\RQFHLQWKHDSSOLFDWLRQ
7RSDVVDSDUDPHWHUDVDSODFHKROGHUWKHYDOXHLVSDVVHGDVDTXHVWLRQPDUN " HPEHGGHG
ZLWKLQWKHVWDWHPHQWVWULQJ
char *str = "DELETE FROM CUSTOMER WHERE CUST_NO = ?";
:KHQD'64/IXQFWLRQSURFHVVHVDVWDWHPHQWFRQWDLQLQJDSODFHKROGHULWUHSODFHVWKH
TXHVWLRQPDUNZLWKDYDOXHVXSSOLHGLQDQH[WHQGHG64/GHVFULSWRUDUHD ;64/'$ SUHYLRXVO\
GHFODUHGDQGSRSXODWHGLQWKHDSSOLFDWLRQ8VHSODFHKROGHUVLQVWDWHPHQWVWKDWDUHSUHSDUHG
RQFHEXWH[HFXWHGPDQ\WLPHVZLWKGLIIHUHQWSDUDPHWHUYDOXHV
5HSODFHDEOHYDOXHSDUDPHWHUVDUHRIWHQXVHGWRVXSSO\YDOXHVLQ64/6(/(&7VWDWHPHQW
:+(5(FODXVHFRPSDULVRQVDQGLQWKH83'$7(VWDWHPHQW6(7FODXVH
API GUIDE 67
CHAPTER 6 WORKING WITH DYNAMIC SQL
7KHIROORZLQJILJXUHLOOXVWUDWHVWKHUHODWLRQVKLSEHWZHHQWKH;64/'$DQGWKH;64/9$5
68 INTERBASE 5
UNDERSTANDING THE XSQLDA
7KHisc_dsql_prepare(),isc_dsql_describe()DQGisc_dsql_describe_bind()IXQFWLRQV
FDQEHXVHGWRGHWHUPLQHWKHSURSHUQXPEHURI;64/9$5VWUXFWXUHVWRDOORFDWHDQGWKH
;64/'$B/(1*7+PDFURFDQEHXVHGWRDOORFDWHWKHSURSHUDPRXQWRIVSDFH)RUPRUH
LQIRUPDWLRQDERXWWKH;64/'$B/(1*7+PDFURVHH´8VLQJWKH;64/'$B/(1*7+
PDFURµRQSDJH
API GUIDE 69
CHAPTER 6 WORKING WITH DYNAMIC SQL
7KHIROORZLQJWDEOHGHVFULEHVWKHILHOGVWKDWFRPSULVHWKH;64/9$5VWUXFWXUH
70 INTERBASE 5
UNDERSTANDING THE XSQLDA
Input descriptors
,QSXWGHVFULSWRUVDUHXVHGWRSURFHVV64/VWDWHPHQWVWULQJVWKDWFRQWDLQSDUDPHWHUV%HIRUH
DQDSSOLFDWLRQFDQH[HFXWHDVWDWHPHQWZLWKSDUDPHWHUVLWPXVWVXSSO\YDOXHVIRUWKHP7KH
DSSOLFDWLRQLQGLFDWHVWKHQXPEHURISDUDPHWHUVSDVVHGLQWKH;64/'$VTOGILHOGWKHQ
GHVFULEHVHDFKSDUDPHWHULQDVHSDUDWH;64/9$5VWUXFWXUH)RUH[DPSOHWKHIROORZLQJ
VWDWHPHQWVWULQJFRQWDLQVWZRSDUDPHWHUVVRDQDSSOLFDWLRQPXVWVHWVTOGWRDQGGHVFULEH
HDFKSDUDPHWHU
char *str = "UPDATE DEPARTMENT SET BUDGET = ? WHERE LOCATION = ?";
:KHQWKHVWDWHPHQWLVH[HFXWHGWKHILUVW;64/9$5VXSSOLHVLQIRUPDWLRQDERXWWKH%8'*(7
YDOXHDQGWKHVHFRQG;64/9$5VXSSOLHVWKH/2&$7,21YDOXH
)RUPRUHLQIRUPDWLRQDERXWXVLQJLQSXWGHVFULSWRUVVHH´'64/SURJUDPPLQJPHWKRGVµRQ
SDJH
Output descriptors
2XWSXWGHVFULSWRUVUHWXUQYDOXHVIURPDQH[HFXWHGTXHU\WRDQDSSOLFDWLRQ7KHVTOGILHOGRI
WKH;64/'$LQGLFDWHVKRZPDQ\YDOXHVZHUHUHWXUQHG(DFKYDOXHLVVWRUHGLQDVHSDUDWH
;64/9$5VWUXFWXUH7KH;64/'$VTOYDUILHOGSRLQWVWRWKHILUVWRIWKHVH;64/9$5VWUXFWXUHV
7KHIROORZLQJVWDWHPHQWVWULQJUHTXLUHVDQRXWSXWGHVFULSWRU
API GUIDE 71
CHAPTER 6 WORKING WITH DYNAMIC SQL
)RUPRUHLQIRUPDWLRQDERXWXVLQJWKH;64/'$B/(1*7+PDFURVHH´'64/SURJUDPPLQJ
PHWKRGVµRQSDJH
sqlind
SQL datatype Macro expression C datatype or typedef used?
Array SQL_ARRAY ISC_QUAD No
Array SQL_ARRAY + 1 ISC_QUAD Yes
Blob SQL_BLOB ISC_QUAD No
TABLE 6.4 SQL datatypes, macro expressions, and C datatypes
72 INTERBASE 5
UNDERSTANDING THE XSQLDA
sqlind
SQL datatype Macro expression C datatype or typedef used?
BLOB SQL_BLOB + 1 ISC_QUAD Yes
CHAR SQL_TEXT char[] No
CHAR SQL_TEXT + 1 char[] Yes
DATE SQL_DATE ISC_QUAD No
DATE SQL_DATE + 1 ISC_QUAD Yes
DECIMAL SQL_SHORT, SQL_LONG, or SQL_DOUBLE int, long, or double No
DECIMAL SQL_SHORT + 1, SQL_LONG + 1, or SQL_DOUBLE + 1 int, long, or double Yes
DOUBLE SQL_DOUBLE double No
PRECISON
API GUIDE 73
CHAPTER 6 WORKING WITH DYNAMIC SQL
Note '(&,0$/DQG180(5,&GDWDW\SHVDUHVWRUHGLQWHUQDOO\DV60$//,17,17(*(5RU
'28%/(35(&,6,21GDWDW\SHV7RVSHFLI\WKHFRUUHFWPDFURH[SUHVVLRQWRSURYLGHIRUD
'(&,0$/RU180(5,&FROXPQXVHisqlWRH[DPLQHWKHFROXPQGHILQLWLRQLQWKHWDEOHWRVHH
KRZ,QWHU%DVHLVVWRULQJFROXPQGDWDWKHQFKRRVHDFRUUHVSRQGLQJPDFURH[SUHVVLRQ
7KHGDWDW\SHLQIRUPDWLRQIRUDSDUDPHWHURUVHOHFWOLVWLWHPLVFRQWDLQHGLQWKHVTOW\SHILHOGRI
WKH;64/9$5VWUXFWXUH7KHYDOXHFRQWDLQHGLQVTOW\SHSURYLGHVWZRSLHFHVRILQIRUPDWLRQ
g 7KHGDWDW\SHRIWKHSDUDPHWHURUVHOHFWOLVWLWHP
g :KHWKHUVTOLQGLVXVHGWRLQGLFDWH18//YDOXHV,IVTOLQGLVXVHGLWVYDOXHVSHFLILHVZKHWKHUWKH
SDUDPHWHURUVHOHFWOLVWLWHPLV18// ² RUQRW18//
)RUH[DPSOHLIVTOW\SHHTXDOV64/B7(;7WKHSDUDPHWHURUVHOHFWOLVWLWHPLVD&+$5WKDWGRHV
QRWXVHVTOLQGWRFKHFNIRUD18//YDOXH EHFDXVHLQWKHRU\18//YDOXHVDUHQRWDOORZHGIRU
LW ,IVTOW\SHHTXDOV64/B7(;7WKHQVTOLQGFDQEHFKHFNHGWRVHHLIWKHSDUDPHWHURU
VHOHFWOLVWLWHPLV18//
%\GHIDXOWERWKisc_dsql_prepare()DQGisc_dsql_describe()UHWXUQDPDFURH[SUHVVLRQRI
W\SHVRVTOLQGVKRXOGDOZD\VEHH[DPLQHGIRU18//YDOXHVZLWKWKHVHVWDWHPHQWV
74 INTERBASE 5
UNDERSTANDING THE XSQLDA
$SSOLFDWLRQVFDQLQVWHDGGHWHFWDQGSURFHVVYDULDEOHOHQJWKGDWDGLUHFWO\7RGRVRWKH\PXVW
H[WUDFWWKHILUVWWZRE\WHVIURPWKHVWULQJWRGHWHUPLQHWKHE\WHOHQJWKRIWKHVWULQJLWVHOI
WKHQUHDGWKHVWULQJE\WHE\E\WHLQWRDQXOOWHUPLQDWHGEXIIHU
Coercing datatypes
6RPHWLPHVZKHQSURFHVVLQJ'64/LQSXWSDUDPHWHUVDQGVHOHFWOLVWLWHPVLWLVGHVLUDEOHRU
QHFHVVDU\WRWUDQVODWHRQHGDWDW\SHWRDQRWKHU7KLVSURFHVVLVUHIHUUHGWRDVGDWDW\SHFRHUFLRQ
)RUH[DPSOHGDWDW\SHFRHUFLRQLVRIWHQXVHGZKHQSDUDPHWHUVRUVHOHFWOLVWLWHPVDUHRIW\SH
9$5&+$57KHILUVWWZRE\WHVRI9$5&+$5GDWDFRQWDLQVWULQJOHQJWKLQIRUPDWLRQZKLOHWKH
UHPDLQGHURIWKHGDWDLVWKHVWULQJWRSURFHVV%\FRHUFLQJWKHGDWDIURP64/B9$5<,1*WR
64/B7(;7GDWDSURFHVVLQJFDQEHVLPSOLILHG
&RHUFLRQFDQRQO\EHIURPRQHFRPSDWLEOHGDWDW\SHWRDQRWKHU)RUH[DPSOH64/B9$5<,1*
WR64/B7(;7RU64/B6+257WR64/B/21*
4 &RHUFLQJFKDUDFWHUGDWDW\SHV
7RFRHUFH64/B9$5<,1*GDWDW\SHVWR64/B7(;7GDWDW\SHVFKDQJHWKHVTOW\SHILHOGLQWKH
SDUDPHWHU·VRUVHOHFWOLVWLWHP·V;64/9$5VWUXFWXUHWRWKHGHVLUHG64/PDFURGDWDW\SH
FRQVWDQW)RUH[DPSOHWKHIROORZLQJVWDWHPHQWDVVXPHVWKDWYDULVDSRLQWHUWRDQ;64/9$5
VWUXFWXUHDQGWKDWLWFRQWDLQVDQ64/B9$5<,1*GDWDW\SHWRFRQYHUWWR64/B7(;7
var->sqltype = SQL_TEXT;
API GUIDE 75
CHAPTER 6 WORKING WITH DYNAMIC SQL
$IWHUFRHUFLQJDFKDUDFWHUGDWDW\SHSURYLGHSURSHUVWRUDJHVSDFHIRULW7KH;64/9$5ILHOG
VTOOHQFRQWDLQVLQIRUPDWLRQDERXWWKHVL]HRIWKHXQFRHUFHGGDWD
6HWWKH;64/9$5VTOGDWDILHOGWRWKHDGGUHVVRIWKHGDWD
4 &RHUFLQJQXPHULFGDWDW\SHV
7RFRHUFHRQHQXPHULFGDWDW\SHWRDQRWKHUFKDQJHWKHVTOW\SHILHOGLQWKHSDUDPHWHU·VRU
VHOHFWOLVWLWHP·V;64/9$5VWUXFWXUHWRWKHGHVLUHG64/PDFURGDWDW\SHFRQVWDQW)RU
H[DPSOHWKHIROORZLQJVWDWHPHQWDVVXPHVWKDWYDULVDSRLQWHUWRDQ;64/9$5VWUXFWXUHDQG
WKDWLWFRQWDLQVDQ64/B6+257GDWDW\SHWRFRQYHUWWR64/B/21*
var->sqltype = SQL_LONG;
,03257$17 'RQRWFRHUFHDODUJHUGDWDW\SHWRDVPDOOHURQH'DWDFDQEHORVWLQVXFKDWUDQVODWLRQ
4 6HWWLQJD18//LQGLFDWRU
,IDSDUDPHWHURUVHOHFWOLVWLWHPFRQWDLQVD18//YDOXHWKHVTOLQGILHOGVKRXOGEHXVHGWR
LQGLFDWHLWV18//VWDWXV$SSURSULDWHVWRUDJHVSDFHPXVWEHDOORFDWHGIRUVTOLQGEHIRUHYDOXHV
FDQEHVWRUHGWKHUH
%HIRUHLQVHUWLRQVHWVTOLQGWR²WRLQGLFDWHWKDW18//YDOXHVDUHOHJDO2WKHUZLVHVHWVTOLQG
WR
$IWHUVHOHFWLRQDQVTOLQGRI²LQGLFDWHVDILHOGFRQWDLQVD18//YDOXH2WKHUYDOXHVLQGLFDWH
DILHOGFRQWDLQVQRQ18//GDWD
76 INTERBASE 5
DSQL PROGRAMMING METHODS
$XVHIXOUXOHRIWKXPELVWKDWWKHVL]HRIDGDWDW\SHLVDOZD\VDYDOLGDOLJQPHQWQXPEHUIRU
WKHGDWDW\SH)RUDJLYHQW\SH7LIVL]HRI 7 HTXDOVQWKHQDGGUHVVHVGLYLVLEOHE\QDUH
FRUUHFWO\DOLJQHGIRU77KHIROORZLQJPDFURH[SUHVVLRQFDQEHXVHGWRDOLJQGDWD
#define ALIGN(ptr, n) ((ptr + n - 1) & ~(n - 1))
ZKHUHSWULVDSRLQWHUWRFKDU
7KHIROORZLQJFRGHLOOXVWUDWHVKRZWKH$/,*1PDFURPLJKWEHXVHG
char *buffer_pointer, *next_aligned;
next_aligned = ALIGN(buffer_pointer, sizeof(T));
API GUIDE 77
CHAPTER 6 WORKING WITH DYNAMIC SQL
4 8VLQJLVFBGVTOBH[HFXWHBLPPHGLDWH
7RH[HFXWHDVWDWHPHQWVWULQJDVLQJOHWLPHXVH
isc_dsql_execute_immediate()
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQWDLQVWKH64/
VWDWHPHQWWREHSURFHVVHG)RUH[DPSOHWKHIROORZLQJVWDWHPHQWFUHDWHVDQ64/
VWDWHPHQWVWULQJ
char *str = "UPDATE DEPARTMENT SET BUDGET = BUDGET * 1.05";
3DUVHDQGH[HFXWHWKHVWDWHPHQWVWULQJXVLQJisc_dsql_execute_immediate()
isc_dsql_execute_immediate(status_vector, &db1, &trans, 0, str, 1, NULL);
Note isc_dsql_execute_immediate()DOVRDFFHSWVVWULQJOLWHUDOV)RUH[DPSOH
isc_dsql_execute_immediate(status_vector, &db1, &trans, 0,
"UPDATE DEPARTMENT SET BUDGET = BUDGET * 1.05", 1, NULL);
)RUWKHFRPSOHWHV\QWD[RIisc_dsq_execute_immediate()DQGDQH[SODQDWLRQRILWV
SDUDPHWHUVVHH&KDSWHU´$3,)XQFWLRQ5HIHUHQFHµ
4 8VLQJLVFBGVTOBSUHSDUH DQGLVFBGVTOBH[HFXWH
7RH[HFXWHDVWDWHPHQWVWULQJVHYHUDOWLPHVXVHisc_dsql_allocate_statement()
isc_dsql_prepare()DQGisc_dsql_execute()
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQWDLQVWKH64/
VWDWHPHQWWREHSURFHVVHG)RUH[DPSOHWKHIROORZLQJVWDWHPHQWFUHDWHVDQ64/
VWDWHPHQWVWULQJ
char *str = "UPDATE DEPARTMENT SET BUDGET = BUDGET * 1.05";
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate_statement()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
. . .
isc_dsql_allocate_statement(status_vector, &db1, &stmt);
3DUVHWKHVWDWHPHQWVWULQJZLWKisc_dsql_prepare()7KLVVHWVWKHVWDWHPHQW
KDQGOH VWPW WRUHIHUWRWKHSDUVHGIRUPDW7KHVWDWHPHQWKDQGOHLVXVHGLQ
VXEVHTXHQWFDOOVWRisc_dsql_execute()
isc_dsql_prepare(status_vector, &trans, &stmt, 0, str, 1, NULL);
Note isc_dsql_prepare()DOVRDFFHSWVVWULQJOLWHUDOV)RUH[DPSOH
isc_dsql_prepare(status_vector, &trans, &stmt, 0,
"UPDATE DEPARTMENT SET BUDGET = BUDGET * 1.05", 1, NULL);
78 INTERBASE 5
DSQL PROGRAMMING METHODS
([HFXWHWKHQDPHGVWDWHPHQWVWULQJXVLQJisc_dsql_execute())RUH[DPSOH
WKHIROORZLQJVWDWHPHQWH[HFXWHVDVWDWHPHQWVWULQJQDPHGVWPW
isc_dsql_execute(status_vector, &trans, &stmt, 1, NULL);
2QFHDVWDWHPHQWVWULQJLVSUHSDUHGLWFDQEHH[HFXWHGDVPDQ\WLPHVDVUHTXLUHGLQDQ
DSSOLFDWLRQ
4 &UHDWLQJWKHLQSXW;64/'$
3ODFHKROGHUSDUDPHWHUVDUHUHSODFHGZLWKDFWXDOGDWDEHIRUHDSUHSDUHG64/VWDWHPHQWVWULQJ
LVH[HFXWHG%HFDXVHWKRVHSDUDPHWHUVDUHXQNQRZQZKHQWKHVWDWHPHQWVWULQJLVFUHDWHGDQ
LQSXW;64/'$PXVWEHFUHDWHGWRVXSSO\SDUDPHWHUYDOXHVDWH[HFXWHWLPH7RSUHSDUHWKH
;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$QHHGHGWRSURFHVVSDUDPHWHUV)RU
H[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVDQ;64/'$FDOOHGLQBVTOGD
XSQLDA *in_sqlda;
2SWLRQDOO\GHFODUHDYDULDEOHIRUDFFHVVLQJWKH;64/9$5VWUXFWXUHRIWKH
;64/'$
XSQLVAR *var;
'HFODULQJDSRLQWHUWRWKH;64/9$5VWUXFWXUHLVQRWQHFHVVDU\EXWFDQVLPSOLI\
UHIHUHQFLQJWKHVWUXFWXUHLQVXEVHTXHQWVWDWHPHQWV
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
IROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRULQBVTOGD
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(10));
,QWKLVVWDWHPHQWVSDFHIRU;64/9$5VWUXFWXUHVLVDOORFDWHGDOORZLQJWKH;64/'$WR
DFFRPPRGDWHXSWRSDUDPHWHUV
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOGWR
LQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
in_sqlda->version = SQLDA_VERSION1;
in_sqlda->sqln = 10;
API GUIDE 79
CHAPTER 6 WORKING WITH DYNAMIC SQL
4 3UHSDULQJDQGH[HFXWLQJDVWDWHPHQWVWULQJZLWKSDUDPHWHUV
$IWHUDQ;64/'$LVFUHDWHGIRUKROGLQJDVWDWHPHQWVWULQJ·VSDUDPHWHUVWKHVWDWHPHQWVWULQJ
FDQEHFUHDWHGDQGSUHSDUHG/RFDOYDULDEOHVFRUUHVSRQGLQJWRWKHSODFHKROGHUSDUDPHWHUVLQ
WKHVWULQJPXVWEHDVVLJQHGWRWKHLUFRUUHVSRQGLQJVTOGDWDILHOGVLQWKH;64/9$5VWUXFWXUHV
7RSUHSDUHDQGH[HFXWHDQRQTXHU\VWDWHPHQWVWULQJZLWKSDUDPHWHUVIROORZWKHVHVWHSV
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQWDLQVWKH64/
VWDWHPHQWWREHSURFHVVHG)RUH[DPSOHWKHIROORZLQJVWDWHPHQWFUHDWHVDQ64/
VWDWHPHQWVWULQJZLWKSODFHKROGHUSDUDPHWHUV
char *str = "UPDATE DEPARTMENT SET BUDGET = ?, LOCATION = ?";
7KLVVWDWHPHQWVWULQJFRQWDLQVWZRSDUDPHWHUVDYDOXHWREHDVVLJQHGWRWKH%8'*(7
FROXPQDQGDYDOXHWREHDVVLJQHGWRWKH/2&$7,21FROXPQ
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
. . .
isc_dsql_allocate_statement(status_vector, &db1, &stmt);
3DUVHWKHVWDWHPHQWVWULQJZLWKisc_dsql_prepare()7KLVVHWVWKHVWDWHPHQW
KDQGOH VWPW WRUHIHUWRWKHSDUVHGIRUPDW7KHVWDWHPHQWKDQGOHLVXVHGLQ
VXEVHTXHQWFDOOVWRisc_dsql_describe_bind()DQGisc_dsql_execute()
isc_dsql_prepare(status_vector, &trans, &stmt, 0, str, 1, in_sqlda);
8VHisc_dsql_describe_bind()WRILOOWKHLQSXW;64/'$ZLWKLQIRUPDWLRQ
DERXWWKHSDUDPHWHUVFRQWDLQHGLQWKH64/VWDWHPHQW
isc_dsql_decribe_bind(status_vector, &stmt, 1, in_sqlda);
&RPSDUHWKHYDOXHRIWKHVTOQILHOGRIWKH;64/'$WRWKHYDOXHRIWKHVTOGILHOG
WRPDNHVXUHHQRXJK;64/9$5VDUHDOORFDWHGWRKROGLQIRUPDWLRQDERXWHDFK
SDUDPHWHUVTOQVKRXOGEHDWOHDVWDVODUJHDVVTOG,IQRWIUHHWKHVWRUDJH
SUHYLRXVO\DOORFDWHGWRWKHLQSXWGHVFULSWRUUHDOORFDWHVWRUDJHWRUHIOHFWWKH
QXPEHURISDUDPHWHUVVSHFLILHGE\VTOGUHVHWVTOQDQGYHUVLRQWKHQH[HFXWH
isc_dsql_describe_bind()DJDLQ
if (in_sqlda->sqld > in_sqlda->sqln)
{
n = in_sqlda->sqld;
free(in_sqlda);
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
in_sqlda->sqln = n
in_sqlda->version = SQLDA_VERSION1;
80 INTERBASE 5
DSQL PROGRAMMING METHODS
3URFHVVHDFK;64/9$5SDUDPHWHUVWUXFWXUHLQWKH;64/'$3URFHVVLQJD
SDUDPHWHUVWUXFWXUHLQYROYHVXSWRIRXUVWHSV
&RHUFHDSDUDPHWHU·VGDWDW\SH RSWLRQDO
$OORFDWHORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH;64/9$57KLV
VWHSLVRQO\UHTXLUHGLIVSDFHIRUORFDOYDULDEOHVLVQRWDOORFDWHGXQWLOUXQWLPH7KH
IROORZLQJH[DPSOHLOOXVWUDWHVG\QDPLFDOORFDWLRQRIORFDOYDULDEOHVWRUDJHVSDFH
3URYLGHDYDOXHIRUWKHSDUDPHWHUFRQVLVWHQWZLWKLWVGDWDW\SH UHTXLUHG
3URYLGHD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU
7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHVHVWHSVORRSLQJWKURXJKHDFK;64/9$5
VWUXFWXUHLQWKHLQBVTOGD;64/'$
for (i=0, var = in_sqlda->sqlvar; i < in_sqlda->sqld; i++, var++)
{
/* Process each XSQLVAR parameter structure here.
Var points to the parameter structure. */
API GUIDE 81
CHAPTER 6 WORKING WITH DYNAMIC SQL
)RUPRUHLQIRUPDWLRQDERXWGDWDW\SHFRHUFLRQDQG18//LQGLFDWRUVVHH´&RHUFLQJ
GDWDW\SHVµRQSDJH
([HFXWHWKHQDPHGVWDWHPHQWVWULQJZLWKisc_dsql_execute())RUH[DPSOHWKH
IROORZLQJVWDWHPHQWH[HFXWHVDVWDWHPHQWVWULQJQDPHGVWPW
isc_dsql_execute(status_vector, &trans, &stmt, 1, in_sqlda);
4 5HH[HFXWLQJWKHVWDWHPHQWVWULQJ
2QFHDQRQTXHU\VWDWHPHQWVWULQJZLWKSDUDPHWHUVLVSUHSDUHGLWFDQEHH[HFXWHGDVRIWHQ
DVUHTXLUHGLQDQDSSOLFDWLRQ%HIRUHHDFKVXEVHTXHQWH[HFXWLRQWKHLQSXW;64/'$FDQEH
VXSSOLHGZLWKQHZSDUDPHWHUDQG18//LQGLFDWRUGDWD
7RVXSSO\QHZSDUDPHWHUDQG18//LQGLFDWRUGDWDIRUDSUHSDUHGVWDWHPHQWUHSHDWVWHSRI
´3UHSDULQJDQGH[HFXWLQJDVWDWHPHQWVWULQJZLWKSDUDPHWHUVµRQSDJH
4 3UHSDULQJWKHRXWSXW;64/'$
0RVWTXHULHVUHWXUQRQHRUPRUHURZVRIGDWDUHIHUUHGWRDVDVHOHFWOLVW%HFDXVHWKHQXPEHU
DQGNLQGRILWHPVUHWXUQHGDUHXQNQRZQZKHQDVWDWHPHQWVWULQJLVFUHDWHGDQRXWSXW
;64/'$PXVWEHFUHDWHGWRVWRUHVHOHFWOLVWLWHPVWKDWDUHUHWXUQHGDWUXQWLPH7RSUHSDUH
WKH;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$QHHGHGWRVWRUHWKHFROXPQGDWDIRUHDFK
URZWKDWZLOOEHIHWFKHG)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVDQ
;64/'$FDOOHGRXWBVTOGD
XSQLDA *out_sqlda;
82 INTERBASE 5
DSQL PROGRAMMING METHODS
2SWLRQDOO\GHFODUHDYDULDEOHIRUDFFHVVLQJWKH;64/9$5VWUXFWXUHRIWKH
;64/'$
XSQLVAR *var;
'HFODULQJDSRLQWHUWRWKH;64/9$5VWUXFWXUHLVQRWQHFHVVDU\EXWFDQVLPSOLI\
UHIHUHQFLQJWKHVWUXFWXUHLQVXEVHTXHQWVWDWHPHQWV
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
IROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRURXWBVTOGD
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(10));
6SDFHIRU;64/9$5VWUXFWXUHVLVDOORFDWHGLQWKLVVWDWHPHQWHQDEOLQJWKH;64/'$WR
DFFRPPRGDWHXSWRVHOHFWOLVWLWHPV
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOG
RIWKH;64/'$WRLQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
out_sqlda->version = SQLDA_VERSION1;
out_sqlda->sqln = 10;
4 3UHSDULQJDTXHU\VWDWHPHQWVWULQJZLWKRXWSDUDPHWHUV
$IWHUDQ;64/'$LVFUHDWHGIRUKROGLQJWKHLWHPVUHWXUQHGE\DTXHU\VWDWHPHQWVWULQJWKH
VWDWHPHQWVWULQJFDQEHFUHDWHGSUHSDUHGDQGGHVFULEHG:KHQDVWDWHPHQWVWULQJLV
H[HFXWHG,QWHU%DVHFUHDWHVWKHVHOHFWOLVWRIVHOHFWHGURZV
7RSUHSDUHDTXHU\VWDWHPHQWVWULQJIROORZWKHVHVWHSV
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQWDLQVWKH64/
VWDWHPHQWWREHSURFHVVHG)RUH[DPSOHWKHIROORZLQJVWDWHPHQWFUHDWHVDQ64/
VWDWHPHQWVWULQJWKDWSHUIRUPVDTXHU\
char *str = "SELECT * FROM CUSTOMER";
7KHVWDWHPHQWDSSHDUVWRKDYHRQO\RQHVHOHFWOLVWLWHP 7KHDVWHULVNLVDZLOGFDUG
V\PEROWKDWVWDQGVIRUDOORIWKHFROXPQVLQWKHWDEOHVRWKHDFWXDOQXPEHURILWHPV
UHWXUQHGHTXDOVWKHQXPEHURIFROXPQVLQWKHWDEOH
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
. . .
isc_dsql_allocate_statement(status_vector, &db1, &stmt);
API GUIDE 83
CHAPTER 6 WORKING WITH DYNAMIC SQL
3DUVHWKHVWDWHPHQWVWULQJZLWKisc_dsql_prepare()7KLVVHWVWKHVWDWHPHQW
KDQGOH VWPW WRUHIHUWRWKHSDUVHGIRUPDW7KHVWDWHPHQWKDQGOHLVXVHGLQ
VXEVHTXHQWFDOOVWRVWDWHPHQWVVXFKDVisc_dsql_describe()DQG
isc_dsql_execute()
isc_dsql_prepare(status_vector, &trans, &stmt, 0, str, 1, NULL);
8VHisc_dsql_describe()WRILOOWKHRXWSXW;64/'$ZLWKLQIRUPDWLRQDERXWWKH
VHOHFWOLVWLWHPVUHWXUQHGE\WKHVWDWHPHQW
isc_dsql_describe(status_vector, &trans, &stmt, out_sqlda);
&RPSDUHWKHVTOQILHOGRIWKH;64/'$WRWKHVTOGILHOGWRGHWHUPLQHLIWKHRXWSXW
GHVFULSWRUFDQDFFRPPRGDWHWKHQXPEHURIVHOHFWOLVWLWHPVVSHFLILHGLQWKH
VWDWHPHQW,IQRWIUHHWKHVWRUDJHSUHYLRXVO\DOORFDWHGWRWKHRXWSXWGHVFULSWRU
UHDOORFDWHVWRUDJHWRUHIOHFWWKHQXPEHURIVHOHFWOLVWLWHPVVSHFLILHGE\VTOGUHVHW
VTOQDQGYHUVLRQWKHQH[HFXWHisc_dsql_describe()DJDLQ
if (out_sqlda->sqld > out_sqlda->sqln)
{
n = out_sqlda->sqld;
free(out_sqlda);
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
out_sqlda->sqln = n;
out_sqlda->version = SQLDA_VERSION1;
isc_dsql_describe(status_vector, &trans, 1, out_sqlda);
}
6HWXSDQ;64/9$5VWUXFWXUHIRUHDFKLWHPUHWXUQHG6HWWLQJXSDQLWHP
VWUXFWXUHLQYROYHVWKHIROORZLQJVWHSV
&RHUFLQJDQLWHP·VGDWDW\SH RSWLRQDO
$OORFDWLQJORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH;64/9$57KLV
VWHSLVRQO\UHTXLUHGLIVSDFHIRUORFDOYDULDEOHVLVQRWDOORFDWHGXQWLOUXQWLPH7KH
IROORZLQJH[DPSOHLOOXVWUDWHVG\QDPLFDOORFDWLRQRIORFDOYDULDEOHVWRUDJHVSDFH
3URYLGLQJD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU
7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHVHVWHSVORRSLQJWKURXJKHDFK;64/9$5
VWUXFWXUHLQWKHRXWBVTOGD;64/'$
for (i=0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++)
{
dtype = (var->sqltype & ~1) /* drop flag bit for now */
switch(dtype)
{
case SQL_VARYING:
var->sqltype = SQL_TEXT;
84 INTERBASE 5
DSQL PROGRAMMING METHODS
4 ([HFXWLQJDVWDWHPHQWVWULQJZLWKLQWKHFRQWH[WRIDFXUVRU
7RUHWULHYHVHOHFWOLVWLWHPVIURPDSUHSDUHGVWDWHPHQWVWULQJWKHVWULQJFDQEHH[HFXWHG
ZLWKLQWKHFRQWH[WRIDFXUVRU$OOFXUVRUGHFODUDWLRQVLQ,QWHU%DVHDUHIL[HGVWDWHPHQWV
LQVHUWHGLQWRWKHDSSOLFDWLRQEHIRUHLWLVFRPSLOHG'64/DSSOLFDWLRQGHYHORSHUVPXVW
DQWLFLSDWHWKHQHHGIRUFXUVRUVZKHQZULWLQJWKHDSSOLFDWLRQDQGGHFODUHWKHPDKHDGRIWLPH
$FXUVRULVRQO\QHHGHGWRSURFHVVSRVLWLRQHG83'$7(DQG'(/(7(VWDWHPHQWVPDGHDJDLQVW
WKHURZVUHWULHYHGE\isc_dsql_fetch()IRU6(/(&7VWDWHPHQWVWKDWVSHFLI\DQRSWLRQDO)25
83'$7(2)FODXVH
7KHIROORZLQJGHVFULSWLRQVDSSO\WRWKHVLWXDWLRQVZKHQDFXUVRULVQHHGHG)RUDQH[DPSOH
RIH[HFXWLQJDVWDWHPHQWDQGIHWFKLQJURZVZLWKRXWXVLQJDFXUVRUVHH´LVFBGVTOBIHWFK µRQ
SDJH
$ORRSLQJFRQVWUXFWLVXVHGWRIHWFKDVLQJOHURZDWDWLPHIURPWKHFXUVRUDQGWRSURFHVV
HDFKVHOHFWOLVWLWHP FROXPQ LQWKDWURZEHIRUHWKHQH[WURZLVIHWFKHG
7RH[HFXWHDVWDWHPHQWVWULQJZLWKLQWKHFRQWH[WRIDFXUVRUDQGUHWULHYHURZVRIVHOHFWOLVW
LWHPVIROORZWKHVHVWHSV
([HFXWHWKHSUHSDUHGVWDWHPHQWZLWKisc_dsql_execute()
isc_dsql_execute(status_vector, &trans, &stmt, 1, NULL);
API GUIDE 85
CHAPTER 6 WORKING WITH DYNAMIC SQL
'HFODUHDQGRSHQDFXUVRUIRUWKHVWDWHPHQWVWULQJZLWK
isc_dsql_set_cursor_name())RUH[DPSOHWKHIROORZLQJVWDWHPHQWGHFODUHVD
FXUVRUG\QBFXUVRUIRUWKH64/VWDWHPHQWVWULQJVWPW
isc_dsql_set_cursor_name(status_vector, &stmt, "dyn_cursor", NULL);
2SHQLQJWKHFXUVRUFDXVHVWKHVWDWHPHQWVWULQJWREHH[HFXWHGDQGDQDFWLYHVHWRIURZV
WREHUHWULHYHG
)HWFKRQHURZDWDWLPHDQGSURFHVVWKHVHOHFWOLVWLWHPV FROXPQV LWFRQWDLQV
ZLWKisc_dsql_fetch())RUH[DPSOHWKHIROORZLQJORRSVUHWULHYHRQHURZDWD
WLPHIURPG\QBFXUVRUDQGSURFHVVHDFKLWHPLQWKHUHWULHYHGURZZLWKDQ
DSSOLFDWLRQVSHFLILFIXQFWLRQFDOOHGprocess_column()
while ((fetch_stat =
isc_dsql_fetch(status_vector, &stmt, 1, out_sqlda))
== 0)
{
for (i = 0; i < out_sqlda->sqld; i++)
{
process_column(sqlda->sqlvar[i]);
}
}
if (fetch_stat != 100L)
{
/* isc_dsql_fetch returns 100 if no more rows remain to be
retrieved */
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
7KHprocess_column()IXQFWLRQPHQWLRQHGLQWKLVH[DPSOHSURFHVVHVHDFKUHWXUQHG
VHOHFWOLVWLWHP7KHIROORZLQJVNHOHWRQFRGHLOOXVWUDWHVKRZVXFKDIXQFWLRQFDQEHVHWXS
void process_column(XSQLVAR *var)
{
/* test for NULL value */
if ((var->sqltype & 1) && (*(var->sqlind) = -1))
{
/* process the NULL value here */
}
else
{
/* process the data instead */
}
. . .
86 INTERBASE 5
DSQL PROGRAMMING METHODS
}
:KHQDOOWKHURZVDUHIHWFKHGFORVHWKHFXUVRUZLWK
isc_dsql_free_statement()
isc_dsql_free_statement(status_vector, &stmt, DSQL_close);
4 5HH[HFXWLQJDTXHU\VWDWHPHQWVWULQJZLWKRXWSDUDPHWHUV
2QFHDTXHU\VWDWHPHQWVWULQJZLWKRXWSDUDPHWHUVLVSUHSDUHGLWFDQEHH[HFXWHGDVRIWHQDV
UHTXLUHGLQDQDSSOLFDWLRQE\FORVLQJDQGUHRSHQLQJLWVFXUVRU
7RUHRSHQDFXUVRUDQGSURFHVVVHOHFWOLVWLWHPVUHSHDWVWHSV²RI´([HFXWLQJDVWDWHPHQW
VWULQJZLWKLQWKHFRQWH[WRIDFXUVRUµRQSDJH
4 3UHSDULQJWKHLQSXW;64/'$
3ODFHKROGHUSDUDPHWHUVDUHUHSODFHGZLWKDFWXDOGDWDEHIRUHDSUHSDUHG64/VWDWHPHQWVWULQJ
LVH[HFXWHG%HFDXVHWKRVHSDUDPHWHUVDUHXQNQRZQZKHQWKHVWDWHPHQWVWULQJLVFUHDWHGDQ
LQSXW;64/'$PXVWEHFUHDWHGWRVXSSO\SDUDPHWHUYDOXHVDWUXQWLPH7RSUHSDUHWKH
;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$QHHGHGWRSURFHVVSDUDPHWHUV)RU
H[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVDQ;64/'$FDOOHGLQBVTOGD
XSQLDA *in_sqlda;
2SWLRQDOO\GHFODUHDYDULDEOHIRUDFFHVVLQJWKH;64/9$5VWUXFWXUHRIWKH
;64/'$
XSQLVAR *var;
'HFODULQJDSRLQWHUWRWKH;64/9$5VWUXFWXUHLVQRWQHFHVVDU\EXWFDQVLPSOLI\
UHIHUHQFLQJWKHVWUXFWXUHLQVXEVHTXHQWVWDWHPHQWV
API GUIDE 87
CHAPTER 6 WORKING WITH DYNAMIC SQL
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
IROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRULQBVOTGD
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(10));
,QWKLVVWDWHPHQWVSDFHIRU;64/9$5VWUXFWXUHVLVDOORFDWHGDOORZLQJWKH;64/'$WR
DFFRPPRGDWHXSWRLQSXWSDUDPHWHUV2QFHVWUXFWXUHVDUHDOORFDWHGDVVLJQYDOXHVWR
WKHVTOGDWDILHOGV
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOG
RIWKH;64/'$WRLQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
in_sqlda->version = SQLDA_VERSION1;
in_sqlda->sqln = 10;
4 3UHSDULQJWKHRXWSXW;64/'$
0RVWTXHULHVUHWXUQRQHRUPRUHURZVRIGDWDUHIHUUHGWRDVDVHOHFWOLVW%HFDXVHWKHQXPEHU
DQGNLQGRILWHPVUHWXUQHGDUHXQNQRZQZKHQDVWDWHPHQWVWULQJLVH[HFXWHGDQRXWSXW
;64/'$PXVWEHFUHDWHGWRVWRUHVHOHFWOLVWLWHPVWKDWDUHUHWXUQHGDWUXQWLPH7RSUHSDUH
WKH;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$QHHGHGWRSURFHVVSDUDPHWHUV)RU
H[DPSOHWKHIROORZLQJGHFODUDWLRQFUHDWHVDQ;64/'$FDOOHGRXWBVTOGD
XSQLDA *out_sqlda;
2SWLRQDOO\GHFODUHDYDULDEOHIRUDFFHVVLQJWKH;64/9$5VWUXFWXUHRIWKH
;64/'$
XSQLVAR *var;
'HFODULQJDSRLQWHUWRWKH;64/9$5VWUXFWXUHLVQRWQHFHVVDU\EXWFDQVLPSOLI\
UHIHUHQFLQJWKHVWUXFWXUHLQVXEVHTXHQWVWDWHPHQWV
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
IROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRURXWBVTOGD
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(10));
6SDFHIRU;64/9$5VWUXFWXUHVLVDOORFDWHGLQWKLVVWDWHPHQWHQDEOLQJWKH;64/'$WR
DFFRPPRGDWHXSWRVHOHFWOLVWLWHPV
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOG
RIWKH;64/'$WRLQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
out_sqlda->version = SQLDA_VERSION1;
out_sqlda->sqln = 10;
88 INTERBASE 5
DSQL PROGRAMMING METHODS
4 3UHSDULQJDTXHU\VWDWHPHQWVWULQJZLWK SDUDPHWHUV
$IWHUDQLQSXWDQGDQRXWSXW;64/'$DUHFUHDWHGIRUKROGLQJDVWDWHPHQWVWULQJ·VSDUDPHWHUV
DQGWKHVHOHFWOLVWLWHPVUHWXUQHGZKHQWKHVWDWHPHQWLVH[HFXWHGWKHVWDWHPHQWVWULQJFDQEH
FUHDWHGDQGSUHSDUHG:KHQDVWDWHPHQWVWULQJLVSUHSDUHG,QWHU%DVHUHSODFHVWKH
SODFHKROGHUSDUDPHWHUVLQWKHVWULQJZLWKLQIRUPDWLRQDERXWWKHDFWXDOSDUDPHWHUVXVHG7KH
LQIRUPDWLRQDERXWWKHSDUDPHWHUVPXVWEHDVVLJQHGWRWKHLQSXW;64/'$ DQGSHUKDSV
DGMXVWHG EHIRUHWKHVWDWHPHQWFDQEHH[HFXWHG:KHQWKHVWDWHPHQWVWULQJLVH[HFXWHG
,QWHU%DVHVWRUHVVHOHFWOLVWLWHPVLQWKHRXWSXW;64/'$
7RSUHSDUHDTXHU\VWDWHPHQWVWULQJZLWKSDUDPHWHUVIROORZWKHVHVWHSV
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQWDLQVWKH64/
VWDWHPHQWWREHSURFHVVHG)RUH[DPSOHWKHIROORZLQJVWDWHPHQWFUHDWHVDQ64/
VWDWHPHQWVWULQJZLWKSODFHKROGHUSDUDPHWHUV
char *str = "SELECT * FROM DEPARTMENT WHERE BUDGET = ?, LOCATION = ?";
7KLVVWDWHPHQWVWULQJFRQWDLQVWZRSDUDPHWHUVDYDOXHWREHDVVLJQHGWRWKH%8'*(7
FROXPQDQGDYDOXHWREHDVVLJQHGWRWKH/2&$7,21FROXPQ
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
. . .
isc_dsql_allocate_statement(status_vector, &db1, &stmt);
3UHSDUHWKHVWDWHPHQWVWULQJZLWKisc_dsql_prepare()7KLVVHWVWKHVWDWHPHQW
KDQGOH VWPW WRUHIHUWRWKHSDUVHGIRUPDW7KHVWDWHPHQWKDQGOHLVXVHGLQ
VXEVHTXHQWFDOOVWRisc_dsql_describe()isc_dsql_describe_bind()DQG
isc_dsql_execute2()
isc_dsql_prepare(status_vector, &trans, &stmt, 0, str, 1, out_xsqlda);
8VHisc_dsql_describe_bind()WRILOOWKHLQSXW;64/'$ZLWKLQIRUPDWLRQ
DERXWWKHSDUDPHWHUVFRQWDLQHGLQWKH64/VWDWHPHQW
isc_dsql_decribe_bind(status_vector, &stmt, 1, in_xsqlda);
&RPSDUHWKHVTOQILHOGRIWKH;64/'$WRWKHVTOGILHOGWRGHWHUPLQHLIWKHLQSXW
GHVFULSWRUFDQDFFRPPRGDWHWKHQXPEHURISDUDPHWHUVFRQWDLQHGLQWKH
VWDWHPHQW,IQRWIUHHWKHVWRUDJHSUHYLRXVO\DOORFDWHGWRWKHLQSXWGHVFULSWRU
UHDOORFDWHVWRUDJHWRUHIOHFWWKHQXPEHURISDUDPHWHUVVSHFLILHGE\VTOGUHVHWVTOQ
DQGYHUVLRQWKHQH[HFXWHisc_dsql_describe_bind()DJDLQ
if (in_sqlda->sqld > in_sqlda->sqln)
{
API GUIDE 89
CHAPTER 6 WORKING WITH DYNAMIC SQL
n = in_sqlda->sqld;
free(in_sqlda);
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
in_sqlda->sqln = n;
in_sqlda->version = SQLDA_VERSION1;
isc_dsql_decribe_bind(status_vector, &stmt, 1, in_xsqlda);
}
3URFHVVHDFK;64/9$5SDUDPHWHUVWUXFWXUHLQWKHLQSXW;64/'$3URFHVVLQJD
SDUDPHWHUVWUXFWXUHLQYROYHVXSWRIRXUVWHSV
&RHUFLQJDSDUDPHWHU·VGDWDW\SH RSWLRQDO
$OORFDWLQJORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH;64/9$57KLV
VWHSLVRQO\UHTXLUHGLIVSDFHIRUORFDOYDULDEOHVLVQRWDOORFDWHGXQWLOUXQWLPH7KH
IROORZLQJH[DPSOHLOOXVWUDWHVG\QDPLFDOORFDWLRQRIORFDOYDULDEOHVWRUDJHVSDFH
3URYLGLQJDYDOXHIRUWKHSDUDPHWHUFRQVLVWHQWZLWKLWVGDWDW\SH UHTXLUHG
3URYLGLQJD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU
7KHVHVWHSVPXVWEHIROORZHGLQWKHRUGHUSUHVHQWHG7KHIROORZLQJFRGHH[DPSOH
LOOXVWUDWHVWKHVHVWHSVORRSLQJWKURXJKHDFK;64/9$5VWUXFWXUHLQWKHLQBVTOGD;64/'$
for (i=0, var = in_sqlda->sqlvar; i < in_sqlda->sqld; i++, var++)
{
/* Process each XSQLVAR parameter structure here.
The parameter structure is pointed to by var.*/
dtype = (var->sqltype & ~1) /* drop flag bit for now */
switch(dtype)
{
case SQL_VARYING: /* coerce to SQL_TEXT */
var->sqltype = SQL_TEXT;
/* allocate proper storage */
var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);
/* Provide a value for the parameter. See case SQL_LONG. */
. . .
break;
case SQL_TEXT:
var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);
/* Provide a value for the parameter. See case SQL_LONG. */
. . .
break;
case SQL_LONG:
var->sqldata = (char *)malloc(sizeof(long));
/* Provide a value for the parameter. */
*(long *)(var->sqldata) = 17;
90 INTERBASE 5
DSQL PROGRAMMING METHODS
break;
. . .
} /* end of switch statement */
if (sqltype & 1)
{
/* allocate variable to hold NULL status */
var->sqlind = (short *)malloc(sizeof(short));
}
} /* end of for loop */
)RUPRUHLQIRUPDWLRQDERXWGDWDW\SHFRHUFLRQDQG18//LQGLFDWRUVVHH´&RHUFLQJ
GDWDW\SHVµRQSDJH
8VHisc_dsql_describe()WRILOOWKHRXWSXW;64/'$ZLWKLQIRUPDWLRQDERXWWKH
VHOHFWOLVWLWHPVUHWXUQHGE\WKHVWDWHPHQW
isc_dsql_describe(status_vector, &trans, &stmt, out_xsqlda);
&RPSDUHWKHVTOQILHOGRIWKH;64/'$WRWKHVTOGILHOGWRGHWHUPLQHLIWKHRXWSXW
GHVFULSWRUFDQDFFRPPRGDWHWKHQXPEHURIVHOHFWOLVWLWHPVVSHFLILHGLQWKH
VWDWHPHQW,IQRWIUHHWKHVWRUDJHSUHYLRXVO\DOORFDWHGWRWKHRXWSXWGHVFULSWRU
UHDOORFDWHVWRUDJHWRUHIOHFWWKHQXPEHURIVHOHFWOLVWLWHPVVSHFLILHGE\VTOGUHVHW
VTOQDQGYHUVLRQDQGH[HFXWH'(6&5,%(287387DJDLQ
if (out_sqlda->sqld > out_sqlda->sqln)
{
n = out_sqlda->sqld;
free(out_sqlda);
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
out_sqlda->sqln = n;
out_sqlda->version = SQLDA_VERSION1;
isc_dsql_describe(status_vector, &trans, &stmt, out_xsqlda);
}
6HWXSDQ;64/9$5VWUXFWXUHIRUHDFKLWHPUHWXUQHG6HWWLQJXSDQLWHP
VWUXFWXUHLQYROYHVWKHIROORZLQJVWHSV
&RHUFLQJDQLWHP·VGDWDW\SH RSWLRQDO
$OORFDWLQJORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH;64/9$57KLV
VWHSLVRQO\UHTXLUHGLIVSDFHIRUORFDOYDULDEOHVLVQRWDOORFDWHGXQWLOUXQWLPH7KH
IROORZLQJH[DPSOHLOOXVWUDWHVG\QDPLFDOORFDWLRQRIORFDOYDULDEOHVWRUDJHVSDFH
3URYLGLQJD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU RSWLRQDO
7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHVHVWHSVORRSLQJWKURXJKHDFK;64/9$5
VWUXFWXUHLQWKHRXWBVTOGD;64/'$
for (i=0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++)
API GUIDE 91
CHAPTER 6 WORKING WITH DYNAMIC SQL
{
dtype = (var->sqltype & ~1) /* drop flag bit for now */
switch(dtype)
{
case SQL_VARYING:
var->sqltype = SQL_TEXT;
break;
case SQL_TEXT:
var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);
break;
case SQL_LONG:
var->sqldata = (char *)malloc(sizeof(long));
break;
/* process remaining types */
} /* end of switch statements */
if (sqltype & 1)
{
/* allocate variable to hold NULL status */
var->sqlind = (short *)malloc(sizeof(short));
}
} /* end of for loop */
)RUPRUHLQIRUPDWLRQDERXWGDWDW\SHFRHUFLRQDQG18//LQGLFDWRUVVHH´&RHUFLQJ
GDWDW\SHVµRQSDJH
4 ([HFXWLQJDTXHU\VWDWHPHQWVWULQJZLWKLQWKHFRQWH[WRIDFXUVRU
7RUHWULHYHVHOHFWOLVWLWHPVIURPDVWDWHPHQWVWULQJWKHVWULQJPXVWEHH[HFXWHGZLWKLQWKH
FRQWH[WRIDFXUVRU$OOFXUVRUGHFODUDWLRQVLQ,QWHU%DVHDUHIL[HGHPEHGGHGVWDWHPHQWV
LQVHUWHGLQWRWKHDSSOLFDWLRQEHIRUHLWLVFRPSLOHG'64/DSSOLFDWLRQGHYHORSHUVPXVW
DQWLFLSDWHWKHQHHGIRUFXUVRUVZKHQZULWLQJWKHDSSOLFDWLRQDQGGHFODUHWKHPDKHDGRIWLPH
$ORRSLQJFRQVWUXFWLVXVHGWRIHWFKDVLQJOHURZDWDWLPHIURPWKHFXUVRUDQGWRSURFHVV
HDFKVHOHFWOLVWLWHP FROXPQ LQWKDWURZEHIRUHWKHQH[WURZLVIHWFKHG
7RH[HFXWHDVWDWHPHQWVWULQJZLWKLQWKHFRQWH[WRIDFXUVRUDQGUHWULHYHURZVRIVHOHFWOLVW
LWHPVIROORZWKHVHVWHSV
([HFXWHWKHVWDWHPHQWZLWKisc_dsql_execute2()
isc_dsql_execute2(status_vector, &trans, &stmt, 1, in_xsqlda, out_xsqlda);
'HFODUHDQGRSHQDFXUVRUIRUWKHVWDWHPHQWVWULQJZLWK
isc_dsql_set_cursor_name())RUH[DPSOHWKHIROORZLQJVWDWHPHQWGHFODUHVD
FXUVRUG\QBFXUVRUIRUWKHSUHSDUHG64/VWDWHPHQWVWULQJVWPW
isc_dsql_set_cursor_name(status_vector, &stmt, "dyn_cursor", NULL);
92 INTERBASE 5
DSQL PROGRAMMING METHODS
2SHQLQJWKHFXUVRUFDXVHVWKHVWDWHPHQWVWULQJWREHH[HFXWHGDQGDQDFWLYHVHWRIURZV
WREHUHWULHYHG
)HWFKRQHURZDWDWLPHZLWKisc_dsql_fetch()DQGSURFHVVWKHVHOHFWOLVWLWHPV
FROXPQV LWFRQWDLQV)RUH[DPSOHWKHIROORZLQJORRSVUHWULHYHRQHURZDWD
WLPHIURPG\QBFXUVRUDQGSURFHVVHDFKLWHPLQWKHUHWULHYHGURZZLWKDQ
DSSOLFDWLRQVSHFLILFIXQFWLRQFDOOHGprocess_column()
while ((fetch_stat =
isc_dsql_fetch(status_vector, &stmt, 1, out_sqlda)) == 0)
{
for (i = 0; i < out_sqlda->sqld; i++)
{
process_column(sqlda->sqlvar[i]);
}
}
if (fetch_stat != 100L)
{
/* isc_dsql_fetch returns 100 if no more rows remain to be
retrieved */
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
:KHQDOOWKHURZVDUHIHWFKHGFORVHWKHFXUVRUZLWK
isc_dsql_free_statement()
isc_dsql_free_statement(status_vector, &stmt, DSQL_close);
4 5HH[HFXWLQJDTXHU\VWDWHPHQWVWULQJZLWK SDUDPHWHUV
2QFHDTXHU\VWDWHPHQWVWULQJZLWKSDUDPHWHUVLVSUHSDUHGLWFDQEHXVHGDVRIWHQDVUHTXLUHG
LQDQDSSOLFDWLRQ%HIRUHHDFKVXEVHTXHQWXVHWKHLQSXW;64/'$FDQEHVXSSOLHGZLWKQHZ
SDUDPHWHUDQG18//LQGLFDWRUGDWD7KHFXUVRUPXVWEHFORVHGDQGUHRSHQHGEHIRUH
SURFHVVLQJFDQRFFXU
g 7RSURYLGHQHZSDUDPHWHUVWRWKHLQSXW;64/'$IROORZVWHSVWRRI´3UHSDULQJDTXHU\
VWDWHPHQWVWULQJZLWK SDUDPHWHUVµRQSDJH
g 7RSURYLGHQHZLQIRUPDWLRQWRWKHRXWSXW;64/'$IROORZVWHSVWRRI´3UHSDULQJDTXHU\
VWDWHPHQWVWULQJZLWK SDUDPHWHUVµRQSDJH
g 7RUHRSHQDFXUVRUDQGSURFHVVVHOHFWOLVWLWHPVUHSHDWVWHSVWRRI´([HFXWLQJDTXHU\
VWDWHPHQWVWULQJZLWKLQWKHFRQWH[WRIDFXUVRUµRQSDJH
API GUIDE 93
CHAPTER 6 WORKING WITH DYNAMIC SQL
Note $GGLWLRQDOLQIRUPDWLRQLWHPPDFURVIRUUHTXHVWHGLWHPVFDQEHIRXQGLQLEDVHKXQGHU
WKHFRPPHQW´64/LQIRUPDWLRQLWHPVµ
7KHUHVXOWEXIIHUPXVWEHODUJHHQRXJKWRFRQWDLQDQ\GDWDUHWXUQHGE\WKHFDOO7KHSURSHU
VL]HIRUWKLVEXIIHUGHSHQGVRQWKHLQIRUPDWLRQUHTXHVWHG,IQRWHQRXJKVSDFHLVDOORFDWHG
WKHQisc_dsql_sql_info()SXWVWKHSUHGHILQHGYDOXHLVFBLQIRBWUXQFDWHGLQWKHODVWE\WHRIWKH
UHVXOWEXIIHU*HQHUDOO\ZKHQUHTXHVWLQJVWDWHPHQWW\SHLQIRUPDWLRQE\WHVLVDVXIILFLHQW
EXIIHUVL]H'HFODULQJDODUJHUWKDQQHFHVVDU\EXIIHULVDOVRVDIH$UHTXHVWWRLGHQWLI\D
VWDWHPHQWW\SHUHWXUQVWKHIROORZLQJLQIRUPDWLRQLQWKHUHVXOWEXIIHU
2QHE\WHFRQWDLQLQJLVFBLQIRBVTOBVWPWBW\SH
7ZRE\WHVFRQWDLQLQJDQXPEHUQWHOOLQJKRZPDQ\E\WHVFRPSRVHWKH
VXEVHTXHQWYDOXH
94 INTERBASE 5
DETERMINING AN UNKNOWN STATEMENT TYPE AT RUNTIME
2QHRUWZRE\WHVVSHFLI\LQJWKHVWDWHPHQWW\SH7KHIROORZLQJWDEOHOLVWVWKH
VWDWHPHQWW\SHVWKDWFDQEHUHWXUQHG
$ILQDOE\WHFRQWDLQLQJWKHYDOXHLVFBLQIRBHQG
7KHYDOXHVSODFHGLQWKHUHVXOWEXIIHUDUHQRWDOLJQHG)XUWKHUPRUHDOOQXPEHUVDUH
UHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQW
E\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUWWKHQXPEHUVWRDGDWDW\SH
QDWLYHWR\RXUV\VWHPEHIRUHLQWHUSUHWLQJWKHP
Note $OOLQIRUPDWLRQDERXWDVWDWHPHQWH[FHSWLWVW\SHFDQEHPRUHHDVLO\GHWHUPLQHGE\
FDOOLQJIXQFWLRQVRWKHUWKDQisc_dsql_sql_info())RUH[DPSOHWRGHWHUPLQHWKHLQIRUPDWLRQ
WRILOOLQDQLQSXW;64/'$FDOO isc_dsql_describe_bind()7RILOOLQDQRXWSXW;64/'$
FDOO isc_dsql_prepare()RUisc_dsql_describe()
API GUIDE 95
CHAPTER
97
CHAPTER 7 WORKING WITH BLOB DATA
7KHIROORZLQJWDEOHDOSKDEHWLFDOO\OLVWVWKH$3,IXQFWLRQVIRUZRUNLQJZLWK%OREGDWD7KH
IXQFWLRQVZLOOEHGHVFULEHGDQGGHPRQVWUDWHGLQWKHUHPDLQGHURIWKLVFKDSWHU
Function Purpose
isc_blob_default_desc() Loads a Blob descriptor with default information about a Blob, including its
subtype, character set, and segment size
isc_blob_gen_bpb() Generates a Blob parameter buffer (BPB) from source and target Blob
descriptors to allow dynamic access to Blob subtype and character set
information
isc_blob_info() Returns information about an open Blob
isc_blob_lookup_desc() Determines the subtype, character set, and segment size of a Blob, given a
table name and Blob column name
isc_blob_set_desc() Initializes a Blob descriptor from parameters passed to it
isc_cancel_blob() Discards a Blob
isc_close_blob() Closes an open Blob
isc_create_blob2() Creates and opens a Blob for write access, and optionally specifies a filter
to be used to translate the Blob from one subtype to another
isc_get_segment() Retrieves data from a Blob column in a row returned by execution of a
SELECT statement
isc_open_blob2() Opens an existing Blob for retrieval, and optionally specifies a filter to be
used to translate the Blob from one subtype to another
isc_put_segment() Writes data into a Blob
TABLE 7.1 API Blob functions
What is a Blob?
$%OREODUJHREMHFWWKDWFDQQRWHDVLO\EHVWRUHGLQDGDWDEDVHDVRQHRIWKHVWDQGDUGGDWDW\SHV
<RXFDQXVHD%OREWRVWRUHODUJHDPRXQWVRIGDWDRIYDULRXVW\SHVLQFOXGLQJ
g %LWPDSSHGLPDJHV
g 6RXQGV
g 9LGHRVHJPHQWV
g 7H[W
98 INTERBASE 5
WHAT IS A BLOB?
,QWHU%DVHVXSSRUWRI%OREGDWDSURYLGHVDOOWKHDGYDQWDJHVRIDGDWDEDVHPDQDJHPHQW
V\VWHPLQFOXGLQJWUDQVDFWLRQFRQWUROPDLQWHQDQFHDQGDFFHVVXVLQJVWDQGDUG$3,IXQFWLRQ
FDOOV%OREGDWDLVVWRUHGLQWKHGDWDEDVHLWVHOI2WKHUV\VWHPVRQO\VWRUHSRLQWHUVLQWKH
GDWDEDVHWRQRQGDWDEDVHILOHV,QWHU%DVHVWRUHVWKHDFWXDO%OREGDWDLQWKHGDWDEDVHDQG
HVWDEOLVKHVDXQLTXHLGHQWLILFDWLRQKDQGOHLQWKHDSSURSULDWHWDEOHWRSRLQWWRWKHGDWDEDVH
ORFDWLRQRIWKH%ORE%\PDLQWDLQLQJWKH%OREGDWDZLWKLQWKHGDWDEDVH,QWHU%DVHJUHDWO\
LPSURYHVDFFHVVWRDQGPDQDJHPHQWRIWKHGDWD
Blob subtypes
$OWKRXJK\RXPDQDJH%OREGDWDLQZD\VVLPLODUWRRWKHUGDWDW\SHV,QWHU%DVHSURYLGHVPRUH
IOH[LEOHGDWDW\SLQJUXOHVIRU%OREGDWD%HFDXVHWKHUHDUHPDQ\QDWLYHGDWDW\SHVWKDW\RXFDQ
GHILQHDV%OREGDWD,QWHU%DVHWUHDWVWKHPJHQHULFDOO\DQGDOORZV\RXWRGHILQH\RXURZQ
GDWDW\SHNQRZQDVDVXEW\SH,QWHU%DVHDOVRSURYLGHVWZRSUHGHILQHGVXEW\SHVDQ
XQVWUXFWXUHGVXEW\SHJHQHUDOO\DSSOLHGWRELQDU\GDWDRUGDWDRIDQLQGHWHUPLQDWHW\SHDQG
DSSOLHGWRSODLQWH[W
8VHUGHILQHGVXEW\SHVPXVWDOZD\VEHUHSUHVHQWHGDVQHJDWLYHLQWHJHUVEHWZHHQ²DQG
²
$%OREFROXPQ·VVXEW\SHLVVSHFLILHGZKHQWKH%OREFROXPQLVGHILQHG
7KHDSSOLFDWLRQLVUHVSRQVLEOHIRUHQVXULQJWKDWGDWDVWRUHGLQD%OREFROXPQDJUHHVZLWKLWV
VXEW\SH,QWHU%DVHGRHVQRWFKHFNWKHW\SHRUIRUPDWRI%OREGDWD
API GUIDE 99
CHAPTER 7 WORKING WITH BLOB DATA
100 INTERBASE 5
BLOB DATA OPERATIONS
4 &UHDWLQJWKH6(/(&7VWDWHPHQW
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQVLVWVRIWKH64/TXHU\WKDWZLOO
VHOHFWURZVFRQWDLQLQJWKH%OREGDWDRILQWHUHVW)RUH[DPSOHWKHIROORZLQJFUHDWHVDQ64/
TXHU\VWDWHPHQWVWULQJWKDWVHOHFWVWKUHHFROXPQVIURPYDULRXVURZVLQWKH352-(&7WDEOH
char *str =
"SELECT PROJ_NAME, PROJ_DESC, PRODUCT FROM PROJECT WHERE \
PRODUCT IN ("software", "hardware", "other") ORDER BY PROJ_NAME";
4 3UHSDULQJWKHRXWSXW;64/'$
0RVWTXHULHVUHWXUQRQHRUPRUHURZVRIGDWDUHIHUUHGWRDVDVHOHFWOLVW$QRXWSXW;64/'$
PXVWEHFUHDWHGWRVWRUHWKHFROXPQGDWDIRUHDFKURZWKDWLVIHWFKHG)RUD%OREFROXPQWKH
FROXPQGDWDLVDQLQWHUQDO%ORELGHQWLILHU %ORE,' WKDWLVQHHGHGWRDFFHVVWKHDFWXDOGDWD
7RSUHSDUHWKH;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQ
FUHDWHVDQ;64/'$FDOOHGRXWBVTOGD
XSQLDA *out_sqlda;
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
;64/'$PXVWFRQWDLQRQH;64/9$5VXEVWUXFWXUHIRUHDFKFROXPQWREH
IHWFKHG7KHIROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRUDQRXWSXW;64/'$
RXWBVTOGD ZLWKWKUHH;64/9$5VXEVWUXFWXUHV
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(3));
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOG
RIWKH;64/'$WRLQGLFDWHWKHQXPEHURI;64/9$5VXEVWUXFWXUHVDOORFDWHG
out_sqlda->version = SQLDA_VERSION1;
out_sqlda->sqln = 3;
4 3UHSDULQJWKH6(/(&7VWDWHPHQWIRUH[HFXWLRQ
$IWHUDQ;64/'$LVFUHDWHGIRUKROGLQJWKHFROXPQGDWDIRUHDFKVHOHFWHGURZWKHTXHU\
VWDWHPHQWVWULQJFDQEHSUHSDUHGIRUH[HFXWLRQ)ROORZWKHVHVWHSV
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate_statement()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
isc_dsql_allocate_statement(status_vector, &db_handle, &stmt);
5HDG\WKHVWDWHPHQWVWULQJIRUH[HFXWLRQZLWKisc_dsql_prepare()7KLVFKHFNV
WKHVWULQJ VWU IRUV\QWD[HUURUVSDUVHVLWLQWRDIRUPDWWKDWFDQEHHIILFLHQWO\
H[HFXWHGDQGVHWVWKHVWDWHPHQWKDQGOH VWPW WRUHIHUWRWKLVSDUVHGIRUPDW7KH
VWDWHPHQWKDQGOHLVXVHGLQDODWHUFDOOWRisc_dsql_execute()
,I isc_dsql_prepare()LVSDVVHGDSRLQWHUWRWKHRXWSXW;64/'$DVLQWKHIROORZLQJ
H[DPSOHLWZLOOILOOLQPRVWILHOGVRIWKH;64/'$DQGDOOLWV;64/9$5VXEVWUXFWXUHVZLWK
LQIRUPDWLRQVXFKDVWKHGDWDW\SHOHQJWKDQGQDPHRIWKHFRUUHVSRQGLQJFROXPQVLQWKH
VWDWHPHQW
$VDPSOHFDOOWRisc_dsql_prepare()LV
isc_dsql_prepare(
status_vector,
&trans, /* Set by previous isc_start_transaction() call. */
&stmt, /* Statement handle set by this function call. */
0, /* Specifies statement string is null-terminated. */
str, /* Statement string. */
SQLDA_VERSION1,/* XSQLDA version number. */
out_sqlda /* XSQLDA for storing column data. */
);
6HWXSDQ;64/9$5VWUXFWXUHIRUHDFKFROXPQ6HWWLQJXSDQ;64/9$5VWUXFWXUH
LQYROYHVWKHIROORZLQJVWHSV
)RUFROXPQVZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPH
6SHFLI\WKHFROXPQ·VGDWDW\SH LILWZDVQRWVHWE\isc_dsql_prepare()DVSUHYLRXVO\
GHVFULEHG
3RLQWWKHVTOGDWDILHOGRIWKH;64/9$5WRDQDSSURSULDWHORFDOYDULDEOH
)RUFROXPQVZKRVHW\SHVDUHQRWNQRZQXQWLOUXQWLPH
&RHUFHWKHLWHP·VGDWDW\SH RSWLRQDO IRUH[DPSOHIURP64/B9$5<,1*WR64/B7(;7
102 INTERBASE 5
BLOB DATA OPERATIONS
'\QDPLFDOO\DOORFDWHORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH
;64/9$5
)RUERWK
6SHFLI\WKHQXPEHURIE\WHVRIGDWDWREHUHWULHYHGLQWRVTOGDWD
3URYLGHD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU
'DWDUHWULHYDOIRU%ORE DQGDUUD\ FROXPQVLVGLIIHUHQWIURPRWKHUW\SHVRIFROXPQVVR
WKH;64/9$5ILHOGVPXVWEHVHWGLIIHUHQWO\)RUQRQ%ORE DQGQRQDUUD\ FROXPQV
isc_dsql_prepare()VHWVHDFK;64/9$5VTOW\SHILHOGWRWKHDSSURSULDWHILHOGW\SHDQGWKH
GDWDUHWULHYHGZKHQDVHOHFWOLVWURZ·VGDWDLVIHWFKHGLVSODFHGLQWRWKHVTOGDWDVSDFH
DOORFDWHGIRUWKHFROXPQ)RU%OREFROXPQVWKHW\SHPXVWEHVHWWR64/B%ORE RU
64/B%ORELID18//LQGLFDWRULVGHVLUHG ,QWHU%DVHVWRUHVWKHLQWHUQDO%ORELGHQWLILHU
%ORE,' QRWWKH%OREGDWDLQWKHVTOGDWDVSDFHZKHQDURZ·VGDWDLVIHWFKHGVR\RXPXVW
SRLQWVTOGDWDWRDQDUHDWKHVL]HRID%ORE,'7RVHHKRZWRUHWULHYHWKHDFWXDO%OREGDWD
RQFH\RXKDYHD%ORE,'VHH´5HDGLQJGDWDIURPD%OREµRQSDJH
7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHDVVLJQPHQWVIRU%OREDQGQRQ%OREFROXPQV
ZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPH)RUH[DPSOHVRIKDQGOLQJGDWDW\SHVWKDWDUH
XQNQRZQXQWLOUXQWLPHVHH&KDSWHU´:RUNLQJZLWK'\QDPLF64/µ
#define PROJLEN 20
#define TYPELEN 12
ISC_QUAD blob_id;
char proj_name[PROJLEN + 1];
char prod_type[TYPELEN + 1];
short flag0, flag1, flag2;
out_sqlda->sqlvar[0].sqldata = proj_name;
out_sqlda->sqlvar[0].sqltype = SQL_TEXT + 1;
out_sqlda->sqlvar[0].sqllen = PROJLEN;
out_sqlda->sqlvar[0].sqlind = &flag0;
out_sqlda->sqlvar[1].sqldata = (char *) &blob_id;
out_sqlda->sqlvar[1].sqltype = SQL_Blob + 1;
out_sqlda->sqlvar[1].sqllen = sizeof(ISC_QUAD);
out_sqlda->sqlvar[1].sqlind = &flag1;
out_sqlda->sqlvar[2].sqldata = prod_type;
out_sqlda->sqlvar[2].sqltype = SQL_TEXT + 1;
out_sqlda->sqlvar[2].sqllen = TYPELEN;
out_sqlda->sqlvar[2].sqlind = &flag2;
4 ([HFXWLQJWKHVWDWHPHQW
2QFHWKHTXHU\VWDWHPHQWVWULQJLVSUHSDUHGLWFDQEHH[HFXWHG
isc_dsql_execute(
status_vector,
&trans, /* set by previous isc_start_transaction() call */
&stmt, /* allocated above by isc_dsql_allocate_statement() */
1, /* XSQLDA version number */
NULL /* NULL since stmt doesn’t have input values */
);
7KLVVWDWHPHQWFUHDWHVDVHOHFWOLVWWKHURZVUHWXUQHGE\H[HFXWLRQRIWKHVWDWHPHQW
4 )HWFKLQJVHOHFWHGURZV
$ORRSLQJFRQVWUXFWLVXVHGWRIHWFK LQWRWKHRXWSXW;64/'$ WKHFROXPQGDWDIRUDVLQJOH
URZDWDWLPHIURPWKHVHOHFWOLVWDQGWRSURFHVVHDFKURZEHIRUHWKHQH[WURZLVIHWFKHG(DFK
H[HFXWLRQRIisc_dsql_fetch()IHWFKHVWKHFROXPQGDWDLQWRWKHFRUUHVSRQGLQJ;64/9$5
VXEVWUXFWXUHVRIRXWBVTOGD)RUWKH%OREFROXPQWKH%ORE,'QRWWKHDFWXDO%OREGDWDLV
IHWFKHG
ISC_STATUS fetch_stat;
long SQLCODE;
. . .
while ((fetch_stat =
isc_dsql_fetch(status_vector, &stmt, 1, out_sqlda))
== 0)
{
proj_name[PROJLEN] = ’\0’;
prod_type[TYPELEN] = ’\0’;
printf("\nPROJECT: %–20s TYPE: %–15s\n\n",
proj_name, prod_type);
/* Read and process the Blob data (see next section) */
}
if (fetch_stat != 100L)
{
/* isc_dsql_fetch returns 100 if no more rows remain to be
retrieved */
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
4 5HDGLQJDQGSURFHVVLQJWKH%OREGDWD
7RUHDGDQGSURFHVVWKH%OREGDWD
'HFODUHDQGLQLWLDOL]HD%OREKDQGOH
isc_blob_handle blob_handle; /* Declare a Blob handle. */
blob_handle = NULL; /* Set handle to NULL before using it */
104 INTERBASE 5
BLOB DATA OPERATIONS
&UHDWHDEXIIHUIRUKROGLQJHDFK%OREVHJPHQWDVLWLVUHDG,WVVL]HVKRXOGEHWKH
PD[LPXPVL]HVHJPHQW\RXUSURJUDPH[SHFWVWREHUHDGIURPWKH%ORE
char blob_segment[80];
'HFODUHDQXQVLJQHGVKRUWYDULDEOHLQWRZKLFK,QWHU%DVHZLOOVWRUHWKHDFWXDO
OHQJWKRIHDFKVHJPHQWUHDG
unsigned short actual_seg_len;
2SHQWKH%OREZLWKWKHIHWFKHGEOREBLG
isc_open_blob2(
status_vector,
&db_handle,
&trans,
&blob_handle,/* set by this function to refer to the Blob */
&blob_id, /* Blob ID put into out_sqlda by isc_dsql_fetch() */
0, /* BPB length = 0; no filter will be used */
NULL /* NULL BPB, since no filter will be used */
);
5HDGDOOWKH%OREGDWDE\FDOOLQJisc_get_segment()UHSHDWHGO\WRJHWHDFK%ORE
VHJPHQWDQGLWVOHQJWK3URFHVVHDFKVHJPHQWUHDG,QWKHIROORZLQJH[DPSOH
´SURFHVVLQJµFRQVLVWVRISULQWLQJHDFK%OREDVLWLVUHDG
blob_stat = isc_get_segment(
status_vector,
&blob_handle, /* set by isc_open_blob2()*/
&actual_seg_len, /* length of segment read */
sizeof(blob_segment), /* length of segment buffer */
blob_segment /* segment buffer */
);
while (blob_stat == 0 || status_vector[1] == isc_segment)
{
/* isc_get_segment returns 0 if a segment was successfully read. */
/* status_vector[1] is set to isc_segment if only part of a */
/* segment was read due to the buffer (blob_segment) not being */
/* large enough. In that case, the following calls to */
/* isc_get_segment() read the rest of the buffer. */
printf("%*.*s", actual_seg_len, actual_seg_len, blob_segment);
blob_stat = isc_get_segment(status_vector, &blob_handle,
&actual_seg_len, sizeof(blob_segment), blob_segment);
printf("\n");
};
printf("\n");
&ORVHWKH%ORE
isc_close_blob(status_vector, &blob_handle);
4 3UHSDULQJWKH83'$7(RU,16(57VWDWHPHQW
7RSUHSDUHDQ83'$7(RU,16(57VWDWHPHQWIRUH[HFXWLRQIROORZWKHVHVWHSV
106 INTERBASE 5
BLOB DATA OPERATIONS
(OLFLWDQ83'$7(RU,16(57VWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHIRU
LQVHUWLQJDURZRUXSGDWLQJWKHURZFRQWDLQLQJWKH%OREFROXPQRILQWHUHVW)RU
H[DPSOHWKHIROORZLQJVWDWHPHQWLVIRUXSGDWLQJWKH%OREFROXPQQDPHG
352-B'(6&LQWKHURZRIWKHWDEOH352-(&7ZKRVH352-B,'ILHOGFRQWDLQVD
YDOXHVSHFLILHGDWUXQWLPH
char *upd_str =
"UPDATE PROJECT SET PROJ_DESC = ? WHERE PROJ_ID = ?";
$VDQH[DPSOHRIDQ,16(57VWDWHPHQWWKHIROORZLQJLQVHUWVDQHZURZFRQWDLQLQJYDOXHV
LQIRXUFROXPQV
char *in_str = "INSERT INTO PROJECT (PROJ_NAME, PROJ_DESC, PRODUCT,
PROJ_ID) VALUES (?, ?, ?, ?)";
7KHUHPDLQLQJVWHSVUHIHURQO\WR83'$7(VWDWHPHQWVEXWWKHDFWLRQVDSSO\WR,16(57
VWDWHPHQWVDVZHOO
'HFODUHDYDULDEOHWRKROGWKHLQSXW;64/'$QHHGHGWRVXSSO\SDUDPHWHUYDOXHV
WRWKH83'$7(VWDWHPHQWDWUXQWLPH)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQ
FUHDWHVDQ;64/'$FDOOHGLQBVTOGD
XSQLDA *in_sqlda;
$OORFDWHPHPRU\IRUWKHLQSXW;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR
7KH;64/'$PXVWFRQWDLQRQH;64/9$5VXEVWUXFWXUHIRUHDFKSDUDPHWHUWREH
SDVVHGWRWKH83'$7(VWDWHPHQW7KHIROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRU
DQLQSXW;64/'$ LQBVTOGD ZLWKWZR;64/9$5VXEVWUXFWXUHV
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(2));
6HWWKHYHUVLRQILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHVTOQILHOGWR
LQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
in_sqlda->version = SQLDA_VERSION1;
in_sqlda->sqln = 2;
6HWXSWKH;64/9$5VWUXFWXUHLQWKH;64/'$IRUHDFKSDUDPHWHUWREHSDVVHG
6HWWLQJXSDQ;64/9$5VWUXFWXUHLQYROYHVWKHIROORZLQJVWHSV
6SHFLI\LQJWKHLWHP·VGDWDW\SH
)RUSDUDPHWHUVZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPH3RLQWLQJWKHVTOGDWDILHOGRIWKH
;64/9$5WRDQDSSURSULDWHORFDOYDULDEOHWKDWZLOOFRQWDLQWKHGDWDWREHSDVVHG
)RUSDUDPHWHUVZKRVHW\SHVDUHQRWNQRZQXQWLOUXQWLPH$OORFDWLQJORFDOVWRUDJHIRU
WKHGDWDSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH;64/9$5
6SHFLI\LQJWKHQXPEHURIE\WHVRIGDWD
4 &UHDWLQJDQHZ%OREDQGVWRULQJGDWD
7RFUHDWHDQHZ%OREFRQWDLQLQJWKHGDWDWREHZULWWHQ
'HFODUHDQGLQLWLDOL]HD%OREKDQGOH
isc_blob_handle blob_handle; /* Declare a Blob handle. */
blob_handle = NULL; /* Set handle to NULL before using it */
'HFODUHDQGLQLWLDOL]HD%ORE,'
ISC_QUAD blob_id; /* Declare a Blob ID. */
blob_id = NULL; /* Set handle to NULL before using it */
&UHDWHDQHZ%OREE\FDOOLQJisc_create_blob2()
isc_create_blob2(
status_vector,
&db_handle,
&trans,
&blob_handle, /* set by this function to refer to the new Blob */
&blob_id, /* Blob ID set by this function */
108 INTERBASE 5
BLOB DATA OPERATIONS
7KLVIXQFWLRQFUHDWHVDQHZ%ORERSHQVLWIRUZULWHDFFHVVDQGVHWVEOREBKDQGOHWRSRLQW
WRWKHQHZ%ORE
isc_create_blob2()DOVRDVVLJQVWKH%ORED%ORE,'DQGVHWVEOREBLGWRSRLQWWRWKH%ORE
,'1RWHWKDWEOREBLGLVWKHYDULDEOHSRLQWHGWRE\WKHVTOGDWDILHOGRIWKH83'$7(
VWDWHPHQWLQSXWSDUDPHWHUWKDWVSHFLILHVWKH%OREFROXPQWREHXSGDWHG7KXVZKHQWKH
83'$7(VWDWHPHQWLVH[HFXWHGWKLVQHZ%OREZLOOEHXVHGWRXSGDWHWKH%OREFROXPQ
:ULWHDOOWKHGDWDWREHZULWWHQWRWKH%OREE\PDNLQJDVHULHVRIFDOOVWR
isc_put_segment()7KHIROORZLQJH[DPSOHUHDGVOLQHVRIGDWDDQG
FRQFDWHQDWHVHDFKWRWKH%OREUHIHUHQFHGE\EOREBKDQGOH get_line()UHDGVWKH
QH[WOLQHRIGDWDWREHZULWWHQ
char *line;
unsigned short len;
. . .
line = get_line();
while (line)
{
len = strlen(line);
isc_put_segment(
status_vector,
&blob_handle,/* set by previous isc_create_blob2() */
len, /* length of buffer containing data to write */
line /* buffer containing data to write into Blob */
);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
};
line = get_line();
};
&ORVHWKH%ORE
isc_close_blob(status_vector, &blob_handle);
4 $VVRFLDWLQJWKHQHZ%OREZLWKWKH%OREFROXPQ
([HFXWHWKH83'$7(VWDWHPHQWWRDVVRFLDWHWKHQHZ%OREZLWKWKH%OREFROXPQLQWKHURZ
VHOHFWHGE\WKHVWDWHPHQW
isc_dsql_execute_immediate(
status_vector,
&db_handle,
&trans,
0, /* indicates string to execute is null-terminated */
upd_str, /* UPDATE statement string to be executed */
1, /* XSQLDA version number */
in_sqlda /* XSQLDA supplying parameters to UPDATE statement */
);
Deleting a Blob
7KHUHDUHIRXUZD\VWRGHOHWHD%ORE
g 'HOHWHWKHURZFRQWDLQLQJWKH%ORE<RXFDQXVH'64/WRH[HFXWHD'(/(7(VWDWHPHQW
g 5HSODFHWKH%OREZLWKDGLIIHUHQWRQH,ID%OREFROXPQFRQWDLQVD%ORE,'DQG\RXPRGLI\
WKHFROXPQWRUHIHUWRDGLIIHUHQW%OREWKH%OREUHIHUHQFHGE\WKHSUHYLRXVO\VWRUHG%ORE,'
ZLOOEHGHOHWHGGXULQJWKHQH[WJDUEDJHFROOHFWLRQ
g 5HVHWWR18//WKHFROXPQUHIHUULQJWRWKH%OREIRUH[DPSOHE\XVLQJ'64/WRH[HFXWHD
VWDWHPHQWOLNHWKHIROORZLQJ
UPDATE PROJECT SET PROJ_DESC = NULL WHERE PROJ_ID = "VBASE"
7KH%OREUHIHUHQFHGE\WKHSUHYLRXVO\VWRUHG%ORE,'ZLOOEHGHOHWHGGXULQJWKHQH[WJDUEDJH
FROOHFWLRQ
g 'LVFDUGD%OREDIWHULWKDVEHHQFUHDWHGEXWEHIRUHLWKDVEHHQDVVRFLDWHGZLWKDSDUWLFXODU
FROXPQRIDWDEOHURZ8VHWKHisc_cancel_blob()IXQFWLRQDVLQ
isc_cancel_blob(status_vector, &blob_handle);
110 INTERBASE 5
REQUESTING INFORMATION ABOUT AN OPEN BLOB
,QDGGLWLRQWRDSRLQWHUWRWKHHUURUVWDWXVYHFWRUDQGD%OREKDQGOHisc_blob_info()UHTXLUHV
WZRDSSOLFDWLRQSURYLGHGEXIIHUVDQLWHPOLVWEXIIHUZKHUHWKHDSSOLFDWLRQVSHFLILHVWKH
LQIRUPDWLRQLWQHHGVDQGDUHVXOWEXIIHUZKHUH,QWHU%DVHUHWXUQVWKHUHTXHVWHGLQIRUPDWLRQ
$QDSSOLFDWLRQSRSXODWHVWKHLWHPOLVWEXIIHUZLWKLQIRUPDWLRQUHTXHVWVSULRUWRFDOOLQJ
isc_blob_info()DQGSDVVHVLWERWKDSRLQWHUWRWKHLWHPOLVWEXIIHUDQGWKHVL]HLQE\WHVRI
WKDWEXIIHU
7KHDSSOLFDWLRQPXVWDOVRFUHDWHDUHVXOWEXIIHUODUJHHQRXJKWRKROGWKHLQIRUPDWLRQ
UHWXUQHGE\,QWHU%DVH,WSDVVHVERWKDSRLQWHUWRWKHUHVXOWEXIIHUDQGWKHVL]HLQE\WHVRI
WKDWEXIIHUWRisc_blob_info(),I,QWHU%DVHDWWHPSWVWRSDVVEDFNPRUHLQIRUPDWLRQWKDQ
FDQILWLQWKHUHVXOWEXIIHULWSXWVWKHYDOXHLVFBLQIRBWUXQFDWHGGHILQHGLQLEDVHKLQWKHILQDO
E\WHRIWKHUHVXOWEXIIHU
7KHUHVXOWEXIIHUUHWXUQVDVHULHVRIFOXVWHUVRILQIRUPDWLRQRQHSHULWHPUHTXHVWHG(DFK
FOXVWHUFRQVLVWVRIWKUHHSDUWV
$RQHE\WHLWHPW\SH(DFKLVWKHVDPHDVRQHRIWKHLWHPW\SHVLQWKHLWHPOLVW
EXIIHU
$E\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHURI
WKHFOXVWHU
$YDOXHVWRUHGLQDYDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQGHSHQGVRQ
WKHLWHPW\SH
$FDOOLQJSURJUDPLVUHVSRQVLEOHIRULQWHUSUHWLQJWKHFRQWHQWVRIWKHUHVXOWEXIIHUDQGIRU
GHFLSKHULQJHDFKFOXVWHUDVDSSURSULDWH
7KHFOXVWHUVUHWXUQHGWRWKHUHVXOWEXIIHUDUHQRWDOLJQHG)XUWKHUPRUHDOOQXPEHUVDUH
UHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQW
E\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUWWKHQXPEHUVWRDGDWDW\SH
QDWLYHWR\RXUV\VWHPLIQHFHVVDU\EHIRUHLQWHUSUHWLQJWKHP7KH$3,FDOO
isc_vax_integer()FDQEHXVHGWRSHUIRUPWKHFRQYHUVLRQ
7KHIROORZLQJWDEOHOLVWVLWHPVDERXWZKLFKLQIRUPDWLRQFDQEHUHTXHVWHGDQGUHWXUQHGDQG
WKHYDOXHVUHSRUWHG
,QDGGLWLRQWRWKHLQIRUPDWLRQ,QWHU%DVHUHWXUQVLQUHVSRQVHWRDUHTXHVW,QWHU%DVHFDQDOVR
UHWXUQRQHRUPRUHRIWKHIROORZLQJVWDWXVPHVVDJHVWRWKHUHVXOWEXIIHU(DFKVWDWXVPHVVDJH
LVRQHXQVLJQHGE\WHLQOHQJWK
Item Description
isc_info_end End of the messages
isc_info_truncated Result buffer is too small to hold any more requested information
isc_info_error Requested information is unavailable. Check the status vector for an
error code and message
TABLE 7.3 Status message return items
112 INTERBASE 5
REQUESTING INFORMATION ABOUT AN OPEN BLOB
}
p += length;
};
Blob descriptors
$%OREGHVFULSWRULVXVHGWRSURYLGHG\QDPLFDFFHVVWR%ORELQIRUPDWLRQ)RUH[DPSOHLWFDQ
EHXVHGWRVWRUHLQIRUPDWLRQDERXW%OREGDWDIRUILOWHULQJ FRQYHUVLRQ SXUSRVHVVXFKDV
FKDUDFWHUVHWLQIRUPDWLRQIRUWH[W%OREGDWDDQGVXEW\SHLQIRUPDWLRQIRUWH[WDQGQRQWH[W
%OREGDWD7ZR%OREGHVFULSWRUVDUHQHHGHGZKHQHYHUDILOWHUZLOOEHXVHGZKHQZULWLQJWRRU
UHDGLQJIURPD%ORERQHWRGHVFULEHWKHILOWHUVRXUFHGDWDDQGWKHRWKHUWRGHVFULEHWKH
WDUJHW
$%OREGHVFULSWRULVDVWUXFWXUHGHILQHGLQWKHLEDVHKKHDGHUILOHDVIROORZV
typedef struct {
short blob_desc_subtype; /* type of Blob data */
short blob_desc_charset; /* character set */
short blob_desc_segment_size; /* segment size */
unsigned char blob_desc_field_name [32]; /* Blob column name */
unsigned char blob_desc_relation_name [32]; /* table name */
} ISC_Blob_DESC;
)RUPRUHLQIRUPDWLRQDERXWWKHFKDUDFWHUVHWVUHFRJQL]HGE\,QWHU%DVHVHHWKH/DQJXDJH
5HIHUHQFH
7KHVHJPHQWVL]HRID%ORELVWKHPD[LPXPQXPEHURIE\WHVWKDWDQDSSOLFDWLRQLVH[SHFWHG
WRZULWHWRRUUHDGIURPWKH%ORE<RXFDQXVHWKLVVL]HWRDOORFDWH\RXURZQEXIIHUV
7KHEOREBGHVFBUHODWLRQBQDPHDQGEOREBGHVFBILHOGBQDPHILHOGVFRQWDLQQXOO
WHUPLQDWHGVWULQJV
114 INTERBASE 5
FILTERING BLOB DATA
g &DOOLQJisc_blob_set_desc()7KLVLQLWLDOL]HVWKHGHVFULSWRUIURPSDUDPHWHUV\RXFDOOLWZLWK
UDWKHUWKDQDFFHVVLQJWKHGDWDEDVHPHWDGDWD
g 6HWWLQJWKHGHVFULSWRUILHOGVGLUHFWO\
7KHIROORZLQJH[DPSOHFDOOVisc_blob_lookup_desc()WRORRNXSWKHFXUUHQWVXEW\SHDQG
FKDUDFWHUVHWLQIRUPDWLRQIRUD%OREFROXPQQDPHG352-B'(6&LQDWDEOHQDPHG352-(&7
,WVWRUHVWKHLQIRUPDWLRQLQWRWKHVRXUFHGHVFULSWRUIURPBGHVF
isc_blob_lookup_desc (
status_vector,
&db_handle; /* Set by previous isc_attach_database() call. */
&tr_handle, /* Set by previous isc_start_transaction() call. */
"PROJECT", /* Table name. */
"PROJ_DESC", /* Column name. */
&from_desc, /* Blob descriptor filled in by this function call. */
&global /* Global column name, returned by this function. */
)
)RUPRUHLQIRUPDWLRQDERXWWKHXVDJHRI%OREGHVFULSWRUVLQDSSOLFDWLRQVWKDWUHTXHVWGDWD
ILOWHULQJDQGIRUIXUWKHUH[DPSOHVRISRSXODWLQJ%OREGHVFULSWRUVVHH´:ULWLQJDQDSSOLFDWLRQ
WKDWUHTXHVWVILOWHULQJµRQSDJH
,QWKHH[DPSOHWKHILOWHU·VLQSXWVXEW\SHLVGHILQHGDV²DQGLWVRXWSXWVXEW\SHDV
²,IVXEW\SH²VSHFLILHVORZHUFDVHWH[WDQGVXEW\SH²XSSHUFDVHWH[WWKHQWKHSXUSRVH
RIILOWHU6$03/(ZRXOGEHWRWUDQVODWH%OREGDWDIURPORZHUFDVHWH[WWRXSSHUFDVHWH[W
7KH(175<B32,17DQG02'8/(B1$0(SDUDPHWHUVVSHFLI\WKHH[WHUQDOURXWLQHWKDW
,QWHU%DVHFDOOVZKHQWKHILOWHULVLQYRNHG7KH02'8/(B1$0(SDUDPHWHUVSHFLILHVILOWHUGOO
WKHG\QDPLFOLQNOLEUDU\FRQWDLQLQJWKHILOWHU·VH[HFXWDEOHFRGH7KH(175<B32,17
SDUDPHWHUVSHFLILHVWKHHQWU\SRLQWLQWRWKH'//$OWKRXJKWKHH[DPSOHVKRZVRQO\DVLPSOH
ILOHQDPHLWLVJRRGSUDFWLFHWRVSHFLI\DIXOO\TXDOLILHGSDWKQDPHVLQFHXVHUVRI\RXU
DSSOLFDWLRQQHHGWRORDGWKHILOH
116 INTERBASE 5
FILTERING BLOB DATA
4 'HILQLQJWKHILOWHUIXQFWLRQ
:KHQZULWLQJDILOWHU\RXPXVWLQFOXGHDQHQWU\SRLQWNQRZQDVDILOWHUIXQFWLRQLQWKH
GHFODUDWLRQVHFWLRQRIWKHSURJUDP,QWHU%DVHFDOOVWKHILOWHUIXQFWLRQZKHQDQDSSOLFDWLRQ
SHUIRUPVD%OREDFFHVVRSHUDWLRQRQD%OREVSHFLILHGWRXVHWKHILOWHU$OOFRPPXQLFDWLRQ
EHWZHHQ,QWHU%DVHDQGWKHILOWHULVWKURXJKWKHILOWHUIXQFWLRQ7KHILOWHUIXQFWLRQLWVHOIPD\
FDOORWKHUIXQFWLRQVWKDWFRPSULVHWKHILOWHUH[HFXWDEOH
<RXGHFODUHWKHQDPHRIWKHILOWHUIXQFWLRQDQGWKHQDPHRIWKHILOWHUH[HFXWDEOHZLWKWKH
(175<B32,17DQG02'8/(B1$0(SDUDPHWHUVRIWKH'(&/$5(),/7(5VWDWHPHQW
$ILOWHUIXQFWLRQPXVWKDYHWKHIROORZLQJGHFODUDWLRQFDOOLQJVHTXHQFH
filter_function_name(short action, isc_blob_ctl control);
7KHSDUDPHWHUDFWLRQLVRQHRIHLJKWSRVVLEOHDFWLRQPDFURGHILQLWLRQVDQGWKHSDUDPHWHU
FRQWUROLVDQLQVWDQFHRIWKHLVFBEOREBFWO%OREFRQWUROVWUXFWXUHGHILQHGLQWKH,QWHU%DVHKHDGHU
ILOHLEDVHK7KHVHSDUDPHWHUVDUHGLVFXVVHGODWHULQWKLVFKDSWHU
7KHIROORZLQJOLVWLQJRIDVNHOHWRQILOWHUGHFODUHVWKHILOWHUIXQFWLRQMSHJBILOWHU
#include <ibase.h>
#define SUCCESS 0
#define FAILURE 1
ISC_STATUS jpeg_filter(short action, isc_blob_ctl control)
{
ISC_STATUS status = SUCCESS;
switch (action)
{
case isc_blob_filter_open:
. . .
break;
case isc_blob_filter_get_segment:
. . .
break;
case isc_blob_filter_create:
. . .
break;
case isc_blob_filter_put_segment:
. . .
break;
case isc_blob_filter_close:
. . .
break;
case isc_blob_filter_alloc:
. . .
break;
case isc_blob_filter_free:
. . .
break;
case isc_blob_filter_seek:
. . .
break;
default:
. . .
break;
}
return status;
}
,QWHU%DVHSDVVHVRQHRIHLJKWSRVVLEOHDFWLRQVWRWKHILOWHUIXQFWLRQMSHJBILOWHUE\ZD\RIWKH
DFWLRQSDUDPHWHUDQGDOVRSDVVHVDQLQVWDQFHRIWKH%OREFRQWUROVWUXFWXUHLVFBEOREBFWOE\ZD\
RIWKHSDUDPHWHUFRQWURO
7KHHOOLSVHV « LQWKHSUHYLRXVOLVWLQJUHSUHVHQWFRGHWKDWSHUIRUPVVRPHRSHUDWLRQVEDVHG
RQHDFKDFWLRQRUHYHQWWKDWLVOLVWHGLQWKHFDVHVWDWHPHQW0RVWRIWKHDFWLRQVFRUUHVSRQG
WR$3,IXQFWLRQVFDOOHGE\DQDSSOLFDWLRQ)RUPRUHLQIRUPDWLRQUHJDUGLQJWKHW\SHVRIFRGH
WRZULWHIRUHDFKDFWLRQVHHWKH3URJUDPPHU·V*XLGH
4 'HILQLQJWKH%OREFRQWUROVWUXFWXUH
7KHLVFBEOREBFWO%OREFRQWUROVWUXFWXUHSURYLGHVWKHIXQGDPHQWDOPHWKRGRIGDWDH[FKDQJH
EHWZHHQ,QWHU%DVHDQGDILOWHU
7KH%OREFRQWUROVWUXFWXUHLVGHILQHGDVDW\SHGHILVFBEOREBFWOLQLEDVHKDVIROORZV
typedef struct isc_blob_ctl {
ISC_STATUS (*ctl_source)();
/* Internal InterBase Blob access routine. */
struct isc_blob_ctl *ctl_source_handle;
/* Instance of isc_blob_ctl to pass to
internal InterBase Blob access routine. */
short ctl_to_sub_type;/* Target subtype. */
short ctl_from_sub_type;/* Source subtype. */
unsigned short ctl_buffer_length; /* Length of ctl_buffer. */
unsigned short ctl_segment_length; /* Length of current segment. */
118 INTERBASE 5
FILTERING BLOB DATA
7KHSXUSRVHRIFHUWDLQLVFBEOREBFWOILHOGVGHSHQGRQWKHDFWLRQEHLQJSHUIRUPHG
)RUH[DPSOHZKHQDQDSSOLFDWLRQFDOOVWKHisc_put_segment() $3,IXQFWLRQ,QWHU%DVH
SDVVHVDQLVFBEOREBILOWHUBSXWBVHJPHQWDFWLRQWRWKHILOWHUIXQFWLRQ7KHEXIIHUSRLQWHGWRE\WKH
FWOBEXIIHUILHOGRIWKHFRQWUROVWUXFWXUHSDVVHGWRWKHILOWHUIXQFWLRQFRQWDLQVWKHVHJPHQWGDWD
WREHZULWWHQDVVSHFLILHGE\WKHDSSOLFDWLRQLQLWVFDOOWRisc_put_segment()%HFDXVHWKH
EXIIHUFRQWDLQVLQIRUPDWLRQSDVVHGLQWRWKHILOWHUIXQFWLRQLWLVFDOOHGDQ,1ILHOG7KHILOWHU
IXQFWLRQVKRXOGLQFOXGHLQVWUXFWLRQVLQWKHFDVHVWDWHPHQWXQGHUWKHLVFBEOREBILOWHUBSXWBVHJPHQW
FDVHIRUSHUIRUPLQJWKHILOWHULQJDQGWKHQSDVVLQJWKHGDWDRQIRUZULWLQJWRWKHGDWDEDVH7KLV
FDQEHGRQHE\FDOOLQJWKH FWOBVRXUFHLQWHUQDO,QWHU%DVH%OREDFFHVVURXWLQH)RUPRUH
LQIRUPDWLRQDERXWFWOBVRXUFHVHHWKH3URJUDPPHU·V*XLGH
2QWKHRWKHUKDQGZKHQDQDSSOLFDWLRQFDOOVWKHisc_get_segment()$3,IXQFWLRQWKH
EXIIHUSRLQWHGWRE\FWOBEXIIHULQWKHFRQWUROVWUXFWXUHSDVVHGWRDILOWHUIXQFWLRQLVHPSW\,Q
WKLVVLWXDWLRQ,QWHU%DVHSDVVHVDQLVFBEOREBILOWHUBJHWBVHJPHQWDFWLRQWRWKHILOWHUIXQFWLRQ7KH
ILOWHUIXQFWLRQLVFBEOREBILOWHUBJHWBVHJPHQWDFWLRQKDQGOLQJVKRXOGLQFOXGHLQVWUXFWLRQVIRUILOOLQJ
FWOBEXIIHUZLWKVHJPHQWGDWDIURPWKHGDWDEDVHWRUHWXUQWRWKHDSSOLFDWLRQ7KLVFDQEHGRQH
E\FDOOLQJWKH FWOBVRXUFHLQWHUQDO,QWHU%DVH%OREDFFHVVURXWLQH,QWKLVFDVHEHFDXVHWKH
EXIIHULVXVHGIRUILOWHUIXQFWLRQRXWSXWLWLVFDOOHGDQ287ILHOG
7KHIROORZLQJWDEOHGHVFULEHVHDFKRIWKHILHOGVLQWKHLVFBEOREBFWO%OREFRQWUROVWUXFWXUHDQG
ZKHWKHUWKH\DUHXVHGIRUILOWHUIXQFWLRQLQSXW ,1 RURXWSXW 287
120 INTERBASE 5
FILTERING BLOB DATA
4 3URJUDPPLQJILOWHUIXQFWLRQDFWLRQV
:KHQDQDSSOLFDWLRQLQYRNHVD%ORE$3,IXQFWLRQRQD%OREWREHILOWHUHG,QWHU%DVHSDVVHV
DFRUUHVSRQGLQJDFWLRQPHVVDJHWRWKHILOWHUIXQFWLRQE\ZD\RIWKHDFWLRQSDUDPHWHU7KHUH
DUHHLJKWSRVVLEOHDFWLRQV7KHIROORZLQJDFWLRQPDFURGHILQLWLRQVDUHGHFODUHGLQWKHLEDVHK
ILOH
#define isc_blob_filter_open 0
#define isc_blob_filter_get_segment 1
#define isc_blob_filter_close 2
#define isc_blob_filter_create 3
#define isc_blob_filter_put_segment 4
#define isc_blob_filter_alloc 5
#define isc_blob_filter_free 6
#define isc_blob_filter_seek 7
7KHIROORZLQJWDEOHOLVWVWKHDFWLRQVDQGVSHFLILHVZKHQWKHILOWHUIXQFWLRQLVLQYRNHGZLWK
HDFKSDUWLFXODUDFWLRQ0RVWRIWKHDFWLRQVDUHWKHUHVXOWRIHYHQWVWKDWRFFXUZKHQDQ
DSSOLFDWLRQLQYRNHVD%ORE$3,IXQFWLRQ
7KLVFRQFOXGHVWKHRYHUYLHZRIZULWLQJ%OREILOWHUV)RUGHWDLOHGLQIRUPDWLRQDERXWILOWHUVDQG
KRZWRSURJUDPILOWHUIXQFWLRQDFWLRQVDVZHOODVDUHIHUHQFHWRDILOWHUDSSOLFDWLRQH[DPSOH
VHHWKH3URJUDPPHU·V*XLGH
122 INTERBASE 5
FILTERING BLOB DATA
4 8QGHUVWDQGLQJWKH%ORESDUDPHWHUEXIIHU
$%ORESDUDPHWHUEXIIHU %3% LVQHHGHGZKHQHYHUDILOWHUZLOOEHXVHGZKHQZULWLQJWRRU
UHDGLQJIURPD%ORE
7KH%3%LVDFKDUDUUD\YDULDEOHVSHFLILFDOO\GHFODUHGLQDQDSSOLFDWLRQWKDWFRQWDLQVWKH
VRXUFHDQGWDUJHWVXEW\SHV:KHQGDWDLVUHDGIURPRUZULWWHQWRWKH%OREDVVRFLDWHGZLWKWKH
%3%,QWHU%DVHZLOODXWRPDWLFDOO\LQYRNHDQDSSURSULDWHILOWHUEDVHGRQWKHVRXUFHDQGWDUJHW
VXEW\SHVVSHFLILHGLQWKH%3%
,IWKHVRXUFHDQGWDUJHWVXEW\SHVDUHERWK 7(;7 DQGWKH%3%DOVRVSHFLILHVGLIIHUHQW
VRXUFHDQGWDUJHWFKDUDFWHUVHWVWKHQZKHQGDWDLVUHDGIURPRUZULWWHQWRWKH%OREDVVRFLDWHG
ZLWKWKH%3%,QWHU%DVHZLOODXWRPDWLFDOO\FRQYHUWHDFKFKDUDFWHUIURPWKHVRXUFHWRWKH
WDUJHWFKDUDFWHUVHW
$%ORESDUDPHWHUEXIIHUFDQEHJHQHUDWHGLQRQHRIWZRZD\V
,QGLUHFWO\WKURXJK$3,FDOOVWRFUHDWHVRXUFHDQGWDUJHWGHVFULSWRUVDQGWKHQ
JHQHUDWHWKH%3%IURPWKHLQIRUPDWLRQLQWKHGHVFULSWRUV
'LUHFWO\E\SRSXODWLQJWKH%3%DUUD\ZLWKDSSURSULDWHYDOXHV
,I\RXJHQHUDWHD%3%YLD$3,FDOOV\RXGRQRWQHHGWRNQRZWKHIRUPDWRIWKH%3%%XWLI
\RXZLVKWRGLUHFWO\JHQHUDWHD%3%WKHQ\RXPXVWNQRZWKHIRUPDW
%RWKDSSURDFKHVDUHGHVFULEHGLQWKHIROORZLQJVHFWLRQV7KHIRUPDWRIWKH%3%LV
GRFXPHQWHGLQWKHVHFWLRQDERXWGLUHFWO\SRSXODWLQJWKH%3%
status_vector,
&db_handle; /* set in previous isc_attach_database() call */
&tr_handle, /* set in previous isc_start_transaction() call */
“TOURISM", /* table name */
"GUIDEBOOK", /* column name */
&from_desc, /* Blob descriptor filled in by this function call */
&global);
if (status_vector[0] == 1 && status_vector[1])
{
/* process error */
isc_print_status(status_vector);
return(1);
};
isc_blob_default_desc (
&to_desc, /* Blob descriptor filled in by this function call */
"", /* NULL table name; it's not needed in this case */
""); /* NULL column name; it's not needed in this case */
)RUPRUHLQIRUPDWLRQDERXW%OREGHVFULSWRUVVHH´%OREGHVFULSWRUVµRQSDJH
'HFODUHDFKDUDFWHUDUUD\ZKLFKZLOOEHXVHGDVWKH%3%0DNHVXUHLWLVDWOHDVW
DVODUJHDVDOOWKHLQIRUPDWLRQWKDWZLOOEHVWRUHGLQWKHEXIIHU
char bpb[20];
'HFODUHDQXQVLJQHGVKRUWYDULDEOHLQWRZKLFK,QWHU%DVHZLOOVWRUHWKHDFWXDO
OHQJWKRIWKH%3%GDWD
unsigned short actual_bpb_length;
&DOOisc_blob_gen_bpb()WRSRSXODWHWKH%3%EDVHGRQWKHVRXUFHDQGWDUJHW
%OREGHVFULSWRUVSDVVHGWRisc_blob_gen_bpb())RUH[DPSOH
isc_blob_gen_bpb(
status_vector,
&to_desc, /* target Blob descriptor */
&from_desc, /* source Blob descriptor */
sizeof(bpb), /* length of BPB buffer */
bpb, /* buffer into which the generated BPB will be stored */
&actual_bpb_length /* actual length of generated BPB */
);
124 INTERBASE 5
FILTERING BLOB DATA
$%3%FRQVLVWVRIWKHIROORZLQJSDUWV
$E\WHVSHFLI\LQJWKHYHUVLRQRIWKHSDUDPHWHUEXIIHUDOZD\VWKHFRPSLOHWLPH
FRQVWDQWLVFBESEBYHUVLRQ
$FRQWLJXRXVVHULHVRIRQHRUPRUHFOXVWHUVRIE\WHVHDFKGHVFULELQJDVLQJOH
SDUDPHWHU
(DFKFOXVWHUFRQVLVWVRIWKHIROORZLQJSDUWV
$RQHE\WHSDUDPHWHUW\SH7KHUHDUHFRPSLOHWLPHFRQVWDQWVGHILQHGIRUDOOWKH
SDUDPHWHUW\SHV IRUH[DPSOHLVFBESEBWDUJHWBW\SH
$RQHE\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHU
RIWKHFOXVWHU
$YDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQGHSHQGVRQWKHSDUDPHWHU
W\SH
Note $OOQXPEHUVLQWKH%ORESDUDPHWHUEXIIHUPXVWEHUHSUHVHQWHGLQDJHQHULFIRUPDW
ZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQWE\WHODVW6LJQHGQXPEHUVVKRXOG
KDYHWKHVLJQLQWKHODVWE\WH7KH$3,IXQFWLRQisc_vax_integer()FDQEHXVHGWRUHYHUVHWKH
E\WHRUGHURIDQXPEHU)RUPRUHLQIRUPDWLRQDERXWisc_vax_integer()VHH
´LVFBYD[BLQWHJHU µRQSDJH
7KHIROORZLQJWDEOHOLVWVWKHSDUDPHWHUW\SHVDQGWKHLUPHDQLQJ
7KH%3%PXVWFRQWDLQLVFBESEBYHUVLRQDWWKHEHJLQQLQJDQGPXVWFRQWDLQFOXVWHUVVSHFLI\LQJ
WKHVRXUFHDQGWDUJHWVXEW\SHV&KDUDFWHUVHWFOXVWHUVDUHRSWLRQDO,IWKHVRXUFHDQGWDUJHW
VXEW\SHVDUHERWK 7(;7 DQGWKH%3%DOVRVSHFLILHVGLIIHUHQWVRXUFHDQGWDUJHWFKDUDFWHU
VHWVWKHQZKHQGDWDLVUHDGIURPRUZULWWHQWRWKH%OREDVVRFLDWHGZLWKWKH%3%,QWHU%DVH
ZLOODXWRPDWLFDOO\FRQYHUWHDFKFKDUDFWHUIURPWKHVRXUFHWRWKHWDUJHWFKDUDFWHUVHW
7KHIROORZLQJLVDQH[DPSOHRIGLUHFWO\FUHDWLQJD%3%IRUDILOWHUZKRVHVRXUFHVXEW\SHLV
²DQGWDUJHWVXEW\SHLV 7(;7
char bpb[] = {
isc_bpb_version1,
isc_bpb_target_type,
1, /* # bytes that follow which specify target subtype */
1, /* target subtype (TEXT) */
isc_bpb_source_type,
1, /* # bytes that follow which specify source subtype */
–4, /* source subtype*/
};
2IFRXUVHLI\RXGRQRWNQRZWKHVRXUFHDQGWDUJHWVXEW\SHVXQWLOUXQWLPH\RXFDQDVVLJQ
WKRVHYDOXHVLQWKHDSSURSULDWH%3%ORFDWLRQVDWUXQWLPH
4 5HTXHVWLQJILOWHUXVDJH
<RXUHTXHVWXVDJHRIDILOWHUZKHQRSHQLQJRUFUHDWLQJD%OREIRUUHDGRUZULWHDFFHVV,QWKH
FDOOWRisc_open_blob2() RU isc_create_blob2()SDVVWKH%3%ZKRVHLQIRUPDWLRQ
,QWHU%DVHZLOOXVHWRGHWHUPLQHZKLFKILOWHUVKRXOGEHFDOOHG
7KHIROORZLQJH[DPSOHLOOXVWUDWHVFUHDWLQJDQGRSHQLQJD%OREIRUZULWHDFFHVV)RUIXUWKHU
LQIRUPDWLRQDERXWZULWLQJGDWDWRD%OREDQGXSGDWLQJD%OREFROXPQRIDWDEOHURZWRUHIHU
WRWKHQHZ%OREVHH´:ULWLQJGDWDWRD%OREµRQSDJH
2SHQLQJD%OREIRUUHDGDFFHVVUHTXLUHVDGGLWLRQDOVWHSVWRVHOHFWWKHDSSURSULDWH%OREWREH
RSHQHG)RUPRUHLQIRUPDWLRQVHH´5HDGLQJGDWDIURPD%OREµRQSDJH
isc_blob_handle blob_handle; /* declare at beginning */
ISC_QUAD blob_id; /* declare at beginning */
. . .
isc_create_blob2(
status_vector,
&db_handle,
&tr_handle,
&blob_handle, /* to be filled in by this function */
&blob_id, /* to be filled in by this function */
actual_bpb_length, /* length of BPB data */
&bpb /* Blob parameter buffer */
)
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
126 INTERBASE 5
CHAPTER
Function Purpose
isc_array_lookup_desc() Looks up and stores into an array descriptor the datatype, length,
scale, and dimensions for all elements in the specified array column of
the specified table
isc_array_lookup_bounds() Performs the same actions as the function,
isc_array_lookup_desc(), but also looks up and stores the upper
and lower bounds of each dimension
isc_array_set_desc() Initializes an array descriptor from parameters passed to it
isc_array_get_slice() Retrieves data from an array
isc_array_put_slice() Writes data to an array
TABLE 8.1 API array access functions
127
CHAPTER 8 WORKING WITH ARRAY DATA
Introduction to arrays
,QWHU%DVHVXSSRUWVDUUD\VRIPRVWGDWDW\SHV8VLQJDQDUUD\HQDEOHVPXOWLSOHGDWDLWHPVWREH
VWRUHGLQDVLQJOHFROXPQ,QWHU%DVHFDQWUHDWDQDUUD\DVDVLQJOHXQLWRUDVDVHULHVRIVHSDUDWH
XQLWVFDOOHGslices8VLQJDQDUUD\LVDSSURSULDWHZKHQ
g 7KHGDWDLWHPVQDWXUDOO\IRUPDVHWRIWKHVDPHGDWDW\SH
g 7KHHQWLUHVHWRIGDWDLWHPVLQDVLQJOHGDWDEDVHFROXPQPXVWEHUHSUHVHQWHGDQGFRQWUROOHG
DVDXQLWDVRSSRVHGWRVWRULQJHDFKLWHPLQDVHSDUDWHFROXPQ
g (DFKLWHPPXVWDOVREHLGHQWLILHGDQGDFFHVVHGLQGLYLGXDOO\
7KHGDWDLWHPVLQDQDUUD\DUHFDOOHGarray elements$QDUUD\FDQFRQWDLQHOHPHQWVRIDQ\
,QWHU%DVHGDWDW\SHH[FHSW%OREDQGFDQQRWEHDQDUUD\RIDUUD\V$OORIWKHHOHPHQWVRID
SDUWLFXODUDUUD\DUHRIWKHVDPHGDWDW\SH
,QWHU%DVHVXSSRUWVPXOWLGLPHQVLRQDODUUD\VDUUD\VZLWKWRGLPHQVLRQV
0XOWLGLPHQVLRQDODUUD\VDUHVWRUHGLQURZPDMRURUGHU
$UUD\GLPHQVLRQVKDYHDVSHFLILFUDQJHRIXSSHUDQGORZHUERXQGDULHVFDOOHGsubscripts
7KHDUUD\VXEVFULSWVDUHGHILQHGZKHQDQDUUD\FROXPQLVFUHDWHG)RULQIRUPDWLRQDERXW
FUHDWLQJDQDUUD\VHHWKH/DQJXDJH5HIHUHQFH
Array descriptors
$Qarray descriptorGHVFULEHVDQDUUD\RUDUUD\VXEVHWWREHUHWULHYHGRUZULWWHQWRWKH
,6&B$55$<B'(6&VWUXFWXUH,6&B$55$<B'(6&LVGHILQHGLQWKH,QWHU%DVHLEDVHK
KHDGHUILOHDVIROORZV
typedef struct {
unsigned char array_desc_dtype; /* Datatype */
char array_desc_scale; /* Scale for numeric datatypes */
unsigned short array_desc_length;
/* Length in bytes of each array element */
char array_desc_field_name [32]; /* Column name */
char array_desc_relation_name [32]; /* Table name */
128 INTERBASE 5
INTRODUCTION TO ARRAYS
,6&B$55$<B%281'LVGHILQHGDV
typedef struct {
short array_bound_lower; /* lower bound */
short array_bound_upper; /* upper bound */
} ISC_ARRAY_BOUND;
$QDUUD\GHVFULSWRUFRQWDLQV,6&B$55$<B%281'VWUXFWXUHVRQHIRUHDFKSRVVLEOH
GLPHQVLRQ$QDUUD\ZLWKnGLPHQVLRQVKDVXSSHUDQGORZHUERXQGVVHWIRUWKHILUVWn
,6&B$55$<B%281'VWUXFWXUHV7KHQXPEHURIDFWXDODUUD\GLPHQVLRQVLVVSHFLILHGLQWKH
array_desc_dimensionsILHOGRIWKHDUUD\GHVFULSWRU
:KHQ\RXUHWULHYHGDWDIURPDQDUUD\\RXVXSSO\DQDUUD\GHVFULSWRUGHILQLQJWKHDUUD\VOLFH
HQWLUHDUUD\RUVXEVHWRIFRQWLJXRXVDUUD\HOHPHQWV WREHUHWULHYHG6LPLODUO\ZKHQ\RXZULWH
GDWDWRDQDUUD\\RXVXSSO\DQDUUD\GHVFULSWRUGHILQLQJWKHDUUD\VOLFHWREHZULWWHQWR
g &DOOisc_array_lookup_bounds()ZKLFKORRNVDQGIXQFWLRQVWKHVDPHDVDFDOOWR
isc_array_lookup_desc()H[FHSWWKDWWKHIXQFWLRQisc_array_lookup_bounds()DOVR
ORRNVXSDQGVWRUHVLQWRWKHDUUD\GHVFULSWRUWKHXSSHUDQGORZHUERXQGVRIHDFKGLPHQVLRQ
g &DOOisc_array_set_desc()ZKLFKLQLWLDOL]HVWKHGHVFULSWRUIURPSDUDPHWHUVUDWKHUWKDQE\
DFFHVVLQJWKHGDWDEDVHPHWDGDWD)RUH[DPSOH
short dtype = SQL_TEXT;
short len = 8;
short numdims = 2;
isc_array_set_desc(
status_vector,
"TABLE1", /* table name */
"CHAR_ARRAY", /* array column name */
&dtype, /* datatype of elements */
&len, /* length of each element */
&numdims, /* number of array dimensions */
&desc /* descriptor to be filled in */
);
g 6HWWLQJWKHGHVFULSWRUILHOGVGLUHFWO\$QH[DPSOHRIVHWWLQJWKHarray_desc_dimensions
ILHOGRIWKHGHVFULSWRUdesc,LV
desc.array_desc_dimensions = 2;
)RUFRPSOHWHV\QWD[DQGLQIRUPDWLRQDERXWisc_array_lookup_bounds()
isc_array_lookup_desc()DQGisc_array_set_desc()VHH&KDSWHU´$3,)XQFWLRQ
5HIHUHQFHµ
130 INTERBASE 5
ACCESSING ARRAY DATA
4 &UHDWLQJWKH6(/(&7VWDWHPHQW
(OLFLWDVWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHWKDWFRQVLVWVRIWKH64/TXHU\WKDWZLOO
VHOHFWURZVFRQWDLQLQJWKHDUUD\GDWDRILQWHUHVW,Q\RXUTXHU\VSHFLI\WKHDUUD\FROXPQQDPH
DQGWKHQDPHVRIDQ\RWKHUFROXPQVFRQWDLQLQJGDWD\RXDUHLQWHUHVWHGLQ)RUH[DPSOHWKH
IROORZLQJFUHDWHVDQ64/TXHU\VWDWHPHQWVWULQJWKDWVHOHFWVDQDUUD\FROXPQQDPHG
48$57B+($'B&17DQGDQRWKHUFROXPQQDPHG'(37B12IURPWKHWDEOH
352-B'(37B%8'*(7
char *sel_str =
"SELECT DEPT_NO, QUART_HEAD_CNT FROM PROJ_DEPT_BUDGET \
WHERE year = 1994 AND PROJ_ID = ’VBASE’";
4 3UHSDULQJWKHRXWSXW;64/'$
0RVWTXHULHVUHWXUQRQHRUPRUHURZVRIGDWDUHIHUUHGWRDVDVHOHFWOLVW$QRXWSXW
;64/'$PXVWEHFUHDWHGWRVWRUHWKHFROXPQGDWDIRUHDFKURZWKDWLVIHWFKHG)RUDQDUUD\
FROXPQWKHFROXPQGDWDLVDQLQWHUQDODUUD\LGHQWLILHU DUUD\,' WKDWLVQHHGHGWRDFFHVVWKH
DFWXDOGDWD7RSUHSDUHWKH;64/'$IROORZWKHVHVWHSV
'HFODUHDYDULDEOHWRKROGWKH;64/'$)RUH[DPSOHWKHIROORZLQJGHFODUDWLRQ
FUHDWHVDQ;64/'$FDOOHG out_sqlda
XSQLDA *out_sqlda;
$OORFDWHPHPRU\IRUWKH;64/'$XVLQJWKH;64/'$B/(1*7+PDFUR7KH
;64/'$PXVWFRQWDLQRQH;64/9$5VXEVWUXFWXUHIRUHDFKFROXPQWREH
IHWFKHG7KHIROORZLQJVWDWHPHQWDOORFDWHVVWRUDJHIRUDQRXWSXW;64/'$
out_sqlda ZLWKWZR;64/9$5VXEVWUXFWXUHV
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(2));
6HWWKHversionILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHsqln
ILHOGRIWKH;64/'$WRLQGLFDWHWKHQXPEHURI;64/9$5VXEVWUXFWXUHV
DOORFDWHG
out_sqlda->version = SQLDA_VERSION1;
out_sqlda->sqln = 2;
4 3UHSDULQJWKH6(/(&7VWDWHPHQWIRUH[HFXWLRQ
$IWHUDQ;64/'$LVFUHDWHGIRUKROGLQJWKHFROXPQGDWDIRUHDFKVHOHFWHGURZWKHTXHU\
VWDWHPHQWVWULQJFDQEHSUHSDUHGIRUH[HFXWLRQ)ROORZWKHVHVWHSV
'HFODUHDQGLQLWLDOL]HDQ64/VWDWHPHQWKDQGOHWKHQDOORFDWHLWZLWK
isc_dsql_allocate_statement()
isc_stmt_handle stmt; /* Declare a statement handle. */
stmt = NULL; /* Set handle to NULL before allocation. */
isc_dsql_allocate_statement(status_vector, &db_handle, &stmt);
5HDG\WKHVWDWHPHQWVWULQJIRUH[HFXWLRQZLWKisc_dsql_prepare()7KLVFKHFNV
WKHVWULQJ sel_str IRUV\QWD[HUURUVSDUVHVLWLQWRDIRUPDWWKDWFDQEHHIILFLHQWO\
H[HFXWHGDQGVHWVWKHVWDWHPHQWKDQGOH stmt WRUHIHUWRWKLVSDUVHGIRUPDW
7KHVWDWHPHQWKDQGOHLVXVHGLQDODWHUFDOOWRisc_dsql_execute()
132 INTERBASE 5
ACCESSING ARRAY DATA
,I isc_dsql_prepare()LVSDVVHGDSRLQWHUWRWKHRXWSXW;64/'$DVLQWKHIROORZLQJ
H[DPSOHLWZLOOILOOLQPRVWILHOGVRIWKH;64/'$DQGDOOLWV;64/9$5VXEVWUXFWXUHV
ZLWKLQIRUPDWLRQVXFKDVWKHGDWDW\SHOHQJWKDQGQDPHRIWKHFRUUHVSRQGLQJFROXPQV
LQWKHVWDWHPHQW
$VDPSOHFDOOWRisc_dsql_prepare()LV
isc_dsql_prepare(
status_vector,
&trans, /* Set by previous isc_start_transaction() call. */
&stmt, /* Statement handle set by this function call. */
0, /* Specifies statement string is null-terminated. */
sel_str, /* Statement string. */
1, /* XSQLDA version number. */
out_sqlda /* XSQLDA for storing column data. */
);
6HWXSDQ;64/9$5VWUXFWXUHIRUHDFKFROXPQ6HWWLQJXSDQ;64/9$5
VWUXFWXUHLQYROYHVWKHIROORZLQJVWHSV
)RUFROXPQVZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPH
6SHFLI\WKHFROXPQ·VGDWDW\SH LILWZDVQRWVHWE\isc_dsql_prepare()DVSUHYLRXVO\
GHVFULEHG
3RLQWWKHsqldataILHOGRIWKH;64/9$5WRDQDSSURSULDWHORFDOYDULDEOH
)RUFROXPQVZKRVHW\SHVDUHQRWNQRZQXQWLOUXQWLPH
&RHUFHWKHLWHP·VGDWDW\SH RSWLRQDO IRUH[DPSOHIURP64/B9$5<,1*WR
64/B7(;7
'\QDPLFDOO\DOORFDWHORFDOVWRUDJHIRUWKHGDWDSRLQWHGWRE\WKHsqldataILHOGRIWKH
;64/9$5
)RUERWK
3URYLGHD18//YDOXHLQGLFDWRUIRUWKHSDUDPHWHU
à 'DWDUHWULHYDOIRUDUUD\ DQG%ORE FROXPQVLVGLIIHUHQWIURPRWKHUW\SHVRIFROXPQVVRWKH
;64/9$5ILHOGVPXVWEHVHWGLIIHUHQWO\)RUQRQDUUD\ DQGQRQ%ORE FROXPQV
isc_dsql_prepare()VHWVHDFK;64/9$5sqltypeILHOGWRWKHDSSURSULDWHILHOGW\SHDQG
WKHGDWDUHWULHYHGZKHQDVHOHFWOLVWURZ·VGDWDLVIHWFKHGLVSODFHGLQWRWKHsqldataVSDFH
DOORFDWHGIRUWKHFROXPQ)RUDUUD\FROXPQVWKHW\SHLVVHWWR64/B$55$< RU
64/B$55$<LIWKHDUUD\FROXPQLVDOORZHGWREH18// ,QWHU%DVHVWRUHVWKHLQWHUQDO
DUUD\LGHQWLILHU DUUD\,' QRWWKHDUUD\GDWDLQWKHsqldataVSDFHZKHQDURZ·VGDWDLV
IHWFKHGVR\RXPXVWSRLQWsqldataWRDQDUHDWKHVL]HRIDQDUUD\,'7RVHHKRZWRUHWULHYH
WKHDFWXDODUUD\RUDUUD\VOLFHGDWDRQFH\RXKDYHDQDUUD\,'VHH´5HDGLQJDQGSURFHVVLQJ
WKHDUUD\GDWDµRQSDJH
à 7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHDVVLJQPHQWVIRUDUUD\DQGQRQDUUD\FROXPQV
ZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPH)RUPRUHLQIRUPDWLRQDERXW'64/DQGWKH
;64/'$DQGZRUNLQJZLWKFROXPQVZKRVHW\SHVDUHXQNQRZQXQWLOUXQWLPHVHH&KDSWHU
´:RUNLQJZLWK'\QDPLF64/µ
ISC_QUAD array_id = 0L;
char dept_no[6];
short flag0, flag1;
out_sqlda->sqlvar[0].sqldata = (char *) dept_no;
out_sqlda->sqlvar[0].sqltype = SQL_TEXT + 1;
out_sqlda->sqlvar[0].sqlind = &flag0;
out_sqlda->sqlvar[1].sqldata = (char *) &array_id;
out_sqlda->sqlvar[1].sqltype = SQL_ARRAY + 1;
out_sqlda->sqlvar[1].sqlind = &flag1;
4 ([HFXWLQJWKHVWDWHPHQW
2QFHWKHTXHU\VWDWHPHQWVWULQJLVSUHSDUHGLWFDQEHH[HFXWHG
isc_dsql_execute(
status_vector,
&trans, /* set by previous isc_start_transaction() call */
&stmt, /* set above by isc_dsql_prepare() */
1, /* XSQLDA version number */
NULL /* NULL since stmt doesn’t have input values */
);
7KLVVWDWHPHQWFUHDWHVDVHOHFWOLVWWKHURZVUHWXUQHGE\H[HFXWLRQRIWKH
VWDWHPHQW
4 3RSXODWLQJWKHDUUD\GHVFULSWRU
7RSUHSDUHDQDUUD\GHVFULSWRUWKDWGHVFULEHVWKHDUUD\RUDUUD\VOLFHWREHUHDGIROORZWKHVH
VWHSV
&UHDWHWKHDUUD\GHVFULSWRU
ISC_ARRAY_DESC desc;
)LOOLQWKHGHVFULSWRUZLWKLQIRUPDWLRQUHJDUGLQJWKHDUUD\FROXPQIURPZKLFK
GDWDZLOOEHUHDG'RWKLVHLWKHUE\FDOOLQJRQHRIWKHIXQFWLRQV
isc_array_lookup_bounds()isc_array_lookup_desc()RU
isc_array_set_desc()RUE\GLUHFWO\ILOOLQJLQWKHGHVFULSWRU)RULQIRUPDWLRQRQ
WKHFRQWHQWVRIDUUD\GHVFULSWRUVDQGWKHXVDJHRIWKHVHIXQFWLRQVVHH´$UUD\
GHVFULSWRUVµRQSDJH
(QVXUHWKHGHVFULSWRUERXQGDULHVDUHVHWWRWKRVHRIWKHVOLFHWREHUHDG
134 INTERBASE 5
ACCESSING ARRAY DATA
6XSSRVHWKHDUUD\FROXPQ48$57B+($'B&17LVDRQHGLPHQVLRQDODUUD\FRQVLVWLQJ
RIIRXUHOHPHQWVDQGLWZDVGHFODUHGWRKDYHDORZHUVXEVFULSWERXQGRIDQGDQXSSHU
ERXQGRIZKHQLWZDVFUHDWHG7KHQDIWHUWKHDERYHFDOOWR
isc_array_lookup_bounds()WKHDUUD\GHVFULSWRUILHOGVIRUWKHERXQGDULHVFRQWDLQWKH
IROORZLQJLQIRUPDWLRQ
desc.array_desc_bounds[0].array_bound_lower == 1
desc.array_desc_bounds[0].array_bound_upper == 4
,I\RXZDQWWRUHDGMXVWDVOLFHRIWKHDUUD\WKHQPRGLI\WKHXSSHUDQGRUORZHUERXQGV
DSSURSULDWHO\)RUH[DPSOHLI\RXMXVWZDQWWRUHDGWKHILUVWWZRHOHPHQWVRIWKHDUUD\
WKHQPRGLI\WKHXSSHUERXQGWRWKHYDOXHDVLQ
desc.array_desc_bounds[0].array_bound_upper = 2
4 )HWFKLQJVHOHFWHGURZV
$ORRSLQJFRQVWUXFWLVXVHGWRIHWFK LQWRWKHRXWSXW;64/'$ WKHFROXPQGDWDIRUDVLQJOH
URZDWDWLPHIURPWKHVHOHFWOLVWDQGWRSURFHVVHDFKURZEHIRUHWKHQH[WURZLVIHWFKHG(DFK
H[HFXWLRQRIisc_dsql_fetch()IHWFKHVWKHFROXPQGDWDIRUWKHQH[WURZLQWRWKH
FRUUHVSRQGLQJ;64/9$5VWUXFWXUHVRIout_sqlda)RUWKHDUUD\FROXPQWKHDUUD\,'QRW
WKHDFWXDODUUD\GDWDLVIHWFKHG
ISC_STATUS fetch_stat;
long SQLCODE;
. . .
while ((fetch_stat = j
isc_dsql_fetch(status_vector, &stmt, 1, out_sqlda))
== 0)
{
/* Read and process the array data */
}
if (fetch_stat != 100L)
{
4 5HDGLQJDQGSURFHVVLQJWKHDUUD\GDWD
7RUHDGDQGSURFHVVWKHDUUD\RUDUUD\VOLFHGDWD
&UHDWHDEXIIHUIRUKROGLQJWKHDUUD\GDWDWREHUHDG0DNHLWODUJHHQRXJKWR
KROGDOOWKHHOHPHQWVLQWKHVOLFHWREHUHDG ZKLFKFRXOGEHWKHHQWLUHDUUD\ )RU
H[DPSOHWKHIROORZLQJGHFODUHVDQDUUD\EXIIHUODUJHHQRXJKWRKROGORQJ
HOHPHQWV
long hcnt[4];
'HFODUHDVKRUWYDULDEOHIRUVSHFLI\LQJWKHVL]HRIWKHDUUD\EXIIHU
short len;
6HWWKHYDULDEOHWRWKHEXIIHUOHQJWK
len = sizeof(hcnt);
5HDGWKHDUUD\RUDUUD\VOLFHGDWDLQWRWKHEXIIHUE\FDOOLQJ
isc_array_get_slice()3URFHVVWKHGDWDUHDG,QWKHIROORZLQJH[DPSOHWKH
DUUD\LVUHDGLQWRWKHhcntDUUD\EXIIHUDQG´SURFHVVLQJµFRQVLVWVRISULQWLQJWKH
GDWD
isc_array_get_slice(
status_vector,
&db_handle,/* set by isc_attach_database()*/
&trans, /* set by isc_start_transaction() */
&array_id, /* array ID put into out_sqlda by isc_dsql_fetch()*/
&desc, /* array descriptor specifying slice to be read */
(void *) hcnt,/* buffer into which data will be read */
(long *) &len/* length of buffer */
);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
/* Make dept_no a null-terminated string */
dept_no[out_sqlda->sqlvar[0].sqllen] = ’\0’;
printf("Department #: %s\n\n", dept_no);
136 INTERBASE 5
ACCESSING ARRAY DATA
4 3UHSDULQJWKHDUUD\GHVFULSWRU
7RSUHSDUHDQDUUD\GHVFULSWRUWKDWVSHFLILHVWKHDUUD\RUDUUD\VOLFHWREHZULWWHQWRIROORZ
WKHVHVWHSV
&UHDWHWKHDUUD\GHVFULSWRU
ISC_ARRAY_DESC desc;
)LOOLQWKHGHVFULSWRUZLWKLQIRUPDWLRQUHJDUGLQJWKHDUUD\FROXPQWRZKLFKGDWD
ZLOOEHZULWWHQ'RWKLVHLWKHUE\FDOOLQJRQHRIWKHIXQFWLRQV
isc_array_lookup_bounds()isc_array_lookup_desc()RU
isc_array_set_desc()RUE\GLUHFWO\ILOOLQJLQWKHGHVFULSWRU)RULQIRUPDWLRQRQ
WKHFRQWHQWVRIDUUD\GHVFULSWRUVDQGWKHXVDJHRIWKHVHIXQFWLRQVVHH´$UUD\
GHVFULSWRUVµRQSDJH
(QVXUHWKHGHVFULSWRUERXQGDULHVDUHVHWWRWKRVHRIWKHVOLFHWREHZULWWHQWR
,I\RXZDQWWRZULWHWRWKHHQWLUHDUUD\ LHQRWMXVWDVPDOOHUVOLFH VHWWKHERXQGDULHVWR
WKHIXOOERXQGDULHVDVLQLWLDOO\GHFODUHGIRUWKHDUUD\FROXPQ7KLV LVJXDUDQWHHGWREHWKH
FDVHLI\RXILOOLQWKHGHVFULSWRUE\FDOOLQJisc_array_lookup_bounds()DVLQ
isc_array_lookup_bounds(
status_vector,
db_handle,
&trans,
"PROJ_DEPT_BUDGET",/* table name */
"QUART_HEAD_CNT", /* array column name */
&desc);
6XSSRVHWKHDUUD\FROXPQ48$57B+($'B&17LVDRQHGLPHQVLRQDODUUD\FRQVLVWLQJ
RIIRXUHOHPHQWVDQGLWZDVGHFODUHGWRKDYHDORZHUVXEVFULSWERXQGRIDQGDQXSSHU
ERXQGRIZKHQLWZDVFUHDWHG7KHQDIWHUDFDOOWR isc_array_lookup_bounds()WKH
DUUD\GHVFULSWRUILHOGVIRUWKHERXQGDULHVFRQWDLQWKHIROORZLQJLQIRUPDWLRQ
desc.array_desc_bounds[0].array_bound_lower == 1
desc.array_desc_bounds[0].array_bound_upper == 4
,I\RXMXVWZDQWWRZULWHWR RUPRGLI\ DVOLFHRIWKHDUUD\WKHQFKDQJHWKHXSSHUDQG
ORZHUERXQGDSSURSULDWHO\)RUH[DPSOHLI\RXMXVWZDQWWRZULWHWRWKHILUVWWZRHOHPHQWV
RIWKHDUUD\WKHQPRGLI\WKHXSSHUERXQGWRWKHYDOXHDVLQ
desc.array_desc_bounds[0].array_bound_upper == 2
4 3UHSDULQJWKHDUUD\EXIIHUZLWKGDWD
&UHDWHDQDUUD\EXIIHUWRKROGWKHGDWDWREHZULWWHQWRWKHDUUD\0DNHLWODUJHHQRXJKWRKROG
DOOWKHHOHPHQWVLQWKHVOLFHWREHZULWWHQ ZKLFKFRXOGEHWKHHQWLUHDUUD\ )RUH[DPSOHWKH
IROORZLQJGHFODUHVDQDUUD\EXIIHUODUJHHQRXJKWRKROGORQJHOHPHQWV
long hcnt[4];
&UHDWHDYDULDEOHVSHFLI\LQJWKHOHQJWKRIWKHDUUD\EXIIHU
short len;
len = sizeof(hcnt);
)LOOWKHDUUD\EXIIHUZLWKWKHGDWDWREHZULWWHQ
138 INTERBASE 5
ACCESSING ARRAY DATA
,I\RXDUHFUHDWLQJDQHZDUUD\WKHQILOOWKHEXIIHUZLWKGDWD)RU
H[DPSOH
hcnt[0] = 4;
hcnt[1] = 5;
hcnt[2] = 6;
hcnt[3] = 6;
7RPRGLI\H[LVWLQJDUUD\GDWDLQVWHDGRIFUHDWLQJDQHZRQHWKHQSHUIRUPDOOWKHVWHSV
OLVWHGLQ´5HDGLQJGDWDIURPDQDUUD\µRQSDJH WRUHDGWKHH[LVWLQJDUUD\GDWDLQWRWKH
DUUD\EXIIHU0RGLI\WKHGDWDLQWKHEXIIHU
4 3UHSDULQJWKH83'$7(RU,16(57VWDWHPHQW
7RSUHSDUHDQ83'$7(RU,16(57VWDWHPHQWIRUH[HFXWLRQIROORZWKHVHVWHSV
(OLFLWDQ83'$7(RU,16(57VWDWHPHQWVWULQJIURPWKHXVHURUFUHDWHRQHIRU
LQVHUWLQJDQHZURZRUXSGDWLQJWKHURZ V FRQWDLQLQJWKHDUUD\FROXPQ V RI
LQWHUHVW)RUH[DPSOHWKHIROORZLQJVWDWHPHQWLVIRUXSGDWLQJWKHDUUD\
FROXPQQDPHG48$57B+($'B&17LQWKHVSHFLILHGURZRIWKHWDEOH
352-B'(37B%8'*(77KHGHSDUWPHQWQXPEHUDQGTXDUWHUO\KHDGFRXQWV
DUHDVVXPHGWREHVXSSOLHGDWUXQWLPH
char *upd_str =
"UPDATE PROJ_DEPT_BUDGET SET QUART_HEAD_CNT = ? WHERE \
YEAR = 1994 AND PROJ_ID = "MKTPR" AND DEPT_NO = ?";
$VDQH[DPSOHRIDQ,16(57VWDWHPHQWWKHIROORZLQJLVIRULQVHUWLQJDQHZURZLQWRWKH
352-B'(37B%8'*(7WDEOHZLWKFROXPQGDWDVXSSOLHGDWUXQWLPH
char *upd_str =
"INSERT INTO PROJ_DEPT_BUDGET (YEAR, PROJ_ID, DEPT_NO, \
QUART_HEAD_CNT) VALUES (?, ?, ?, ?)";
7KHUHPDLQLQJVWHSVUHIHURQO\WR83'$7(VWDWHPHQWVEXWWKHDFWLRQVDSSO\WR,16(57
VWDWHPHQWVDVZHOO
'HFODUHDYDULDEOHWRKROGWKHLQSXW;64/'$QHHGHGWRVXSSO\SDUDPHWHU
YDOXHVWRWKH83'$7(VWDWHPHQWDWUXQWLPH)RUH[DPSOHWKHIROORZLQJ
GHFODUDWLRQFUHDWHVDQ;64/'$FDOOHGin_sqlda
XSQLDA *in_sqlda;
$OORFDWHPHPRU\IRUWKHLQSXW;64/'$XVLQJWKH;64/'$B/(1*7+
PDFUR7KH;64/'$PXVWFRQWDLQRQH;64/9$5VXEVWUXFWXUHIRUHDFK
SDUDPHWHUWREHSDVVHGWRWKH83'$7(VWDWHPHQW7KHIROORZLQJVWDWHPHQW
DOORFDWHVVWRUDJHIRUDQLQSXW;64/'$ in_sqlda ZLWKWZR;64/9$5
VXEVWUXFWXUHV
in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(2));
6HWWKHversionILHOGRIWKH;64/'$WR64/'$B9(56,21DQGVHWWKHsqln
ILHOGWRLQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
in_sqlda->version = SQLDA_VERSION1;
in_sqlda->sqln = 2;
6HWXSWKH;64/9$5VWUXFWXUHLQWKH;64/'$IRUHDFKSDUDPHWHUWREH
SDVVHG6HWWLQJXSDQ;64/9$5VWUXFWXUHLQYROYHVWKHIROORZLQJVWHSV
6SHFLI\WKHLWHP·VGDWDW\SH
)RUSDUDPHWHUVZKRVHW\SHVDUHNQRZQDWFRPSLOHWLPHSRLQWWKHsqldataILHOGRIWKH
;64/9$5WRDQDSSURSULDWHORFDOYDULDEOHWKDWZLOOFRQWDLQWKHGDWDWREHSDVVHG
)RUSDUDPHWHUVZKRVHW\SHVDUHQRWNQRZQXQWLOUXQWLPHDOORFDWHORFDOVWRUDJHIRUWKH
GDWDSRLQWHGWRE\WKHsqldataILHOGRIWKH;64/9$5
6SHFLI\WKHQXPEHURIE\WHVRIGDWD
'DWDVWRUDJHIRUDUUD\ DQG%ORE FROXPQVLVGLIIHUHQWIURPRWKHUW\SHVRIFROXPQVVR
WKH;64/9$5ILHOGVPXVWEHVHWGLIIHUHQWO\)RUQRQDUUD\ DQGQRQ%ORE FROXPQV
LQSXWSDUDPHWHUGDWDFRPHVIURPWKHVSDFHSRLQWHGWRE\ sqldata)RUDUUD\FROXPQVVHW
WKHW\SHWR64/B$55$< RU64/B$55$<LIWKHDUUD\FROXPQLVDOORZHGWREH
18// 7KHDSSOLFDWLRQPXVWVWRUHVSDFHIRUWKHLQWHUQDODUUD\LGHQWLILHUQRWWKHDUUD\
GDWDLQWKHsqldataVSDFH6HHWKHIROORZLQJVHFWLRQVWRFUHDWHRUPRGLI\DQDUUD\VWRUH
LWVDUUD\,'LQWKHsqldataVSDFHDQGWKHQDVVRFLDWHWKHDFWXDODUUD\GDWDZLWKWKHFROXPQ
7KHIROORZLQJFRGHH[DPSOHLOOXVWUDWHVWKHDVVLJQPHQWVIRURQH7(;7FROXPQDQGRQH
DUUD\FROXPQZKHUHWKHFROXPQW\SHVDUHNQRZQDWFRPSLOHWLPH
#define NUMLEN 4
char dept_no[NUMLEN + 1];
ISC_QUAD array_id;
in_sqlda->sqlvar[0].sqldata = &array_id;
in_sqlda->sqlvar[0].sqltype = SQL_ARRAY + 1;
in_sqlda->sqlvar[0].sqllen = sizeof(ISC_QUAD);
in_sqlda->sqlvar[1].sqldata = dept_no;
in_sqlda->sqlvar[1].sqltype = SQL_TEXT;
in_sqlda->sqlvar[1].sqllen = 4;
140 INTERBASE 5
ACCESSING ARRAY DATA
7KHdept_noYDULDEOHVKRXOGEHDVVLJQHGDYDOXHDWUXQWLPH XQOHVVWKHYDOXHLVNQRZQ
DWFRPSLOHWLPH 7KHarray_idYDULDEOHVKRXOGEHVHWWRUHIHUWRWKHQHZO\FUHDWHGDUUD\
DVGHVFULEHGLQWKHIROORZLQJVHFWLRQV
)RUH[DPSOHVRIKDQGOLQJGDWDZKRVHW\SHVDUHQRWNQRZQXQWLOUXQWLPHVHH&KDSWHU
´:RUNLQJZLWK'\QDPLF64/µ
4 &DOOLQJLVFBDUUD\BSXWBVOLFH
7KHIROORZLQJVWHSVDUHUHTXLUHGWRVWRUHWKHGDWDLQWRDQDUUD\RUDUUD\VOLFH
'HFODUHDQDUUD\,'
ISC_QUAD array_id; /* Declare an array ID. */
,QLWLDOL]HWKHDUUD\,',I\RXDUHFUHDWLQJDQHZDUUD\WREHLQVHUWHGLQWRDQHZ
URZRUWRUHSODFHDQH[LVWLQJDUUD\WKHQVLPSO\LQLWLDOL]HWKHDUUD\,'WR18//
array_id = NULL;/* Set handle to NULL before using it */
,I\RXDUHPRGLI\LQJDQH[LVWLQJDUUD\WKHQIROORZWKHVWHSVOLVWHGXQGHU´5HDGLQJ'DWD
IURPDQ$UUD\µWRUHDGWKHH[LVWLQJDUUD\,'LQWRarray_id
&DOO isc_array_put_slice(),Q\RXUFDOO\RXSDVVWKHDUUD\,' HLWKHUWKHDUUD\
,'RIDQH[LVWLQJDUUD\RU18//IRUDQHZDUUD\ LQWKHarray_idYDULDEOH<RX
DOVRSDVVWKHEXIIHURIGDWDWREHZULWWHQDQGDGHVFULSWRUVSHFLI\LQJWKHDUUD\
VOLFHWRZKLFKWKHGDWDEHORQJV
:KHQisc_array_put_slice()LVFDOOHGZLWKDQDUUD\,'RIDQH[LVWLQJDUUD\LWFUHDWHVD
QHZDUUD\ZLWKWKHVDPHFKDUDFWHULVWLFVDVWKHVSHFLILHGDUUD\DQGFRSLHVWKHH[LVWLQJDUUD\
GDWDWRWKHQHZDUUD\7KHQisc_array_put_slice()ZULWHVWKHGDWDIURPWKHDUUD\EXIIHU
WRWKHQHZDUUD\ RUVOLFHRIWKHDUUD\ SHUWKHERXQGVVSHFLILHGLQWKHDUUD\GHVFULSWRU
DQGUHWXUQVLQWKHVDPHarray_idYDULDEOHWKHDUUD\,'RIWKHQHZDUUD\
:KHQisc_array_put_slice()LVFDOOHGZLWKD18//DUUD\,'LWFUHDWHVDQHZHPSW\DUUD\
ZLWKFKDUDFWHULVWLFVDVGHFODUHGIRUWKHDUUD\FROXPQZKRVHQDPHDQGWDEOHQDPHDUH
VSHFLILHGLQWKHDUUD\GHVFULSWRUSDVVHGWRisc_array_put_slice(),WWKHQZULWHVWKHGDWD
IURPWKHDUUD\EXIIHUWRWKHQHZDUUD\ RUVOLFHRIWKHDUUD\ DQGUHWXUQVLQWKHarray_id
YDULDEOHWKHDUUD\,'RIWKHQHZDUUD\
1RWHWKDWLQERWKFDVHVDQHZDUUD\LVFUHDWHGDQGLWVDUUD\,'LVUHWXUQHGLQWKHarray_id
YDULDEOH7KHDUUD\LVWHPSRUDU\XQWLODQ83'$7(RU,16(57VWDWHPHQWLVH[HFXWHGWR
DVVRFLDWHWKHDUUD\ZLWKDSDUWLFXODUFROXPQRIDSDUWLFXODUURZ
<RXFDQPDNHDVLQJOHFDOOWRisc_array_put_slice()WRZULWHDOOWKHGDWDWRWKHDUUD\2U
\RXPD\FDOOisc_array_put_slice()PXOWLSOHWLPHVWRVWRUHGDWDLQWRYDULRXVVOLFHVRIWKH
DUUD\,QWKLVFDVHHDFKFDOOWRisc_array_put_slice()DIWHUWKHILUVWFDOOVKRXOGSDVV WKH
DUUD\,'RIWKHWHPSRUDU\DUUD\:KHQisc_array_put_slice() LVFDOOHGZLWK WKHDUUD\,'
RIDWHPSRUDU\DUUD\LWFRSLHVWKHVSHFLILHGGDWDWRWKHVSHFLILHGVOLFHRIWKHWHPSRUDU\
DUUD\EXWGRHVQRWFUHDWHDQHZDUUD\
7KHIROORZLQJLVDVDPSOHFDOOWR isc_array_put_slice()
isc_array_put_slice(
status_vector,
&db_handle,
&trans,
&array_id, /* array ID (NULL, or existing array’s array ID) */
&desc, /* array descriptor describing where to write data */
hcnt, /* array buffer containing data to write to array */
&len /* length of array buffer */
);
7KLVFDOOFUHDWHVDQHZDUUD\FRSLHVWKHGDWDLQhcntWRWKHQHZDUUD\ RUVOLFHRIWKHDUUD\
DVVLJQVWKHDUUD\DQDUUD\,'DQGVHWVarray_idWRSRLQWWRWKHDUUD\,'
4 $VVRFLDWLQJWKHQHZDUUD\ZLWKWKHDUUD\FROXPQ
([HFXWHWKH83'$7(VWDWHPHQWWRDVVRFLDWHWKHQHZDUUD\ZLWKWKHDUUD\FROXPQLQWKHURZ
VHOHFWHGE\WKHVWDWHPHQW
isc_dsql_execute_immediate(
status_vector,
&db_handle,
&trans,
0, /* indicates string to execute is null-terminated */
upd_str, /* UPDATE statement string to be executed */
1, /* XSQLDA version number */
in_sqlda /* XSQLDA supplying parameters to UPDATE statement */
);
7KLVVHWVWKHDUUD\FROXPQLQWKHURZVSHFLILHGLQWKH83'$7(VWDWHPHQWWRFRQWDLQWKH
DUUD\,'RIWKHQHZDUUD\7KHDUUD\,'FRPHVIURPWKHarray_idYDULDEOHSRLQWHGWRE\WKH
LQBVTOGDSDUDPHWHUFRUUHVSRQGLQJWRWKHDUUD\FROXPQ
142 INTERBASE 5
ACCESSING ARRAY DATA
,IWKHDUUD\FROXPQLQWKHVSHFLILHGURZFRQWDLQVWKHDUUD\,'RIDGLIIHUHQWDUUD\EHIRUHWKH
83'$7(VWDWHPHQWLVH[HFXWHGWKHQWKHFROXPQLVPRGLILHGWRFRQWDLQWKHQHZDUUD\,'
DQGWKHDUUD\UHIHUHQFHGE\WKHSUHYLRXVO\VWRUHGDUUD\,'ZLOOEHGHOHWHGGXULQJWKHQH[W
JDUEDJHFROOHFWLRQ
Deleting an array
7KHUHDUHWKUHHZD\VWRGHOHWHDQDUUD\
'HOHWHWKHURZFRQWDLQLQJWKHDUUD\<RXFDQXVH'64/WRH[HFXWHD'(/(7(
VWDWHPHQW
5HSODFHWKHDUUD\ZLWKDGLIIHUHQWRQHDVGHVFULEHGDERYH,IDQDUUD\FROXPQ
FRQWDLQVDQDUUD\,'DQG\RXPRGLI\WKHFROXPQWRUHIHUWRDGLIIHUHQWDUUD\WKH
DUUD\UHIHUHQFHGE\WKHSUHYLRXVO\VWRUHGDUUD\,'ZLOOEHGHOHWHGGXULQJWKHQH[W
JDUEDJHFROOHFWLRQ
5HVHWWR18//WKHFROXPQUHIHUULQJWRWKHDUUD\)RUH[DPSOHXVH'64/WR
H[HFXWHDVWDWHPHQWOLNHWKHIROORZLQJZKHUH/$1*8$*(B5(4LVDQDUUD\
FROXPQ
"UPDATE JOB SET LANGUAGE_REQ = NULL \
WHERE JOB_CODE = "SA12" AND JOB_GRADE = 10"
7KHDUUD\UHIHUHQFHGE\WKHSUHYLRXVO\VWRUHGDUUD\,'ZLOOEHGHOHWHGGXULQJWKHQH[W
JDUEDJHFROOHFWLRQ
145
CHAPTER 9 WORKING WITH CONVERSIONS
7KH,6&B48$'VWUXFWXUHLVGHFODUHGLQLEDVHKEXWWKHSURJUDPPHUPXVWGHFODUHDFWXDO
KRVWODQJXDJHYDULDEOHVRIW\SH,6&B48$'
5HWULHYHDGDWHIURPDWDEOHLQWRWKH,6&B48$'YDULDEOH
&RQYHUWWKH,6&B48$'YDULDEOHLQWRDQXPHULF&IRUPDWZLWKWKH,QWHU%DVH
IXQFWLRQisc_decode_date()7KLVIXQFWLRQLVDOVRGHFODUHGLQLEDVHK
isc_decode_date()UHTXLUHVWZRSDUDPHWHUVWKHDGGUHVVRIWKH,6&B48$'
KRVWODQJXDJHYDULDEOHDQGWKHDGGUHVVRIWKHWPKRVWODQJXDJHYDULDEOH)RU
H[DPSOHWKHIROORZLQJFRGHIUDJPHQWFRYHUWVKLUHBGDWHWRKLUHBWLPH
isc_decode_date(&hire_date, &hire_time);
146 INTERBASE 5
REVERSING BYTE ORDER OF NUMBERS WITH ISC_VAX_INTEGER( )
. . .
struct tm hire_time;
. . .
7RFUHDWHKRVWODQJXDJHWLPHVWUXFWXUHVLQODQJXDJHVRWKHUWKDQ&DQG&VHHWKH
KRVWODQJXDJHUHIHUHQFHPDQXDO
&UHDWHDKRVWYDULDEOHRIW\SH,6&B48$'IRUXVHE\,QWHU%DVH)RUH[DPSOH
WKHKRVWYDULDEOHGHFODUDWLRQPLJKWORRNOLNHWKLV
ISC_QUAD mydate;
7KH,6&B48$'VWUXFWXUHLVGHFODUHGLQLEDVHKEXWWKHSURJUDPPHUPXVWGHFODUHDFWXDO
KRVWODQJXDJHYDULDEOHVRIW\SH,6&B48$'
3XWGDWHDQGWLPHLQIRUPDWLRQLQWRKLUHBWLPH
8VHWKH,QWHU%DVHisc_encode_date()IXQFWLRQWRFRQYHUWWKHLQIRUPDWLRQLQ
KLUHBWLPHLQWR,QWHU%DVHLQWHUQDOIRUPDWDQGVWRUHWKDWIRUPDWWHGLQIRUPDWLRQLQ
WKH,6&B48$'KRVWYDULDEOH KLUHBGDWHLQWKHH[DPSOH 7KLVIXQFWLRQLVDOVR
GHFODUHGLQLEDVHK
isc_encode_date()UHTXLUHVWZRSDUDPHWHUVWKHDGGUHVVRIWKH&WLPHVWUXFWXUHDQGWKH
DGGUHVVRIWKH,6&B48$'KRVWODQJXDJHYDULDEOH)RUH[DPSOHWKHIROORZLQJFRGH
FRQYHUWVKLUHBWLPHWRKLUHBGDWH
isc_encode_date(&hire_time, &hire_date);
,QVHUWWKHGDWHLQWRDWDEOH
148 INTERBASE 5
CHAPTER
Function Purpose
isc_interprete() Capture InterBase error messages to a buffer
isc_print_sqlerror() Display an SQL error message
isc_print_status() Display InterBase error messages
isc_sqlcode() Set the value of SQLCODE
isc_sql_interprete() Capture an SQL error message to a buffer
TABLE 10.1 Error-handling functions
149
CHAPTER 10 HANDLING ERROR CONDITIONS
,6&B67$786LVDGHILQHLQLEDVHKSURYLGHGIRUSURJUDPLQJFRQYHQLHQFHDQGSODWIRUP
LQGHSHQGHQFH
150 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
7RFKHFNWKHVWDWXVYHFWRUIRUHUURUFRQGLWLRQVDIWHUWKHH[HFXWLRQRIDIXQFWLRQH[DPLQHWKH
ILUVWHOHPHQWRIWKHVWDWXVYHFWRUWRVHHLILWLVVHWWRDQGLIVRH[DPLQHWKHVHFRQGHOHPHQW
WRVHHLILWLVQRW$QRQ]HURYDOXHLQWKHVHFRQGHOHPHQWLQGLFDWHVDQHUURUFRQGLWLRQ7KH
IROORZLQJ&FRGHIUDJPHQWLOOXVWUDWHVKRZWRFKHFNWKHVWDWXVYHFWRUIRUDQHUURUFRQGLWLRQ
#include <ibase.h>
. . .
ISC_STATUS status_vector[20];
. . .
/* Assume an API call returning status information is called here. */
if (status_vector[0] == 1 && status_vector[1] > 0)
{
/* Handle error condition here. */
;
}
,IDQHUURUFRQGLWLRQLVGHWHFWHG\RXFDQXVH$3,IXQFWLRQVLQDQHUURUKDQGOLQJURXWLQHWR
GLVSOD\HUURUPHVVDJHVFDSWXUHWKHHUURUPHVVDJHVLQDEXIIHURUSDUVHWKHVWDWXVYHFWRUIRU
SDUWLFXODUHUURUFRGHV
'LVSOD\RUFDSWXUHRIHUURUPHVVDJHVLVRQO\RQHSDUWRIDQHUURUKDQGOLQJURXWLQH8VXDOO\
WKHVHURXWLQHVDOVRUROOEDFNWUDQVDFWLRQVDQGVRPHWLPHVWKH\FDQUHWU\IDLOHGRSHUDWLRQV
isc_tr_handle trans;
. . .
trans = 0L;
. . .
/* Assume a transaction, trans, is started here. */
/* Assume an API call returning status information is called here. */
if (status_vector[0] == 1 && status_vector[1] > 0)
{
isc_print_status(status_vector);
isc_rollback_transaction(status_vector, &trans);
}
,03257$17 2QZLQGRZLQJV\VWHPVWKDWGRQRWSHUPLWGLUHFWVFUHHQZULWHVZLWKprintf()XVH
isc_interprete()WRFDSWXUHHUURUPHVVDJHVWRDEXIIHU
152 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
,03257$17 1HYHUSDVVWKHVWDWXVYHFWRUDUUD\GLUHFWO\WRisc_interprete()(DFKWLPHLWLVFDOOHG
isc_interprete()DGYDQFHVWKHSRLQWHUWRWKHVWDWXVYHFWRUWRWKHQH[WHOHPHQWFRQWDLQLQJ
QHZPHVVDJHLQIRUPDWLRQ%HIRUHFDOOLQJisc_interprete()EHVXUHWRVHWWKHSRLQWHUWRWKH
VWDUWLQJDGGUHVVRIWKHVWDWXVYHFWRU
7KHIROORZLQJFRGHGHPRQVWUDWHVDQHUURUKDQGOLQJURXWLQHWKDWPDNHVUHSHDWHGFDOOVWR
isc_interprete()WRUHWULHYHHUURUPHVVDJHVIURPWKHVWDWXVYHFWRULQDEXIIHURQHDWDWLPH
VRWKH\FDQEHZULWWHQWRDORJILOH
#include <ibase.h>
. . .
ISC_STATUS status_vector[20];
isc_tr_handle trans;
long *pvector;
char msg[512];
FILE *efile; /* Code fragment assumes pointer to an open file. */
trans = 0L;
. . .
/* Error-handling routine starts here. */
/* Always set pvector to point to start of status_vector. */
pvector = status_vector;
/* Retrieve first message. */
isc_interprete(msg, &pvector);
/* Write first message from buffer to log file. */
fprintf(efile, "%s\n", msg);
msg[0] = ’-’; /* Append leading hyphen to secondary messages. */
/* Look for more messages and handle in a loop. */
while(isc_interprete(msg + 1, &pvector)) /* More? */
fprintf(efile, "%s\n", msg); /* If so, write it to the log. */
fclose(efile); /* All done, so close the log file. */
isc_rollback(status_vector, &trans);
return(1);
. . .
Note 7KLVFRGHIUDJPHQWDVVXPHVWKDWWKHORJILOHLVSURSHUO\GHFODUHGDQGRSHQHGHOVHZKHUH
LQWKHDSSOLFDWLRQEHIRUHFRQWUROLVSDVVHGWRWKLVHUURUKDQGOHU
,IVXFFHVVIXOisc_sqlcode()UHWXUQVWKHILUVWYDOLG64/HUURUFRGHGHFRGHGIURPWKHVWDWXV
YHFWRU,IQRYDOLG64/HUURUFRGHLVIRXQGisc_sqlcode()UHWXUQV
154 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
. . .
trans = 0L;
. . .
/* Assume a transaction, trans, is started here. */
/* Assume an API call returning status information is called here. */
if (status_vector[0] == 1 && status_vector[1] > 0)
{
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
isc_rollback_transaction(status_vector, &trans);
}
,03257$17 2QZLQGRZLQJV\VWHPVWKDWGRQRWSHUPLWGLUHFWVFUHHQZULWHVZLWKprintf()XVH
isc_sql_interprete()WRFDSWXUHHUURUPHVVDJHVWRDEXIIHU
4 +RZWKHVWDWXVYHFWRULVSDUVHG
7KH,QWHU%DVHHUURUKDQGOLQJURXWLQHVisc_print_status()DQGisc_interprete()XVH
URXWLQHVZKLFKDXWRPDWLFDOO\SDUVHHUURUPHVVDJHLQIRUPDWLRQLQWKHVWDWXVYHFWRUZLWKRXW
UHTXLULQJ\RXWRNQRZDERXWLWVVWUXFWXUH,I\RXSODQWRZULWH\RXURZQURXWLQHVWRUHDGDQG
UHDFWWRWKHFRQWHQWVRIWKHVWDWXVYHFWRU\RXQHHGWRNQRZKRZWRLQWHUSUHWLW
7KHNH\WRSDUVLQJWKHVWDWXVYHFWRULVWRGHFLSKHUWKHPHDQLQJRIWKHILUVWORQJLQHDFKFOXVWHU
EHJLQQLQJZLWKWKHILUVWFOXVWHULQWKHYHFWRU
4 0HDQLQJRIWKHILUVWORQJLQDFOXVWHU
7KHILUVWORQJLQDQ\FOXVWHULVDQXPHULFGHVFULSWRU%\H[DPLQLQJWKHQXPHULFGHVFULSWRUIRUDQ\
FOXVWHU\RXFDQDOZD\VGHWHUPLQHWKH
g 7RWDOQXPEHURIORQJVLQWKHFOXVWHU
g .LQGRILQIRUPDWLRQUHSRUWHGLQWKHUHPDLQGHURIWKHFOXVWHU
156 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
g 6WDUWLQJORFDWLRQRIWKHQH[WFOXVWHULQWKHVWDWXVYHFWRU
%\LQFOXGLQJLEDVHKDWWKHVWDUWRI\RXUVRXUFHFRGH\RXFDQXVHDVHULHVRIGHILQHVWR
VXEVWLWXWHIRUKDUGFRGHGQXPHULFGHVFULSWRUVLQWKHVWDWXVYHFWRUSDUVLQJURXWLQHV\RXZULWH
7KHDGYDQWDJHVRIXVLQJWKHVHGHILQHVRYHUKDUGFRGLQJWKHGHVFULSWRUVDUH
g <RXUFRGHZLOOEHHDVLHUWRUHDG
g &RGHPDLQWHQDQFHZLOOEHHDVLHUVKRXOGWKHQXPEHULQJVFKHPHIRUQXPHULFGHVFULSWRUV
FKDQJHLQDIXWXUHUHOHDVHRI,QWHU%DVH
7KHIROORZLQJWDEOHOLVWVWKHGHILQHHTXLYDOHQWVRIHDFKQXPHULFGHVFULSWRU
)RUDQH[DPSOHRIFRGHWKDWXVHVWKHVHGHILQHVVHH´6WDWXVYHFWRUSDUVLQJH[DPSOHµRQ
SDJH
4 0HDQLQJRIWKHVHFRQGORQJLQDFOXVWHU
7KHVHFRQGORQJLQDFOXVWHULVDOZD\VRQHRIILYHLWHPV
g $Q,QWHU%DVHHUURUFRGH VWORQJ
g $VWULQJDGGUHVV VWORQJ RU
g $VWULQJOHQJWK VWORQJ
g $QXPHULFYDOXH VWORQJ
g $QRSHUDWLQJV\VWHPHUURUFRGH VWORQJ!
158 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
:KHQWKHVHFRQGORQJRIDFOXVWHULVDQ,QWHU%DVHHUURUFRGHWKHQVXEVHTXHQWFOXVWHUVPD\
FRQWDLQDGGLWLRQDOSDUDPHWHUVIRUWKHHUURUPHVVDJHVWULQJDVVRFLDWHGZLWKWKHHUURUFRGH)RU
H[DPSOHDJHQHULF,QWHU%DVHHUURUPHVVDJHPD\FRQWDLQDUHSODFHDEOHVWULQJSDUDPHWHUIRU
WKHQDPHRIWKHWDEOHZKHUHDQHUURURFFXUVRULWPD\FRQWDLQDUHSODFHDEOHQXPHULF
SDUDPHWHUIRUWKHFRGHRIWKHWULJJHUZKLFKWUDSSHGWKHHUURUFRQGLWLRQ
,I\RXZULWH\RXURZQSDUVLQJURXWLQHV\RXPD\QHHGWRH[DPLQHDQGXVHWKHVHDGGLWLRQDO
FOXVWHUVRIHUURULQIRUPDWLRQ
STRING ADDRESSES
6WULQJDGGUHVVHVSRLQWWRHUURUPHVVDJHWH[W:KHQWKHILUVWORQJLQWKHFOXVWHULV
LVFBDUJBVWULQJ WKHDGGUHVVSRLQWHGWRRIWHQFRQWDLQVWKHQDPHRIWKHGDWDEDVHWDEOHRU
FROXPQDIIHFWHGE\WKHHUURU,QWKHVHFDVHV,QWHU%DVHIXQFWLRQVZKLFKEXLOGHUURUPHVVDJH
VWULQJVUHSODFHDSDUDPHWHULQDJHQHULF,QWHU%DVHHUURUPHVVDJHZLWKWKHVWULQJSRLQWHGWRE\
WKLVDGGUHVV2WKHUWLPHVWKHDGGUHVVSRLQWVWRDQHUURUPHVVDJHKDUGFRGHGLQDGDWDEDVH
WULJJHU
:KHQWKHILUVWORQJLQWKHFOXVWHULV LVFBDUJBLQWHUSUHWHG WKHDGGUHVVSRLQWVWRDWH[WPHVVDJH
ZKLFKUHTXLUHVQRIXUWKHUSURFHVVLQJEHIRUHUHWULHYDO6RPHWLPHVWKLVPHVVDJHPD\EH
KDUGFRGHGLQ,QWHU%DVHLWVHOIDQGRWKHUWLPHVLWPD\EHDV\VWHPOHYHOHUURUPHVVDJH
,QHLWKHURIWKHVHFDVHV,QWHU%DVHIXQFWLRQVVXFKDVisc_print_status()DQG isc_interprete()
FDQIRUPDWDQGGLVSOD\WKHUHVXOWLQJHUURUPHVVDJHIRU\RX
NUMERIC VALUES
$QXPHULFYDOXHKDVGLIIHUHQWPHDQLQJGHSHQGLQJXSRQWKHYDOXHRIWKHQXPHULFGHVFULSWRU
LQWKHILUVWORQJRIDFOXVWHU,IWKHILUVWORQJLV LVFBDUJBQXPEHU DQXPHULFYDOXHLVXVHGE\
,QWHU%DVHIXQFWLRQVWRUHSODFHQXPHULFSDUDPHWHUVLQJHQHULF,QWHU%DVHHUURUPHVVDJHV
GXULQJPHVVDJHEXLOGLQJ)RULQVWDQFHZKHQDQLQWHJULW\HUURURFFXUV,QWHU%DVHVWRUHVWKH
FRGHRIWKHWULJJHUZKLFKGHWHFWVWKHSUREOHPDVDQXPHULFYDOXHLQWKHVWDWXVYHFWRU:KHQ
DQ,QWHU%DVHIXQFWLRQOLNHisc_interprete()EXLOGVWKHHUURUPHVVDJHVWULQJIRUWKLVHUURULW
LQVHUWVWKHQXPHULFYDOXHIURPWKHVWDWXVYHFWRU LQWRWKHJHQHULF,QWHU%DVHLQWHJULW\HUURU
PHVVDJHVWULQJWRPDNHLWPRUHVSHFLILF
4 0HDQLQJRIWKHWKLUGORQJLQDFOXVWHU
,IWKHILUVWORQJLQDFOXVWHULV LVFBDUJBFVWULQJ WKHFOXVWHU·VWRWDOOHQJWKLVWKUHHORQJV7KH
WKLUGORQJDOZD\VFRQWDLQVWKHDGGUHVVRIDPHVVDJHVWULQJUHTXLULQJWUDQVODWLRQLQWRDVWDQGDUG
QXOOWHUPLQDWHG&VWULQJEHIRUHGLVSOD\6XFKDVWULQJLVRIWHQDILOHRUSDWKQDPH,QWHU%DVH
IXQFWLRQVOLNHisc_interprete()DXWRPDWLFDOO\KDQGOHWKLVWUDQVODWLRQIRU\RX
4 6WDWXVYHFWRUSDUVLQJH[DPSOH
7KHIROORZLQJ&H[DPSOHLOOXVWUDWHVDVLPSOHEUXWHIRUFHSDUVLQJRIWKHVWDWXVYHFWRU7KH
FRGHIRUFHVDQHUURUFRQGLWLRQ7KHHUURUKDQGOLQJEORFNSDUVHVWKHVWDWXVYHFWRUDUUD\FOXVWHU
E\FOXVWHUSULQWLQJWKHFRQWHQWVRIHDFKFOXVWHUDQGLQWHUSUHWLQJLWIRU\RX
#include <ibase.h>
. . .
ISC_STATUS status_vector[20];
main()
{
int done, v; /* end of args?, index into vector */
int c, extra; /* cluster count, 3 long cluster flag */
static char *meaning[] = {"End of error information",
"n InterBase error code"," string address"," string length",
" numeric value"," system code"};
/* Assume database is connected and transaction started here. */
if (status_vector[0] == 1 && status_vector[1] > 0)
error_exit();
. . .
}
void error_exit(void)
{
done = v = 0;
c = 1;
while (!done)
{
extra = 0;
printf("Cluster %d:\n", c);
printf("Status vector %d: %ld: ", v, status_vector[v]);
if (status_vector[v] != gds_arg_end)
160 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
return(1);
}
+HUHLVDVDPSOHRIWKHRXWSXWIURPWKLVSURJUDP
Cluster 1:
Status vector 0: 1: Next long is an InterBase error code
Status vector 1: 335544342
Cluster 2:
Status vector 2: 4: Next long is a numeric value
Status vector 3: 1
Cluster 3:
Status vector 4: 1: Next long is an InterBase error code
Status vector 5: 335544382
Cluster 4:
Status vector 6: 2: Next long is a string address
Status vector 7: 156740
Cluster 5:
Status vector 8: 0: End of error information
7KLVRXWSXWLQGLFDWHVWKDWWZR,QWHU%DVHHUURUVRFFXUUHG7KHILUVWHUURUFRGHLV
7KHHUURUSULQWLQJURXWLQHVisc_print_status()DQGisc_interprete(),XVHWKH,QWHU%DVH
HUURUFRGHWRUHWULHYHDFRUUHVSRQGLQJEDVHHUURUPHVVDJH7KHEDVHHUURUPHVVDJHFRQWDLQV
SODFHKROGHUVIRUUHSODFHDEOHSDUDPHWHUV)RUHUURUFRGHWKHEDVHHUURUPHVVDJH
VWULQJLV
"action cancelled by trigger (%ld) to preserve data integrity"
7KLVHUURUPHVVDJHXVHVDUHSODFHDEOHQXPHULFSDUDPHWHUOG
,QWKLVFDVHWKHQXPHULFYDOXHWRXVHIRUUHSODFHPHQWLVVWRUHGLQWKHVHFRQGORQJRIWKH
VHFRQGFOXVWHU:KHQWKHHUURUSULQWLQJURXWLQHLQVHUWVWKHSDUDPHWHULQWRWKHPHVVDJHLW
GLVSOD\VWKHPHVVDJH
action cancelled by trigger (1) to preserve data integrity
7KHVHFRQGHUURUFRGHLV7KHEDVHPHVVDJHUHWULHYHGIRUWKLVHUURUFRGHLV
"%s"
,QWKLVFDVHWKHHQWLUHPHVVDJHWREHGLVSOD\HGFRQVLVWVRIDUHSODFHDEOHVWULQJ7KHVHFRQG
ORQJRIWKHIRXUWKFOXVWHUFRQWDLQVWKHDGGUHVVRIWKHUHSODFHPHQWVWULQJ7KLVLVDQ
HUURUPHVVDJHGHILQHGLQWKHWULJJHUWKDWFDXVHGWKHHUURU:KHQWKHHUURUSULQWLQJURXWLQH
LQVHUWVWKHPHVVDJHIURPWKHWULJJHULQWRWKHEDVHPHVVDJHLWGLVSOD\VWKHUHVXOWLQJPHVVDJH
-Department name is missing.
162 INTERBASE 5
USING INFORMATION IN THE STATUS VECTOR
Note 7KLVVDPSOHSURJUDPLVRQO\PHDQWWRLOOXVWUDWHWKHVWUXFWXUHRIWKHVWDWXVYHFWRUDQG
LWVFRQWHQWV:KLOHWKHHUURUKDQGOLQJURXWLQHLQWKLVSURJUDPPLJKWVHUYHDVDOLPLWHG
GHEXJJLQJWRROIRUDSURJUDPXQGHUGHYHORSPHQWLWGRHVQRWSURYLGHXVHIXOLQIRUPDWLRQIRU
HQGXVHUV2UGLQDULO\HUURUKDQGOLQJEORFNVLQDSSOLFDWLRQVVKRXOGLQWHUSUHWHUURUVGLVSOD\
H[SODQDWRU\HUURUPHVVDJHVDQGWDNHFRUUHFWLYHDFWLRQLIDSSURSULDWH
)RUH[DPSOHLIWKHHUURUKDQGOLQJURXWLQHLQWKHVDPSOHSURJUDPKDGFDOOHG
isc_print_status()WRGLVSOD\WKHHUURUPHVVDJHVDVVRFLDWHGZLWKWKHVHFRGHVWKHIROORZLQJ
PHVVDJHVZRXOGKDYHEHHQGLVSOD\HG
action cancelled by trigger (1) to preserve data integrity
-Department name is missing.
Function Purpose
isc_event_block() Allocate event parameter buffers
isc_wait_for_event() Wait for a synchronous event to be posted
isc_que_events() Set up an asynchronous event and return to application processing
isc_event_counts() Determine the change in values of event counters in the event parameter
buffer
isc_cancel_events() Cancel interest in an event
TABLE 11.1 API event functions
)RUDV\QFKURQRXVHYHQWVWKLVFKDSWHUDOVRGHVFULEHVKRZWRFUHDWHDQDV\QFKURQRXVWUDS
$67 DIXQFWLRQWKDWUHVSRQGVWRSRVWHGHYHQWV
165
CHAPTER 11 WORKING WITH EVENTS
166 INTERBASE 5
UNDERSTANDING THE EVENT MECHANISM
7KLVFRGHDVVXPHVWKDWWKHUHDUHWULJJHUVRUVWRUHGSURFHGXUHVGHILQHGIRUWKHGDWDEDVHWKDW
SRVWHYHQWVQDPHG´%25/µ´,17(/µDQG´681µ
7,3 $SSOLFDWLRQVWKDWQHHGWRUHVSRQGWRPRUHWKDQHYHQWVFDQPDNHPXOWLSOHFDOOVWR
isc_event_block()VSHFLI\LQJGLIIHUHQW(3%VDQGHYHQWOLVWVIRUHDFKFDOO
)RUWKHFRPSOHWHV\QWD[RIisc_event_block()VHH´LVFBHYHQWBEORFN µRQSDJH
168 INTERBASE 5
WAITING ON EVENTS WITH ISC_WAIT_FOR_EVENT( )
,03257$17 isc_wait_for_event()FDQQRWEHXVHGLQ0LFURVRIW:LQGRZVDSSOLFDWLRQVRUXQGHUDQ\
RWKHURSHUDWLQJV\VWHPWKDWGRHVQRWSHUPLWSURFHVVHVWRSDXVH$SSOLFDWLRQVRQWKHVH
SODWIRUPVPXVWXVHDV\QFKURQRXVHYHQWKDQGOLQJ
7KHV\QWD[IRUisc_wait_for_event()LV
ISC_STATUS isc_wait_for_event(
ISC_STATUS *status_vector,
isc_db_handle *db_handle,
short length,
char *event_buffer,
char *result_buffer);
)RUH[DPSOHWKHIROORZLQJFRGHVHWVXS(3%VIRUWKUHHHYHQWVWKHQFDOOV
isc_wait_for_event()WRVXVSHQGLWVH[HFXWLRQXQWLORQHRIWKHHYHQWVRFFXUV
#include <ibase.h>;
. . .
char *event_buffer, *result_buffer;
long blength;
ISC_STATUS status_vector[20];
isc_db_handle db1;
. . .
/* Assume database db1 is attached here and a transaction started. */
blength = isc_event_block(&event_buffer, &result_buffer, 3, "BORL",
"INTEL", "SUN");
isc_wait_for_event(status_vector, &db1, (short)blength,
event_buffer, result_buffer);
/* Application processing is suspended here until an event occurs. */
. . .
2QFHisc_wait_for_event()LVFDOOHGDSSOLFDWLRQSURFHVVLQJVWRSVXQWLORQHRIWKHUHTXHVWHG
HYHQWVLVSRVWHG:KHQWKHHYHQWRFFXUVDSSOLFDWLRQSURFHVVLQJUHVXPHVDWWKHQH[W
H[HFXWDEOHVWDWHPHQWIROORZLQJWKHFDOOWRisc_wait_for_event(),IDQDSSOLFDWLRQLVZDLWLQJ
RQPRUHWKDQRQHHYHQWLWPXVWXVHisc_event_counts()WRGHWHUPLQHZKLFKHYHQWZDV
SRVWHG
Note $VLQJOHFDOOWRisc_wait_for_event()FDQZDLWRQDPD[LPXPRIHYHQWV
$SSOLFDWLRQVWKDWQHHGWRZDLWRQPRUHWKDQHYHQWVPXVWZDLWRQRQHVHWRIWKHQPDNH
DQRWKHUFDOOWRisc_wait_for_event()WRZDLWRQDGGLWLRQDOHYHQWV
HYHQWBLGLVDORQJSRLQWHUWKDWLVXVHGDVDKDQGOHLQVXEVHTXHQWFDOOVWRisc_cancel_events()
WRWHUPLQDWHHYHQWQRWLILFDWLRQ,WQHHGQRWEHLQLWLDOL]HGZKHQSDVVHG7KHOHQJWKSDUDPHWHU
LVWKHVL]HRIHYHQWBEXIIHUZKLFKFRQWDLQVWKHFXUUHQWFRXQWRIHYHQWVWREHZDLWHGXSRQ
HYHQWBIXQFWLRQLVDSRLQWHUWRWKH$67IXQFWLRQWKDW,QWHU%DVHVKRXOGFDOOZKHQDQHYHQWRI
LQWHUHVWLVSRVWHG,WLVXSWRWKH$67IXQFWLRQWRQRWLI\WKHDSSOLFDWLRQWKDWLWKDVEHHQFDOOHG
SHUKDSVE\VHWWLQJDJOREDOIODJRIVRPHNLQGHYHQWBIXQFWLRQBDUJLVDSRLQWHUWRWKHILUVW
SDUDPHWHUWRSDVVWRWKH$67
)RUDFRPSOHWHH[DPSOHRIDFDOOWRisc_que_events()DQGDFDOOWRDQ$67VHH´$FRPSOHWH
LVFBTXHBHYHQWV H[DPSOHµRQSDJH
Creating an AST
7KHHYHQWIXQFWLRQHYHQWBIXQFWLRQVKRXOGEHZULWWHQWRWDNHWKUHHDUJXPHQWV
170 INTERBASE 5
CONTINUOUS PROCESSING WITH ISC_QUE_EVENTS( )
7KHHYHQWBIXQFWLRQBDUJVSHFLILHGLQWKHFDOOWRisc_que_events()7KLVLVXVXDOO\D
SRLQWHUWRWKHHYHQWSDUDPHWHUEXIIHUWKDWVKRXOGEHILOOHGLQZLWKXSGDWHGHYHQW
FRXQWV
7KHOHQJWKRIWKHIROORZLQJHYHQWVBOLVWEXIIHU
$SRLQWHUWRWKHHYHQWVBOLVWEXIIHUDWHPSRUDU\HYHQWSDUDPHWHUEXIIHUMXVWOLNH
WKDWSDVVHGWRisc_que_events()H[FHSWIRUKDYLQJXSGDWHGHYHQWFRXQWV
$UHVXOWEXIIHULVQRWDXWRPDWLFDOO\XSGDWHGE\WKHHYHQWRFFXUUHQFHLWLVXSWRWKH
HYHQWBIXQFWLRQWRFRS\WKHWHPSRUDU\HYHQWVBOLVWEXIIHUWRWKHPRUHSHUPDQHQWEXIIHUWKDWWKH
DSSOLFDWLRQXWLOL]HV
HYHQWBIXQFWLRQDOVRQHHGVWROHWWKHDSSOLFDWLRQNQRZWKDWLWKDVEHHQFDOOHGIRUH[DPSOHE\
VHWWLQJDJOREDOIODJ
$VDPSOHHYHQWBIXQFWLRQDSSHDUVLQWKHIROORZLQJH[DPSOH
isc_callback event_function
(char *result, short length, char *updated)
{
/* Set the global event flag. */
event_flag++
/* Copy the temporary updated buffer to the result buffer. */
while (length--)
*result++ = *updated++;
return(0);
};
ISC_LONG event_id;
int i, counter;
int event_flag = 0;
length = (short)isc_event_block(
&event_buffer,
&result_buffer,
number_of_stocks,
"DEC", "HP", "SUN");
isc_que_events(
status_vector,
&database_handle, /* Set in previous isc_attach_database(). */
&event_id,
length, /* Returned from isc_event_block(). */
event_buffer,
(isc_callback)event_function,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
};
counter = 0;
while (counter < MAX_LOOP)
{
counter++;
if (!event_flag)
{
/* Do whatever other processing you want. */
;
}
else
{ event_flag = 0;
isc_event_counts(
status_vector,
length,
event_buffer,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
};
for (i=0; i<number_of_stocks; i++)
if (status_vector[i])
172 INTERBASE 5
DETERMINING WHICH EVENTS OCCURRED WITH ISC_EVENT_COUNTS( )
{
/* The event has been posted. Do whatever is appropriate,
e.g., initiating a buy or sell order.
Note: event_names[i] tells the name of the event
corresponding to status_vector[i]. */
;
}
isc_que_events(
status_vector,
&database_handle,
&event_id,
length,
event_buffer,
(isc_callback)event_function,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
}
} /* End of else. */
} /* End of while. */
/* Let InterBase know you no longer want to wait asynchronously. */
isc_cancel_events(
status_vector,
&database_handle,
&event_id);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
}
7KHGLIIHUHQFHRIHDFKHOHPHQWLVUHWXUQHGLQWKHHUURUVWDWXVDUUD\WKDWLVSDVVHGWR
isc_event_counts()7RGHWHUPLQHZKLFKHYHQWVRFFXUUHGDQDSSOLFDWLRQPXVWH[DPLQH
HDFKHOHPHQWRIWKHDUUD\IRUQRQ]HURYDOXHV$QRQ]HURFRXQWLQGLFDWHVWKHQXPEHURIWLPHV
DQHYHQWLVSRVWHGEHWZHHQWKHWLPHisc_event_block()LVFDOOHGDQGWKHILUVWWLPHDQHYHQW
LVSRVWHGDIWHUisc_wait_for_event()RUisc_que_events()DUHFDOOHG:KHUHPXOWLSOH
DSSOLFDWLRQVDUHDFFHVVLQJWKHVDPHGDWDEDVHWKHUHIRUHDSDUWLFXODUHYHQWFRXQWPD\EHRU
PRUHDQGPRUHWKDQRQHHYHQWFRXQWHOHPHQWPD\EHQRQ]HUR
Note :KHQILUVWVHWWLQJXSDQ$67WRWUDSHYHQWVZLWKisc_que_events(),QWHU%DVH
LQLWLDOL]HVDOOFRXQWYDOXHVLQWKHVWDWXVYHFWRUWRUDWKHUWKDQ7RFOHDUWKHYDOXHVFDOO
isc_event_counts()WRUHVHWWKHYDOXHV
,QDGGLWLRQWRGHWHUPLQLQJZKLFKHYHQWRFFXUUHGisc_event_counts()UHLQLWLDOL]HVWKH
HYHQWBEXIIHUDUUD\LQDQWLFLSDWLRQRIDQRWKHUFDOOWRisc_wait_for_event()RU
isc_que_events()9DOXHVLQHYHQWBEXIIHUDUHVHWWRWKHVDPHYDOXHVDVFRUUHVSRQGLQJYDOXHVLQ
UHVXOWBEXIIHU
7KHFRPSOHWHV\QWD[IRUisc_event_counts()LV
void isc_event_counts(
ISC_STATUS status_vector,
short buffer_length,
char *event_buffer,
char *result_buffer);
)RUH[DPSOHWKHIROORZLQJFRGHGHFODUHVLQWHUHVWLQWKUHHHYHQWVZDLWVRQWKHPWKHQXVHV
isc_event_counts()WRGHWHUPLQHZKLFKHYHQWVRFFXUUHG
#include <ibase.h>;
. . .
char *event_buffer, *result_buffer;
long blength;
ISC_STATUS status_vector[20];
isc_db_handle db1;
long count_array[3];
int i;
. . .
/* Assume database db1 is attached here and a transaction started. */
blength = isc_event_block(&event_buffer, &result_buffer, 3, "BORL",
"INTEL", "SUN");
isc_wait_for_event(status_vector, &db1, (short)blength,
event_buffer, result_buffer);
/* Application processing is suspended here until an event occurs. */
isc_event_counts(status_vector, (short)blength, event_buffer,
result_buffer);
for (i = 0; i < 3; i++)
{
174 INTERBASE 5
CANCELING INTEREST IN ASYNCHRONOUS EVENTS WITH ISC_CANCEL_EVENTS( )
if (status_vector[i])
{
/* Process the event here. */
;
}
}
API PartII
Reference
Guide
3DUW,,$3,5HIHUHQFH*XLGH
CHAPTER
Function categories
7KHUHDUHWHQFODVVHVRI,QWHU%DVH$3,IXQFWLRQFDOOV
g $UUD\IXQFWLRQVIRUKDQGOLQJDUUD\VRIGDWD
g %OREIXQFWLRQVIRUKDQGOLQJWKH,QWHU%DVH%OREGDWDW\SH
g 'DWDEDVHIXQFWLRQVIRUKDQGOLQJGDWDEDVHUHTXHVWV
g &RQYHUVLRQIXQFWLRQVIRUWUDQVODWLQJGDWHVEHWZHHQ,QWHU%DVHIRUPDWDQG8QL[WPIRUPDW
DQGIRUUHYHUVLQJWKHE\WHRUGHURILQWHJHUV
g '64/IXQFWLRQVIRUKDQGOLQJ64/VWDWHPHQWVHQWHUHGE\XVHUVDWUXQWLPH
g (UURUKDQGOLQJIXQFWLRQV
g (YHQWIXQFWLRQVIRUUHJLVWHULQJLQWHUHVWLQHYHQWVSRVWHGE\WULJJHUVDQGVWRUHGSURFHGXUHVLQ
DSSOLFDWLRQVDQGIRUSURFHVVLQJWKHHYHQWTXHXH
179
CHAPTER 12 API FUNCTION REFERENCE
g ,QIRUPDWLRQIXQFWLRQVIRUUHWULHYLQJLQIRUPDWLRQDERXWGDWDEDVHVWUDQVDFWLRQV%OREGDWD
DQGHYHQWV
g 6HFXULW\IXQFWLRQVIRUDGGLQJGHOHWLQJDQGPRGLI\LQJXVHUUHFRUGVLQWKHSDVVZRUGGDWDEDVH
g 7UDQVDFWLRQIXQFWLRQVIRUKDQGOLQJWUDQVDFWLRQVLQDQDSSOLFDWLRQ
6RPHIXQFWLRQVVXFKDVLQIRUPDWLRQFDOOVRFFXULQPRUHWKDQRQHFODVV
Array functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJDUUD\GDWD
LQDQDSSOLFDWLRQ
Blob functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJ%OREGDWD
LQDQDSSOLFDWLRQ
180 INTERBASE 5
FUNCTION CATEGORIES
Database functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJGDWDEDVH
UHTXHVWVLQDQDSSOLFDWLRQ
Conversion functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUWUDQVODWLQJ
EHWZHHQ,QWHU%DVH'$7(IRUPDWDQGWKH8QL[WPGDWHIRUPDWDQGIRUUHYHUVLQJWKH
E\WHRUGHURIDQLQWHJHU
DSQL functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJ'64/
VWDWHPHQWVEXLOWRUHQWHUHGE\XVHUVDWUXQWLPH
182 INTERBASE 5
FUNCTION CATEGORIES
Error-handling functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJGDWDEDVH
HUURUFRQGLWLRQVDQDSSOLFDWLRQ
Event functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUKDQGOLQJHYHQWVLQ
DQDSSOLFDWLRQ
Information functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUUHSRUWLQJ
LQIRUPDWLRQDERXWGDWDEDVHVWUDQVDFWLRQVDQG%OREGDWDWRDFOLHQWDSSOLFDWLRQWKDWUHTXHVWV
LW
184 INTERBASE 5
FUNCTION CATEGORIES
Security functions
7KHIROORZLQJWDEOHVXPPDUL]HVWKH,QWHU%DVH$3,IXQFWLRQVDYDLODEOHIRUDGGLQJGHOHWLQJ
DQGPRGLI\LQJXVHUUHFRUGVLQWKHSDVVZRUGGDWDEDVH
Element Description
Title Function name
Definition Main purpose of function
Syntax Diagram of the function and parameters
Parameters Table describing each parameter
Description Detailed information about using the function
Example Example of using the function in a program
Return value Description of possible values returned in the status vector, if any
See also Cross references to other related functions
TABLE 12.11 Function description format
186 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_add_user( )
$GGVDXVHUUHFRUGWRWKHSDVVZRUGGDWDEDVHLVFJGE
'HVFULSWLRQ 7KHWKUHHVHFXULW\IXQFWLRQVisc_add_user()isc_delete_user()DQGisc_modify_user()
PLUURUIXQFWLRQDOLW\WKDWLVDYDLODEOHLQWKHgsecFRPPDQGOLQHXWLOLW\isc_add_user()DGGV
DUHFRUGWRLVFJGE,QWHU%DVH·VSDVVZRUGGDWDEDVH
$WDPLQLPXP\RXPXVWSURYLGHWKHXVHUQDPHDQGSDVVZRUG,IWKHVHUYHULVQRWORFDO\RX
PXVWDOVRSURYLGHDVHUYHUQDPHDQGSURWRFRO9DOLGFKRLFHVIRUWKHSURWRFROILHOGDUH
VHFBSURWRFROBWFSLSVHFBSURWRFROBQHWEHXLVHFBSURWRFROBVS[DQGVHFBSURWRFROBORFDO
,QWHU%DVHUHDGVWKHVHWWLQJVIRUWKH,6&B86(5DQG,6&B3$66:25'HQYLURQPHQWYDULDEOHVLI
\RXGRQRWSURYLGHD'%$XVHUQDPHDQGSDVVZRUG
7KHGHILQLWLRQIRUWKH86(5B6(&B'$7$VWUXFWLQLEDVHKLVDVIROORZV
typedef struct {
short sec_flags; /* which fields are specified */
int uid; /* the user’s id */
int gid; /* the user’s group id */
int protocol; /* protocol to use for connection */
char *server; /* server to administer */
char *user_name; /* the user’s name */
char *password; /* the user’s password */
char *group_name; /* the group name */
char *first_name; /* the user’s first name */
char *middle_name; /* the user’s middle name */
char *last_name; /* the user’s last name */
char *dba_user_name; /* the dba user name */
char *dba_password; /* the dba password */
} USER_SEC_DATA;
:KHQ\RXSDVVWKLVVWUXFWWRRQHRIWKHWKUHHVHFXULW\IXQFWLRQV\RXFDQWHOOLWZKLFKILHOGV
\RXKDYHVSHFLILHGE\GRLQJDELWZLVH25RIWKHIROORZLQJYDOXHVZKLFKDUHGHILQHGLQLEDVHK
sec_uid_spec 0x01
sec_gid_spec 0x02
sec_server_spec 0x04
sec_password_spec 0x08
sec_group_name_spec 0x10
sec_first_name_spec 0x20
sec_middle_name_spec 0x40
sec_last_name_spec 0x80
sec_dba_user_name_spec 0x100
sec_dba_password_spec 0x200
1RELWYDOXHVDUHDYDLODEOHIRUXVHUQDPHDQGSDVVZRUGVLQFHWKH\DUHUHTXLUHG
7KHIROORZLQJHUURUPHVVDJHVH[LVWIRUWKLVIXQFWLRQ
188 INTERBASE 5
USING FUNCTION DEFINITIONS
sec.server = "kennel";
sec.dba_user_name = "sysdba";
sec.dba_password = "masterkey";
sec.protocol = sec_protocol_tcpip;
sec.first_name = "Socks";
sec.last_name = "Clinton";
sec.user_name = "socks";
sec.password = "2meow!"; /* Note: do not hardcode passwords */
sec.sec_flags = sec_server_spec
| sec_password_spec
| sec_dba_user_name_spec
| sec_dba_password_spec
| sec_first_name_spec
| sec_last_name_spec;
isc_add_user(status, &sec);
/* check status for errors */
if (status[0] == 1 && status[1])
{
switch (status[1]) {
case isc_usrname_too_long:
printf("Security database cannot accept long user names\n");
break;
...
}
}
}
5HWXUQ9DOXH isc_add_user()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV$
QRQ]HURYDOXHLQGLFDWHVDQHUURU6HHWKH´'HVFULSWLRQµVHFWLRQIRUWKLVIXQFWLRQIRUDOLVWRI
HUURUFRGHV)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU
´+DQGOLQJ(UURU&RQGLWLRQVµ
6HH$OVR isc_delete_user()isc_modify_user()
isc_array_get_slice()
5HWULHYHVGDWDIURPDQDUUD\FROXPQLQDURZUHWXUQHGE\D6(/(&7
isc_array_get_slice()UHWULHYHVGDWDIURPDQDUUD\FROXPQRIDWDEOHURZXVLQJDQDUUD\,'
<RXFDQHLWKHUUHWULHYHDOOWKHDUUD\HOHPHQWVLQWKDWFROXPQRUDVXEVHWRIFRQWLJXRXVDUUD\
HOHPHQWVFDOOHGDVOLFH7KHXSSHUDQGORZHUERXQGDULHVLQWKHGHVFVWUXFWXUHVSHFLI\ZKLFK
HOHPHQWVDUHWREHUHWULHYHG
190 INTERBASE 5
USING FUNCTION DEFINITIONS
,QWHU%DVHFRSLHVWKHHOHPHQWVLQWRWKHEXIIHUGHVWBDUUD\ZKRVHVL]HLVVSHFLILHGE\VOLFHBOHQJWK
7KLVVKRXOGEHDWOHDVWWKHH[SHFWHGOHQJWKUHTXLUHGIRUWKHHOHPHQWVUHWULHYHG%HIRUH
UHWXUQLQJIURPisc_array_get_slice(),QWHU%DVHVHWVVOLFHBOHQJWKWRWKHDFWXDOQXPEHURI
E\WHVFRSLHG
%HIRUHFDOOLQJisc_array_get_slice()WKHUHDUHPDQ\RSHUDWLRQV\RXPXVWGRLQRUGHUWRILOO
LQWKHDUUD\GHVFULSWRUGHVFGHWHUPLQHWKHDSSURSULDWHLQWHUQDODUUD\LGHQWLILHUDUUD\BLGDQG
IHWFKWKHURZVZKRVHDUUD\FROXPQV\RXZDQWWRDFFHVV)RUFRPSOHWHVWHSE\VWHS
LQVWUXFWLRQVIRUVHWWLQJXSDQDUUD\GHVFULSWRUDQGUHWULHYLQJDUUD\LQIRUPDWLRQVHH&KDSWHU
´:RUNLQJZLWK$UUD\'DWDµ
Note 1HYHUH[HFXWHD'64/VWDWHPHQWWKDWWULHVWRDFFHVVDUUD\FROXPQGDWDGLUHFWO\XQOHVV
\RXDUHIHWFKLQJRQO\DVLQJOHHOHPHQW7KHZD\WRDFFHVVVOLFHVRIDUUD\FROXPQGDWDLVWRFDOO
isc_array_get_slice()RUisc_array_put_slice()7KHRQO\VXSSRUWHGDUUD\UHIHUHQFHVLQ
'64/VWDWHPHQWVDUHRQHVWKDWVSHFLI\DQHQWLUHDUUD\FROXPQ WKDWLVMXVWWKHFROXPQQDPH
LQRUGHUWRJHWWKHLQWHUQDOLGHQWLILHUIRUWKHDUUD\ZKLFKLVUHTXLUHGE\isc_array_get_slice()
DQGisc_array_put_slice()RUVLQJOHHOHPHQWUHIHUHQFHV
([DPSOH 7KHIROORZLQJSURJUDPRSHUDWHVRQDWDEOHQDPHG352-B'(37B%8'*(7
7KLVWDEOHFRQWDLQVWKHTXDUWHUO\KHDGFRXQWVDOORFDWHGIRUHDFKSURMHFWLQHDFKGHSDUWPHQW
RIDQRUJDQL]DWLRQ(DFKURZRIWKHWDEOHDSSOLHVWRDSDUWLFXODUGHSDUWPHQWDQGSURMHFW
7KHTXDUWHUO\KHDGFRXQWVDUHFRQWDLQHGLQDQDUUD\FROXPQQDPHG
48$57(5/<B+($'B&17(DFKURZKDVIRXUHOHPHQWVLQWKLVFROXPQRQHSHUTXDUWHU
(DFKHOHPHQWRIWKHDUUD\LVDQXPEHURIW\SHORQJ
7KHH[DPSOHEHORZVHOHFWVWKHURZVFRQWDLQLQJLQIRUPDWLRQIRUWKHSURMHFWQDPHG
9%$6()RUHDFKVXFKURZLWUHWULHYHVDQGSULQWVWKHGHSDUWPHQWQXPEHUDQGWKHGDWDLQWKH
DUUD\FROXPQ WKDWLVWKHTXDUWHUO\KHDGFRXQWV
,QDGGLWLRQWRLOOXVWUDWLQJWKHXVDJHRIisc_array_lookup_bounds()DQG
isc_array_get_slice()WKHSURJUDPVKRZVGDWDVWUXFWXUHLQLWLDOL]DWLRQVDQGFDOOVWRWKH
'64/IXQFWLRQVUHTXLUHGWRSUHSDUHDQGH[HFXWHWKH6(/(&7VWDWHPHQWWRREWDLQWKH
DUUD\BLGQHHGHGE\isc_array_get_slice()DQGWRIHWFKWKHVHOHFWHGURZVRQHE\RQH
#include <ibase.h>
#define Return_if_Error(stat) if (stat[0] == 1 && stat[1]) \
{ \
isc_print_status(stat); \
return(1); \
}
char *sel_str =
"SELECT dept_no, quarterly_head_cnt FROM proj_dept_budget \
WHERE year = 1994 AND proj_id = ’VBASE’";
char dept_no[6];
long hcnt[4], tr_handle, database_handle, SQLCODE;
192 INTERBASE 5
USING FUNCTION DEFINITIONS
NULL);
Return_if_Error(status_vector);
/* Set up the array descriptor. */
isc_array_lookup_bounds(
status_vector,
&database_handle, /* Set by previous isc_attach_database() call. */
&tr_handle, /* Set by previous isc_start_transaction() call. */
"PROJ_DEPT_BUDGET", /* Table name. */
"QUARTERLY_HEAD_CNT", /* Array column name. */
&desc);
Return_if_Error(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
5HWXUQ9DOXH isc_array_get_slice()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBWUDQVBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_array_lookup_bounds()isc_array_lookup_desc()isc_array_put_slice()
isc_array_set_desc(), isc_dsql_fetch()isc_dsql_prepare()
194 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_array_lookup_bounds()
'HWHUPLQHVWKHGDWDW\SHOHQJWKVFDOHGLPHQVLRQVDQGDUUD\ERXQGDULHVIRUWKHVSHFLILHG
DUUD\FROXPQLQWKHVSHFLILHGWDEOH
'HVFULSWLRQ isc_array_lookup_bounds()GHWHUPLQHVWKHGDWDW\SHOHQJWKVFDOHGLPHQVLRQVDQGDUUD\
ERXQGDULHVIRUWKHHOHPHQWVLQDQDUUD\FROXPQFROXPQBQDPHLQWKHWDEOHWDEOHBQDPH,W
VWRUHVWKLVLQIRUPDWLRQLQWKHDUUD\GHVFULSWRUGHVF
isc_array_lookup_bounds()DOVRVHWVWRDIODJLQWKHGHVFULSWRU7KLVVSHFLILHVWKDWWKH
DUUD\VKRXOGEHDFFHVVHGLQIXWXUHIXQFWLRQFDOOVLQURZPDMRURUGHUWKHGHIDXOW,IDQ
DSSOLFDWLRQUHTXLUHVFROXPQPDMRUDFFHVVUHVHWWKLVIODJWR
7KHDUUD\GHVFULSWRULVXVHGLQVXEVHTXHQWFDOOVWRisc_array_get_slice()RU
isc_array_put_slice()
)RUDGHWDLOHGGHVFULSWLRQRIWKHDUUD\GHVFULSWRUVHH&KDSWHU´:RUNLQJZLWK$UUD\'DWDµ
Note 7KHUHDUHZD\VWRILOOLQDQDUUD\GHVFULSWRURWKHUWKDQE\FDOOLQJ
isc_array_lookup_bounds()<RXFDQDOVR
g &DOOisc_array_lookup_desc()7KLVLVH[DFWO\WKHVDPHDV calling
isc_array_lookup_bounds()H[FHSWWKDWWKHIRUPHUGRHVQRWILOOLQLQIRUPDWLRQDERXWWKH
XSSHUDQGORZHUERXQGVRIHDFKGLPHQVLRQ
g &DOOisc_array_set_desc()WRLQLWLDOL]HWKHGHVFULSWRUIURPSDUDPHWHUV\RXFDOOLWZLWKUDWKHU
WKDQDFFHVVLQJWKHGDWDEDVHPHWDGDWD
g 6HWWKHGHVFULSWRUILHOGVGLUHFWO\1RWHWKDWDUUD\BGHVFBGW\SHPXVWEHH[SUHVVHGDVRQHRIWKH
GDWDW\SHVLQWKHIROORZLQJWDEOHDQGWKHSDUDPHWHUVDUUD\BGHVFBILHOGBQDPHDQG
DUUD\BGHVFBUHODWLRQBQDPHPXVWEHQXOOWHUPLQDWHG
blr_text2 CHAR
blr_short SMALLINT
blr_long INTEGER
blr_float FLOAT
blr_date DATE
blr_varying VARCHAR
blr_varying2 VARCHAR
196 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJLOOXVWUDWHVDVDPSOHFDOOWRisc_array_lookup_bounds()0RUHFRPSOHWH
H[DPSOHVRIDFFHVVLQJDUUD\VDUHIRXQGLQWKHH[DPSOHSURJUDPVIRUisc_array_get_slice()
DQGisc_array_put_slice()
#include <ibase.h>
ISC_STATUS status_vector[20];
ISC_ARRAY_DESC desc;
char *str1 = "PROJ_DEPT_BUDGET";
char *str2 = "QUARTERLY_HEAD_CNT";
isc_array_lookup_bounds(
status_vector,
&database_handle, /* Set in previous isc_attach_database() call. */
&tr_handle, /* Set in previous isc_start_transaction() call. */
str1,
str2,
&desc);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_array_lookup_bounds()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBWUDQVBKDQGOHLVFBIOGBQRWBGHIRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_array_get_slice()isc_array_lookup_desc()isc_array_put_slice()
isc_array_set_desc()
isc_array_lookup_desc()
'HWHUPLQHVWKHGDWDW\SHOHQJWKVFDOHDQGGLPHQVLRQVIRUDOOHOHPHQWVLQWKHVSHFLILHGDUUD\
FROXPQLQWKHVSHFLILHGWDEOH
'HVFULSWLRQ isc_array_lookup_desc()GHWHUPLQHVWKHGDWDW\SHOHQJWKVFDOHDQGGLPHQVLRQVIRUWKH
DUUD\FROXPQFROXPQBQDPHLQWKHWDEOHWDEOHBQDPH,WVWRUHVWKLVLQIRUPDWLRQLQWKHDUUD\
GHVFULSWRUGHVF
,WDOVRVHWVWRDIODJLQWKHGHVFULSWRU7KLVVSHFLILHVWKDWWKHDUUD\LVDFFHVVHGLQIXWXUH
IXQFWLRQFDOOVLQURZPDMRURUGHUWKHGHIDXOW,IDQDSSOLFDWLRQUHTXLUHVFROXPQPDMRUDFFHVV
UHVHWWKLVIODJWR
198 INTERBASE 5
USING FUNCTION DEFINITIONS
7KHDUUD\GHVFULSWRULVXVHGLQVXEVHTXHQWFDOOVWRisc_array_get_slice()RU
isc_array_put_slice()
)RUDGHWDLOHGGHVFULSWLRQRIWKHDUUD\GHVFULSWRUVHH&KDSWHU´:RUNLQJZLWK$UUD\'DWDµ
Note 7KHUHDUHZD\VWRILOOLQDQDUUD\GHVFULSWRURWKHUWKDQE\FDOOLQJ
isc_array_lookup_desc()<RXFDQDOVR
g &DOOisc_array_lookup_bounds()7KLVLVOLNHisc_array_lookup_desc()H[FHSWWKDW
isc_array_lookup_bounds()DOVRILOOVLQLQIRUPDWLRQDERXWWKHXSSHUDQGORZHUERXQGVRI
HDFKGLPHQVLRQ
g &DOOisc_array_set_desc()WRLQLWLDOL]HWKHGHVFULSWRUIURPSDUDPHWHUV\RXFDOOLWZLWKUDWKHU
WKDQDFFHVVLQJWKHGDWDEDVHPHWDGDWD
g 6HWWKHGHVFULSWRUILHOGVGLUHFWO\1RWHWKDWDUUD\BGHVFBGW\SHPXVWEHH[SUHVVHGDVRQHRIWKH
GDWDW\SHVLQWKHIROORZLQJWDEOHDQGWKHSDUDPHWHUVDUUD\BGHVFBILHOGBQDPHDQG
DUUD\BGHVFBUHODWLRQBQDPHPXVWEHQXOOWHUPLQDWHG
blr_text2 CHAR
blr_short SMALLINT
blr_long INTEGER
blr_float FLOAT
blr_date DATE
blr_varying VARCHAR
blr_varying2 VARCHAR
([DPSOH 7KHIROORZLQJLOOXVWUDWHVDVDPSOHFDOOWRisc_array_lookup_desc()0RUHFRPSOHWH
H[DPSOHVRIDFFHVVLQJDUUD\VDUHIRXQGLQWKHH[DPSOHSURJUDPVIRUisc_array_get_slice()
DQGisc_array_put_slice()
#include <ibase.h>
ISC_STATUS status_vector[20];
ISC_ARRAY_DESC desc;
char str1 = "PROJ_DEPT_BUDGET";
char str2 = "QUARTERLY_HEAD_CNT";
isc_array_lookup_desc(
status_vector,
&database_handle, /* Set in previous isc_attach_database() call. */
&tr_handle, /* Set in previous isc_start_transaction() call. */
str1,
str2,
&desc);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
};
5HWXUQ9DOXH isc_array_lookup_desc()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBWUDQVBKDQGOHLVFBIOGBQRWBGHIRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_array_get_slice()isc_array_lookup_bounds()isc_array_put_slice()
isc_array_set_desc()
200 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_array_put_slice()
:ULWHVGDWDLQWRDQDUUD\FROXPQ
'HVFULSWLRQ isc_array_put_slice()ZULWHVGDWDLQWRDQDUUD\FROXPQ<RXFDQHLWKHUVWRUHLQWRDOOWKH
DUUD\HOHPHQWVLQWKDWFROXPQRULQWRDQDUUD\VOLFHDVXEVHWRIFRQWLJXRXVDUUD\HOHPHQWV
7KHERXQGDULHVSDVVHGWRWKHIXQFWLRQLQWKHDUUD\GHVFULSWRUGHVFVSHFLI\ZKLFKHOHPHQWV
DUHWREHVWRUHGLQWR
,QWHU%DVHFRSLHVWKHHOHPHQWVIURPWKHEXIIHUVRXUFHBDUUD\ZKRVHVL]HLVVSHFLILHGE\
VOLFHBOHQJWK
7KHDUUD\LGHQWLILHU DUUD\,' DUUD\BLGVKRXOGEHSDVVHGDV18//LI\RXDUHFDOOLQJ
isc_array_put_slice()WRFUHDWHDQHZDUUD\,I\RXDUHFDOOLQJLWWRPRGLI\DQH[LVWLQJDUUD\
WKHQDUUD\BLGVKRXOGEHWKHLGHQWLILHURIWKHDUUD\WREHPRGLILHG7KLVPXVWKDYHEHHQ
GHWHUPLQHGE\SUHYLRXVFDOOVWR'64/IXQFWLRQV
:KHQisc_array_put_slice()LVFDOOHGZLWKDQDUUD\,'RIDQH[LVWLQJDUUD\LW
&UHDWHVDQHZDUUD\ZLWKWKHVDPHGLPHQVLRQVERXQGVHWFDVWKHVSHFLILHG
DUUD\DQGFRSLHVWKHH[LVWLQJDUUD\GDWDWRWKHQHZDUUD\
:ULWHVWKHGDWDIURPWKHDUUD\EXIIHUVRXUFHBDUUD\WRWKHQHZDUUD\ RUVOLFHRI
WKHDUUD\ SHUWKHERXQGVVSHFLILHGLQWKHDUUD\GHVFULSWRUGHVF
5HWXUQVLQWKHVDPHDUUD\BLGYDULDEOHWKHDUUD\,'RIWKHQHZDUUD\
:KHQisc_array_put_slice()LVFDOOHGZLWKD18//DUUD\,'LW
&UHDWHVDQHZHPSW\DUUD\ZLWKGLPHQVLRQVERXQGVHWFDVGHFODUHGIRUWKH
DUUD\FROXPQZKRVHQDPHDQGWDEOHQDPHDUHVSHFLILHGLQWKHDUUD\GHVFULSWRU
GHVF
:ULWHVWKHGDWDIURPWKHDUUD\EXIIHUVRXUFHBDUUD\WRWKHQHZDUUD\ RUVOLFHRI
WKHDUUD\
5HWXUQVLQWKHDUUD\BLGYDULDEOHWKHDUUD\,'RIWKHQHZDUUD\
1RWHWKDWLQERWKFDVHVDQHZDUUD\LVFUHDWHGDQGLWVDUUD\,'LVUHWXUQHGLQWKHDUUD\BLG
YDULDEOH7KHDUUD\LVWHPSRUDU\XQWLODQ83'$7(RU,16(57VWDWHPHQWLVH[HFXWHGWR
DVVRFLDWHWKHDUUD\ZLWKDSDUWLFXODUFROXPQRIDSDUWLFXODUURZ
<RXFDQPDNHDVLQJOHFDOOWRisc_array_put_slice()WRZULWHDOOWKHGDWD\RXZLVKWRWKHDUUD\
2U\RXPD\FDOOisc_array_put_slice()PXOWLSOHWLPHV
WRVWRUHGDWDLQWRYDULRXVVOLFHVRIWKHDUUD\,QWKLVFDVHHDFKFDOOWRisc_array_put_slice()
DIWHUWKHILUVWFDOOVKRXOGSDVV WKHDUUD\,'RIWKHWHPSRUDU\DUUD\:KHQ
isc_array_put_slice() LVFDOOHGZLWK WKHDUUD\,'RIDWHPSRUDU\DUUD\LWFRSLHVWKHVSHFLILHG
GDWDWRWKHVSHFLILHGVOLFHRIWKHWHPSRUDU\DUUD\ LWZLOOQRWFUHDWHDQHZDUUD\ DQGLWGRHVQ·W
PRGLI\DUUD\BLG
%HIRUHFDOOLQJisc_array_put_slice()WKHUHDUHPDQ\RSHUDWLRQV\RXPXVWGRLQRUGHUWRILOO
LQWKHDUUD\GHVFULSWRUGHVFGHWHUPLQHWKHDSSURSULDWHLQWHUQDODUUD\LGHQWLILHUDUUD\BLGDQG
IHWFKWKHURZVZKRVHDUUD\FROXPQV\RXZDQWWRDFFHVV
202 INTERBASE 5
USING FUNCTION DEFINITIONS
)RUFRPSOHWHVWHSE\VWHSLQVWUXFWLRQVIRUVHWWLQJXSDQDUUD\GHVFULSWRUDQGZULWLQJDUUD\
LQIRUPDWLRQVHH&KDSWHU´:RUNLQJZLWK$UUD\'DWDµ
Note 1HYHUH[HFXWHD'64/VWDWHPHQWWKDWWULHVWRGLUHFWO\VWRUHGDWDLQWRDQDUUD\FROXPQ
7KHRQO\ZD\WRDFFHVVDUUD\FROXPQGDWDLVE\FDOOLQJisc_array_get_slice()RU
isc_array_put_slice()7KHRQO\VXSSRUWHGDUUD\UHIHUHQFHVLQ'64/VWDWHPHQWVDUHRQHV
WKDWVSHFLI\DQHQWLUHDUUD\FROXPQ WKDWLVMXVWWKHFROXPQQDPH LQRUGHUWRJHWWKHLQWHUQDO
LGHQWLILHUIRUWKHDUUD\ZKLFKLVUHTXLUHGE\isc_array_get_slice()DQG
isc_array_put_slice()
([DPSOH 7KHIROORZLQJSURJUDPRSHUDWHVRQDWDEOHQDPHG352-B'(37B%8'*(77KLVWDEOH
FRQWDLQVWKHTXDUWHUO\KHDGFRXQWVDOORFDWHGIRUHDFKSURMHFWLQHDFKGHSDUWPHQWRIDQ
RUJDQL]DWLRQ(DFKURZRIWKHWDEOHDSSOLHVWRDSDUWLFXODUGHSDUWPHQWDQGSURMHFW7KH
TXDUWHUO\KHDGFRXQWVDUHFRQWDLQHGLQDQDUUD\FROXPQQDPHG48$57(5/<B+($'B&17
(DFKWDEOHURZKDVIRXUHOHPHQWVLQWKLVFROXPQRQHSHUTXDUWHU(DFKHOHPHQWLVDQXPEHU
RIW\SHORQJ
7KLVSURJUDPVHOHFWVWKHURZVFRQWDLQLQJLQIRUPDWLRQIRUWKHSURMHFWQDPHG9%$6(
)RUHDFKVXFKURZLWFDOOVisc_array_get_slice()WRUHWULHYHDVOLFHRIWKHDUUD\WKHTXDUWHUO\
KHDGFRXQWVIRUWKHODVWWZRTXDUWHUV,WWKHQLQFUHPHQWVHDFKDQGFDOOV
isc_array_put_slice()WRVWRUHWKHXSGDWHGYDOXHV
,QDGGLWLRQWRLOOXVWUDWLQJWKHXVDJHRIisc_array_lookup_desc()isc_array_get_slice(),
DQGisc_array_put_slice()WKHSURJUDPVKRZVGDWDVWUXFWXUHLQLWLDOL]DWLRQVDQGFDOOVWRWKH
'64/IXQFWLRQVUHTXLUHGWRSUHSDUHDQGH[HFXWHWKH6(/(&7DQG83'$7(VWDWHPHQWVWR
REWDLQWKHDUUD\BLGQHHGHGE\isc_array_get_slice()DQGisc_array_put_slice()WRIHWFKWKH
VHOHFWHGURZVRQHE\RQHDQGWRXSGDWHWKHDUUD\,'
#include <ibase.h>
char *sel_str =
"SELECT dept_no, quarterly_head_cnt FROM proj_dept_budget \
WHERE year = 1994 AND proj_id = ’VBASE’";
char *upd_str =
"UPDATE proj_dept_budget SET quarterly_head_count = ? \
WHERE CURRENT OF S";
char dept_no[6];
long fetch_stat, SQLCODE, hcnt[2];
204 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_execute(
status_vector,
&tr_handle,
&stmt,
1,
NULL);
Return_if_Error(status_vector);
/* Declare a cursor. */
isc_dsql_set_cursor_name(
status_vector, &stmt, cursor, 0);
Return_if_Error(status_vector);
/* Set the descriptor bounds to those of the slice to be updated, that is,
to those of the last two elements. Assuming the array column was defined
to contain 4 elements, with a lower bound (subscript) of 1 and an upper
bound of 4, the last two elements are at subscripts 3 and 4. */
desc->array_desc_bounds[0].array_bound_lower = 3;
desc->array_desc_bounds[0].array_bound_upper = 4;
206 INTERBASE 5
USING FUNCTION DEFINITIONS
&database_handle,
&tr_handle,
&array_id,
&desc,
hcnt,
&len);
Return_if_Error(status_vector);
};
};
if (fetch_stat != 100L)
{
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
5HWXUQ9DOXH isc_array_put_slice()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBWUDQVBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_array_get_slice()isc_array_lookup_bounds()isc_array_lookup_desc()
isc_array_set_desc()
isc_dsql_allocate_statement()isc_dsql_describe_bind()isc_dsql_execute()
isc_dsql_fetch()isc_dsql_prepare()isc_dsql_set_cursor_name()
isc_array_set_desc()
,QLWLDOL]HVDQDUUD\GHVFULSWRU
'HVFULSWLRQ isc_array_set_desc()LQLWLDOL]HVWKHDUUD\GHVFULSWRUGHVFIURPWKHIXQFWLRQSDUDPHWHUV
WDEOHBQDPHFROXPQBQDPHVTOBGW\SHVTOBOHQJWKDQGGLPHQVLRQV
isc_array_set_desc() DOVRVHWVWRDIODJLQWKHGHVFULSWRU7KLVVSHFLILHVWKDWWKHDUUD\LV
DFFHVVHGLQIXWXUHIXQFWLRQFDOOVLQURZPDMRURUGHUWKHGHIDXOW,IDQDSSOLFDWLRQUHTXLUHV
FROXPQPDMRUDFFHVVUHVHWWKLVIODJWR
WDEOHBQDPHDQGFROXPQBQDPHFDQEHHLWKHUQXOOWHUPLQDWHGRUEODQNWHUPLQDWHG7KHQDPHV
VWRUHGLQWKHGHVFULSWRUZLOOEHQXOOWHUPLQDWHG
VTOBGW\SHPXVWEHJLYHQDVDQ64/PDFURFRQVWDQW
7KHDUUD\GHVFULSWRULVXVHGLQVXEVHTXHQWFDOOVWRisc_array_get_slice()RU
isc_array_put_slice()
)RUDGHWDLOHGGHVFULSWLRQRIWKHDUUD\GHVFULSWRUVHH&KDSWHU´:RUNLQJZLWK$UUD\'DWDµ
208 INTERBASE 5
USING FUNCTION DEFINITIONS
blr_text2 CHAR
blr_short SMALLINT
blr_long INTEGER
blr_float FLOAT
blr_date DATE
blr_varying VARCHAR
blr_varying2 VARCHAR
([DPSOH 7KHIROORZLQJLOOXVWUDWHVDVDPSOHFDOOWRisc_array_set_desc()0RUHFRPSOHWHH[DPSOHVRI
DFFHVVLQJDUUD\VDUHIRXQGLQWKHH[DPSOHSURJUDPVIRUisc_array_get_slice()DQG
isc_array_put_slice()
#include <ibase.h>
ISC_STATUS status_vector[20];
ISC_ARRAY_DESC desc;
short dtype = SQL_TEXT;
short len = 8;
short dims = 1;
isc_array_set_desc(
status_vector,
"TABLE1",
"CHAR_ARRAY",
&dtype,
&len,
&dims,
&desc);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_array_set_desc()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_array_get_slice()isc_array_lookup_bounds()isc_array_lookup_desc()
isc_array_put_slice()
210 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_attach_database()
$WWDFKHVWRDQH[LVWLQJGDWDEDVH
'HVFULSWLRQ 7KHisc_attach_database()IXQFWLRQFRQQHFWVWRDQH[LVWLQJGDWDEDVHWRHQDEOHVXEVHTXHQW
SURJUDPDFFHVV,WDOVRRSWLRQDOO\VSHFLILHVYDULRXVRSHUDWLRQDOFKDUDFWHULVWLFVVXFKDVDXVHU
QDPHDQGSDVVZRUGFRPELQDWLRQIRUDFFHVVWRDGDWDEDVHRQDUHPRWHVHUYHURUWKHQXPEHU
RIGDWDEDVHFDFKHEXIIHUVWRXVH7KHVHRSWLRQDOFKDUDFWHULVWLFVDUHSDVVHGLQDGDWDEDVH
SDUDPHWHUEXIIHU '3% VXSSOLHGDQGSRSXODWHGE\WKHFDOOLQJSURJUDPHLWKHUWKURXJK
GLUHFWSURJUDPFRQVWUXFWLRQDQGE\FDOOLQJisc_expand_dpb()WREXLOGWKH'3%
$SURJUDPSDVVHVWKHQDPHRIWKHGDWDEDVHILOHWRZKLFKWRDWWDFKLQGEBQDPH)RUSURJUDPV
QRWZULWWHQLQ&WKHSURJUDPPXVWDOVRSDVVWKHOHQJWKLQE\WHVRIGEBQDPHLQWKH
GEBQDPHBOHQJWKSDUDPHWHU&SURJUDPVVKRXOGSDVVDOHQJWKLQWKLVSDUDPHWHU
,IVXFFHVVIXOisc_attach_database() DVVLJQVDXQLTXH,'WRGEBKDQGOH6XEVHTXHQW$3,FDOOV
XVHWKLVKDQGOHWRLGHQWLI\WKHGDWDEDVHDJDLQVWZKLFKWKH\RSHUDWH
:KHQILQLVKHGDFFHVVLQJDGDWDEDVHGLVFRQQHFWIURPWKHGDWDEDVHZLWK
isc_detach_database()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWDWWDFKHVWRDGDWDEDVHQDPHGHPSOR\HHGE,QWKHSDUDPHWHU
EXIIHULWVSHFLILHVDXVHUQDPHDQGSDVVZRUG7KHVHFRPHIURPWKHFRQWHQWVRIFKDU*
YDULDEOHVQDPHGXVHUBQDPHDQGXVHUBSDVVZRUGUHVSHFWLYHO\
char dpb_buffer[256], *dpb, *p;
ISC_STATUS status_vector[20];
isc_db_handle handle = NULL;
short dpb_length;
*dpb++ = isc_dpb_user_name;
*dpb++ = strlen(user_name);
for (p = user_name; *p;)
*dpb++ = *p++;
*dpb++ = isc_dpb_password;
*dpb++ = strlen(user_password);
for (p = user_password; *p;)
*dpb++ = *p++;
/* An alternate choice for the above construction is to call:
isc_expand_dpb(). */
isc_attach_database(
status_vector,
0,
"employee.db",
&handle,
dpb_length,
dpb_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
/* An error occurred. */
isc_print_status (status_vector);
return(1);
}
5HWXUQ9DOXH isc_attach_database()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
212 INTERBASE 5
USING FUNCTION DEFINITIONS
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
isc_blob_default_desc()
/RDGVDGDWDVWUXFWXUHZLWKGHIDXOWLQIRUPDWLRQDERXWD%ORELQFOXGLQJLWVVXEW\SHFKDUDFWHU
VHWDQGVHJPHQWVL]H
void isc_blob_default_desc(
ISC_BLOB_DESC *desc,
unsigned char *table_name,
unsigned char *column_name);
'HVFULSWLRQ isc_blob_default_desc()ORDGVD%OREGHVFULSWRUGHVFZLWKWKHVSHFLILHGWDEOHBQDPHDQG
FROXPQBQDPHDQGWKHIROORZLQJGHIDXOWYDOXHVSULRUWRFDOOLQJisc_blob_gen_bpb()WR
JHQHUDWHD%ORESDUDPHWHUEXIIHU %3% IRUWKH%OREFROXPQEHLQJDFFHVVHG
g 6XEW\SHLVVHWWR7(;7
g &KDUDFWHUVHWLVVHWWRWKHGHIDXOWFKDUDFWHUVHWIRUWKHSURFHVVRUGDWDEDVH
g 6HJPHQWVL]HLVVHWWRE\WHV
isc_blob_default_desc()DQGWKUHHUHODWHGIXQFWLRQVisc_blob_gen_bpb()
isc_blob_lookup_desc()DQGisc_blob_set_desc()SURYLGHG\QDPLFDFFHVVWR%ORE
LQIRUPDWLRQ,QSDUWLFXODUWKHVHIXQFWLRQVFDQGHILQHDQGDFFHVVLQIRUPDWLRQDERXWD%ORE
IRUILOWHULQJSXUSRVHVVXFKDVFKDUDFWHUVHWLQIRUPDWLRQIRUWH[W%OREGDWDDQGVXEW\SH
LQIRUPDWLRQIRUWH[WDQGQRQWH[W%OREGDWD
7KHIROORZLQJWDEOHOLVWVWKHILHOGVLQWKHGHVFVWUXFWXUH
([DPSOH 7KHIROORZLQJIUDJPHQWORDGVWKH%OREGHVFULSWRUZLWKGHIDXOWLQIRUPDWLRQ
typedef struct
{
short blob_desc_subtype;
short blob_desc_charset;
short blob_desc_segment_size;
unsigned char blob_desc_field_name[32];
unsigned char blob_desc_relation_name[32];
ISC_BLOB_DESC;
isc_blob_default_desc(&desc, &relation, &field);
5HWXUQ9DOXH 1RQH
214 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_blob_gen_bpb()
*HQHUDWHVD%ORESDUDPHWHUEXIIHU %3% WRDOORZG\QDPLFDFFHVVWR%OREVXEW\SHDQG
FKDUDFWHUVHWLQIRUPDWLRQ
([DPSOH 7KHIROORZLQJIUDJPHQWJHQHUDWHVWKH%OREGHVFULSWRU
isc_blob_gen_bpb(status, &to_desc, &from_desc, bpb_length, &buffer,
&buf_length);
5HWXUQ9DOXH isc_blob_gen_bpb()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_blob_default_desc()isc_blob_lookup_desc()isc_blob_set_desc()
isc_create_blob2()isc_open_blob2()
isc_blob_info()
5HWXUQVLQIRUPDWLRQDERXWDQRSHQ%ORE
'HVFULSWLRQ isc_blob_info()UHWXUQVLQIRUPDWLRQDERXWDQH[LVWLQJ%OREVSHFLILHGE\EOREBKDQGOH7KH
LWHPOLVWEXIIHULVDQXQVWUXFWXUHGE\WHYHFWRU$QDSSOLFDWLRQOLVWVWKHLWHPVDERXWZKLFKLW
ZDQWVLQIRUPDWLRQLQWKHLWHPOLVWEXIIHU
216 INTERBASE 5
USING FUNCTION DEFINITIONS
,QWHU%DVHUHWXUQVWKHUHTXHVWHGLQIRUPDWLRQWRWKHUHVXOWEXIIHUDVDVHULHVRIFOXVWHUVRI
LQIRUPDWLRQRQHSHULWHPUHTXHVWHG(DFKFOXVWHUFRQVLVWVRIWKUHHSDUWV
$RQHE\WHLWHPW\SH(DFKLVWKHVDPHDVRQHRIWKHLWHPW\SHVLQWKHLWHPOLVW
EXIIHU
$E\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHURI
WKHFOXVWHU
$YDOXHVWRUHGLQDYDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQGHSHQGVRQ
WKHLWHPW\SH
$FDOOLQJSURJUDPLVUHVSRQVLEOHIRULQWHUSUHWLQJWKHFRQWHQWVRIWKHUHVXOWEXIIHUDQGIRU
GHFLSKHULQJHDFKFOXVWHUDVDSSURSULDWH
)RUDOLVWRILWHPVWKDWFDQEHUHTXHVWHGDQGUHWXUQHGVHH&KDSWHU´:RUNLQJZLWK%ORE
'DWDµ
([DPSOH 7KHIROORZLQJH[DPSOHUHWULHYHVLQIRUPDWLRQDERXWWKHFXUUHQWRSHQ%ORE
static char blob_items[] = {
isc_info_blob_max_segment,
isc_info_blob_num_segments,
isc_info_blob_type};
CHAR blob_info[32];
5HWXUQ9DOXH isc_blob_info()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV$
QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXVYHFWRU
LVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
isc_blob_lookup_desc()
'HWHUPLQHVWKHVXEW\SHFKDUDFWHUVHWDQGVHJPHQWVL]HRID%OREJLYHQDWDEOHQDPHDQG
%OREFROXPQQDPH
'HVFULSWLRQ isc_blob_lookup_desc()XVHVWKHV\VWHPWDEOHVRIDGDWDEDVHWRGHWHUPLQHWKHVXEW\SH
FKDUDFWHUVHWDQGVHJPHQWVL]HRID%OREJLYHQDWDEOHQDPHDQG%OREFROXPQQDPH
isc_blob_lookup_desc()DQGWKUHHUHODWHGIXQFWLRQVisc_blob_default_desc()
isc_blob_gen_bpb()DQGisc_blob_set_desc()SURYLGHG\QDPLFDFFHVVWR%ORE
LQIRUPDWLRQ,QSDUWLFXODU\RXFDQXVHWKHVHIXQFWLRQVWRGHILQHDQGDFFHVVLQIRUPDWLRQ
DERXW%OREGDWDIRUILOWHULQJSXUSRVHVVXFKDVFKDUDFWHUVHWLQIRUPDWLRQIRUWH[W%OREGDWD
DQGVXEW\SHLQIRUPDWLRQIRUWH[WDQGQRQWH[W%OREGDWD
218 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_blob_lookup_desc()VWRUHVWKHUHTXHVWHGLQIRUPDWLRQDERXWWKH%ORELQWRWKHGHVF%ORE
GHVFULSWRUVWUXFWXUH7KHIROORZLQJWDEOHGHVFULEHVWKHGHVFVWUXFWXUH
([DPSOH 7KHIROORZLQJIUDJPHQWUHWULHYHVLQIRUPDWLRQLQWRD%OREGHVFULSWRU
isc_blob_lookup_desc(status, &db_handle, &tr_handle, &relation_name,
&field_name, desc, &global);
5HWXUQ9DOXH isc_blob_lookup_desc()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH7RFKHFN
IRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\)RUPRUH
LQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_blob_default_desc()isc_blob_gen_bpb()isc_blob_set_desc()
)RUPRUHLQIRUPDWLRQDERXW%OREGHVFULSWRUVVHH&KDSWHU´:RUNLQJZLWK%ORE'DWDµ
isc_blob_set_desc()
6HWVWKHVXEW\SHDQGFKDUDFWHUVHWIRUD%ORE
'HVFULSWLRQ isc_blob_set_desc()VHWVWKH%OREFROXPQQDPHWDEOHQDPHVXEW\SHVHJPHQWVL]HDQG
FKDUDFWHUVHWIRUD%OREFROXPQWRYDOXHVVSHFLILHGE\WKHDSSOLFDWLRQ7RVHWWKHVHYDOXHVWR
,QWHU%DVHGHIDXOWVXVHisc_blob_default_desc()
isc_blob_set_desc()DQGWKUHHUHODWHGIXQFWLRQVisc_blob_default_desc()
isc_blob_gen_bpb()DQGisc_blob_lookup_desc()SURYLGHG\QDPLFDFFHVVWR%OREGDWD
,QSDUWLFXODU\RXFDQXVHWKHVHIXQFWLRQVWRGHILQHDQGDFFHVVLQIRUPDWLRQDERXW%OREGDWD
IRUILOWHULQJSXUSRVHVVXFKDVFKDUDFWHUVHWLQIRUPDWLRQIRUWH[W%OREGDWDDQGVXEW\SH
LQIRUPDWLRQIRUWH[WDQGQRQWH[W%OREGDWD
<RXFDQPDQXDOO\VHWWKHVXEW\SHDQGFKDUDFWHUVHWLQIRUPDWLRQ IRUD7(;7VXEW\SH LQD
%OREGHVFULSWRUE\ZD\RIDFDOOWRisc_blob_set_desc()3DVVWKHVXEW\SHFKDUDFWHUVHWDQG
VHJPHQWVL]HWRWKH%OREGHVFULSWRULQ\RXUDSSOLFDWLRQ
220 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_blob_set_desc()LVXVHIXOIRUVHWWLQJWKHFRQWHQWVRIWKH%OREGHVFULSWRUZLWKRXW
TXHU\LQJWKHV\VWHPWDEOHVIRUWKHLQIRUPDWLRQ&DOOVWRWKLVIXQFWLRQDOVROHWDQDSSOLFDWLRQ
VSHFLI\FKDUDFWHUVHWDQGVXEW\SHIRUFXVWRPILOWHULQJRSHUDWLRQV
Note 'RQRWFDOOWKLVIXQFWLRQZKLOHUXQQLQJDJDLQVWD9[GDWDEDVH
([DPSOH 7KHIROORZLQJH[DPSOHVHWVWKHGHIDXOWYDOXHVIRUDWRXUJXLGHDSSOLFDWLRQLQFOXGLQJ
VXEW\SHFKDUDFWHUVHWDQGVHJPHQWVL]H
isc_blob_set_desc(status, "TOURISM", "GUIDEBOOK", 1, 2, 80, &desc);
5HWXUQ9DOXH isc_blob_set_desc()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
isc_cancel_blob()
'LVFDUGVD%OREIUHHVLQWHUQDOVWRUDJHXVHGE\WKH%OREDQGVHWVWKH%OREKDQGOHWR18//
'HVFULSWLRQ ,QWHU%DVHWHPSRUDULO\VWRUHV%OREGDWDLQWKHGDWDEDVHGXULQJFUHDWHRSHUDWLRQV,IIRUVRPH
UHDVRQ\RXGRQRWRUFDQQRWFORVHD%OREWKHVWRUDJHVSDFHUHPDLQVDOORFDWHGLQWKH
GDWDEDVHDQG,QWHU%DVHGRHVQRWVHWWKHKDQGOHWR18//&DOOisc_cancel_blob()WRUHOHDVH
WKHWHPSRUDU\VWRUDJHLQWKHGDWDEDVHDQGWRVHWEOREBKDQGOHWR18//,I\RXFORVHWKH%ORE
LQWKHQRUPDOFRXUVHRI\RXUDSSOLFDWLRQSURFHVVLQJORJLFWKLVVWHSLVXQQHFHVVDU\DV
,QWHU%DVHUHOHDVHVV\VWHPUHVRXUFHVRQDFDOOWRisc_close_blob()
Note $FDOOWRWKLVIXQFWLRQGRHVQRWSURGXFHDQHUURUZKHQWKHKDQGOHLV18//7KHUHIRUH
LWLVJRRGSUDFWLFHWRFDOOisc_cancel_blob()EHIRUHFUHDWLQJRURSHQLQJD%OREWRFOHDQXS
H[LVWLQJ%ORERSHUDWLRQV
([DPSOH 7KHIROORZLQJIUDJPHQWFDQFHOVDQ\RSHQ%OREEHIRUHFUHDWLQJDQHZRQH
isc_cancel_blob(status_vector, &blob_handle);
if (status_vector[0] == 1 && status_vector[1])
{
/* process error */
isc_print_status(status_vector);
return(1);
}
isc_create_blob(status_vector, &DB, &trans, &blob_handle, &blob_id)
5HWXUQ9DOXH isc_cancel_blob()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_close_blob()
222 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_cancel_events()
&DQFHOVDQDSSOLFDWLRQ·VLQWHUHVWLQDV\QFKURQRXVQRWLILFDWLRQRIDQ\RIDVSHFLILHGJURXSRI
HYHQWV
'HVFULSWLRQ isc_cancel_events()FDQFHOVDQDSSOLFDWLRQSURJUDP·VDV\QFKURQRXVZDLWIRUDQ\RID
VSHFLILHGOLVWRIHYHQWV7KHHYHQWVDUHWKHRQHVWKDWZHUHDVVRFLDWHGZLWKHYHQWBLGDVDUHVXOW
RIDSUHYLRXVFDOOWRisc_que_events()
([DPSOH 7KHIROORZLQJFDOOFDQFHOVDSURJUDP·VZDLWIRUHYHQWVDVVRFLDWHGZLWKHYHQWBLGZKHUHHYHQWBLG
ZDVSUHYLRXVO\UHWXUQHGIURPDFDOOWRisc_que_events()
isc_cancel_events(status_vector, &database_handle, &event_id);
$PRUHFRPSOHWHH[DPSOHLVSURYLGHGLQWKHVHFWLRQRQisc_que_events()
5HWXUQ9DOXH isc_cancel_events()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_que_events()
isc_close_blob()
&ORVHVDQRSHQ%OREZKLFKLQYROYHVIOXVKLQJDQ\UHPDLQLQJVHJPHQWVUHOHDVLQJV\VWHP
UHVRXUFHVDVVRFLDWHGZLWK%OREXSGDWHRUUHWULHYDODQGVHWWLQJWKH%OREKDQGOHWR]HUR
'HVFULSWLRQ isc_close_blob()LVXVHGWRVWRUHD%ORELQWKHGDWDEDVHDQGFOHDQXSDIWHU%ORERSHUDWLRQV
&ORVHDQ\%OREDIWHUUHDGLQJIURPRUZULWLQJWRLW,IIRUVRPHUHDVRQ\RXUDSSOLFDWLRQGRHV
QRWFORVHD%ORE\RXFDQORVHGDWD,I\RXUDSSOLFDWLRQPLJKWRSHQD%OREZLWKRXWFORVLQJLW
WKHQ\RXVKRXOGFDOOisc_cancel_blob()WRPDNHVXUHWKDWWKHDSSOLFDWLRQGRHVQRWWU\WR
RSHQD
%OREWKDWLVDOUHDG\RSHQ
EOREBKDQGOHLVVHWE\DFDOOWRisc_create_blob2()RUWRisc_open_blob2()
([DPSOH 7KHIROORZLQJH[DPSOHFORVHVD%OREDQGIUHHVV\VWHPUHVRXUFHV
if (status_vector[1] == isc_segstr_eof)
isc_close_blob(status_vector, &blob_handle)
5HWXUQ9DOXH isc_close_blob()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV$
QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXVYHFWRU
LVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_cancel_blob()isc_create_blob2()isc_open_blob2()
224 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_commit_retaining()
&RPPLWVDQDFWLYHWUDQVDFWLRQDQGUHWDLQVWKHWUDQVDFWLRQFRQWH[WDIWHUDFRPPLW
'HVFULSWLRQ isc_commit_retaining()FRPPLWVDQDFWLYHWUDQVDFWLRQDQGLPPHGLDWHO\FORQHVLWVHOI7KLV
PHDQVWKDWWKHIXQFWLRQUHWDLQVWKHWUDQVDFWLRQQDPHV\VWHPUHVRXUFHVDVVRFLDWHGZLWKWKH
WUDQVDFWLRQDQGWKHFXUUHQWVWDWHRIDQ\RSHQFXUVRUVLQWKHWUDQVDFWLRQ$OWKRXJKWKH
IXQFWLRQLVDFWXDOO\LQLWLDWLQJDQHZWUDQVDFWLRQE\DVVLJQLQJWKHQHZWUDQVDFWLRQWKHDFWLYH
WUDQVDFWLRQKDQGOHLWLVLQHIIHFWNHHSLQJWKHWUDQVDFWLRQRSHQDFURVVFRPPLWV7KLVUHVXOWV
LQLPSURYHGSHUIRUPDQFHE\DOORZLQJDQDSSOLFDWLRQWRPLQLPL]HWKHRYHUKHDGRILQLWLDWLQJ
DGGLWLRQDOWUDQVDFWLRQVisc_commit_retaining()DOORZV\RXWRFRPPLWXSGDWHVZKLOH
NHHSLQJDFXUVRURSHQ
<RXFDQLQLWLDWHDUROOEDFNZLWKLQWKHDFWLYHWUDQVDFWLRQEXWWKHUROOEDFNRQO\DIIHFWV
XQFRPPLWWHGXSGDWHV,QRWKHUZRUGVDUROOEDFNLVOHJDOHYHQDIWHUWKHWUDQVDFWLRQFRQWH[W
KDVEHHQSDVVHGWRWKHFORQHGWUDQVDFWLRQEXWLQWKDWFDVHWKHUROOEDFNZLOORQO\DIIHFWWKH
XSGDWHV\RXUDSSOLFDWLRQKDVPDGHWRWKHGDWDEDVHVLQFHWKHODVWFRPPLW
7RDXGLWWKHFRPPLWVPDGHE\\RXUFDOOVWRWKLVIXQFWLRQFKHFNWKHILUVWHOHPHQWLQWKHVWDWXV
YHFWRUWRVHHLIWKHFDOOZDVVXFFHVVIXO,IWKLVHOHPHQWFRQWDLQVD]HURWKHFDOOZDVVXFFHVVIXO
7KHWUDQVDFWLRQHQGVZKHQ\RXFRPPLWZLWKRXWXVLQJWKHUHWHQWLRQIHDWXUHVXFKDVZLWKD
FDOOWRisc_commit_transaction()RUZKHQ\RXUROOEDFNZLWKisc_rollback_transaction()
([DPSOH 7KHIROORZLQJFDOOFRPPLWVDWUDQVDFWLRQSULQWVDPHVVDJHDQGVWDUWVDQHZWUDQVDFWLRQZLWK
WKHVDPHKDQGOHZLWKLQWKHVDPHUHTXHVW
if (!isc_commit_retaining(status, &retained_trans))
{
fprintf("Committed and retained\\n");
isc_print_status(status);
}
7KHIROORZLQJFDOOFRPPLWVDWUDQVDFWLRQSULQWVDFRQILUPDWLRQPHVVDJHVWDUWVDQHZ
WUDQVDFWLRQZLWKWKHVDPHKDQGOHZLWKLQWKHVDPHUHTXHVWRULIWKHFRPPLWIDLOVSULQWVDQ
HUURUPHVVDJHDQGUROOVEDFN
isc_commit_retaining(status, &retained_trans);
if (status[0] == 1 && status[1])
{
fprintf("An error occurred during commit, rolling back.");
rb_status = isc_rollback_transaction(status, &retained_status);
}
else
{
fprintf("Commit successful.");
tr_count++; /*Increments the number of commits. */
}
5HWXUQ9DOXH isc_commit_retaining()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()isc_rollback_transaction()isc_start_transaction()
isc_commit_transaction()
&RPPLWVDVSHFLILHGDFWLYHWUDQVDFWLRQ
226 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJFDOOFRPPLWVDWUDQVDFWLRQDQGSULQWVDPHVVDJH
isc_commit_transaction(status, &trans);
if (status[0] == 1 && status[1])
{
fprintf("Error on write\\n");
isc_print_status(status);
}
5HWXUQ9DOXH isc_commit_transaction()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_retaining()isc_prepare_transaction()
isc_create_blob2()
&UHDWHVDQGRSHQVWKH%OREIRUZULWHDFFHVVDQGRSWLRQDOO\VSHFLILHVWKHILOWHUVWREHXVHGWR
WUDQVODWHWKH%OREIURPRQHVXEW\SHWRDQRWKHU
'HVFULSWLRQ isc_create_blob2()FUHDWHVDFRQWH[WIRUVWRULQJD%ORERSHQVD%OREIRUZULWHDFFHVVDQG
RSWLRQDOO\VSHFLILHVWKHILOWHUVXVHGWRWUDQVODWHIURPRQH%OREIRUPDWWRDQRWKHU
6XEVHTXHQWFDOOVWRisc_put_segment()ZULWHGDWDIURPDQDSSOLFDWLRQEXIIHUWRWKH%ORE
,ID%OREILOWHULVXVHGLWLVFDOOHGIRUHDFKVHJPHQWZULWWHQWRWKH%ORE,QWHU%DVHVHOHFWVWKH
ILOWHUWREHXVHGEDVHGRQWKHVRXUFHDQGWDUJHWVXEW\SHVVSHFLILHGLQDSUHYLRXVO\SRSXODWHG
%ORESDUDPHWHUEXIIHU %3% SRLQWHGWRE\ESEBDGGUHVV
Note %OREILOWHUVDUHQRWVXSSRUWHGRQ1HWZDUH
228 INTERBASE 5
USING FUNCTION DEFINITIONS
,ID%OREILOWHULVQRWQHHGHGRUFDQQRWEHXVHGD%3%LVQRWQHHGHGSDVVIRUESEBOHQJWK
DQG18//IRUESEBDGGUHVV
7KH%OREKDQGOHSRLQWHGWRE\EOREBKDQGOHPXVWEH]HURZKHQisc_create_blob2() LVFDOOHG
7RUHXVHEOREBKDQGOHFORVHWKH%OREZLWKDFDOOWRisc_close_blob()WR]HURRXWWKHKDQGOH
EHIRUHFDOOLQJ isc_create_blob2()
2QVXFFHVVisc_create_blob2()DVVLJQVDXQLTXH,'WREOREBKDQGOHDQGD%ORELGHQWLILHUWR
EOREBLG6XEVHTXHQW$3,FDOOVUHTXLUHRQHRUERWKRIWKHVHWRLGHQWLI\WKH%OREDJDLQVWZKLFK
WKH\RSHUDWH
$IWHUDEORELVFUHDWHGGDWDFDQEHZULWWHQWRLWE\DVHTXHQFHRIFDOOVWRisc_put_segment()
:KHQILQLVKHGZULWLQJWRWKH%OREFORVHLWZLWKisc_close_blob()
:KHQ\RXFUHDWHD%ORELWLVHVVHQWLDOO\DQ´RUSKDQµXQWLO\RXDVVLJQLWVEOREBLGWRDSDUWLFXODU
%OREFROXPQRIDSDUWLFXODUURZRIDWDEOH<RXGRWKLVDIWHUFORVLQJWKH%OREE\XVLQJ'64/
WRH[HFXWHHLWKHUDQ,16(57VWDWHPHQWWRLQVHUWDQHZURZFRQWDLQLQJWKH%ORE DQGDQ\RWKHU
FROXPQVGHVLUHG RUDQ83'$7(VWDWHPHQWWRUHSODFHDQH[LVWLQJ%OREZLWKWKHQHZRQH
)RUPRUHLQIRUPDWLRQDERXW%3%VDQG%OREILOWHUVVHH&KDSWHU´:RUNLQJZLWK%ORE
'DWDµ
([DPSOH 7KHIROORZLQJIUDJPHQWGHFODUHVD%3%SRSXODWHVLWZLWKILOWHULQIRUPDWLRQWKHQFUHDWHVD
%OREDQGSDVVHVWKH%3%
isc_blob_handle blob_handle; /* declare at beginning */
ISC_QUAD blob_id; /* declare at beginning */
char bpb[] = {
isc_bpb_version1,
isc_bpb_target_type,
1, /* # bytes that follow which specify target subtype */
1, /* target subtype (TEXT) */
isc_bpb_source_type,
1, /* # bytes that follow which specify source subtype */
-4, /* source subtype*/
};
. . .
isc_create_blob2(
status_vector,
&db_handle,
&tr_handle,
&blob_handle, /* to be filled in by this function */
&blob_id, /* to be filled in by this function */
actual_bpb_length, /* length of BPB data */
5HWXUQ9DOXH isc_create_blob2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_blob_gen_bpb()isc_open_blob2()isc_put_segment()
isc_database_info()
5HSRUWVUHTXHVWHGLQIRUPDWLRQDERXWDSUHYLRXVO\DWWDFKHGGDWDEDVH
'HVFULSWLRQ isc_database_info()UHWXUQVLQIRUPDWLRQDERXWDQDWWDFKHGGDWDEDVH7\SLFDOO\
isc_database_info()LVFDOOHGWR
230 INTERBASE 5
USING FUNCTION DEFINITIONS
g 'HWHUPLQHKRZPXFKVSDFHLVXVHGIRUSDJHFDFKHV7KHVSDFHLVWKHSURGXFWRIWKHQXPEHU
RIEXIIHUVDQGWKHSDJHVL]HZKLFKDUHGHWHUPLQHGE\FDOOLQJisc_database_info()ZLWKWKH
LVFBLQIRBQXPBEXIIHUVDQGLVFBLQIRBSDJHBVL]HLWHPOLVWRSWLRQV
g 0RQLWRUSHUIRUPDQFH)RUH[DPSOHWRFRPSDUHWKHHIILFLHQF\RIWZRXSGDWHVWUDWHJLHVVXFK
DVXSGDWLQJDVRUWHGRUXQVRUWHGVWUHDP
7KHFDOOLQJSURJUDPSDVVHVLWVUHTXHVWIRULQIRUPDWLRQWKURXJKWKHLWHPOLVWEXIIHUVXSSOLHG
E\WKHSURJUDPDQG,QWHU%DVHUHWXUQVWKHLQIRUPDWLRQWRDSURJUDPVXSSOLHGUHVXOWEXIIHU
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWUHTXHVWVWKHSDJHVL]HDQGWKHQXPEHURIEXIIHUVWKHQ
H[DPLQHVWKHUHVXOWEXIIHUWRUHWULHYHWKHYDOXHVVXSSOLHGE\WKH,QWHU%DVHHQJLQH
char db_items[] = {
isc_info_page_size, isc_info_num_buffers,
isc_info_end};
char res_buffer[40], *p, item;
int length;
SLONG page_size = 0L, num_buffers = 0L;
ISC_STATUS status_vector[20];
isc_database_info(
status_vector,
&handle, /* Set in previous isc_attach_database() call. */
sizeof(db_items),
db_items,
sizeof(res_buffer),
res_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
/* An error occurred. */
isc_print_status(status_vector);
return(1);
};
/* Extract the values returned in the result buffer. */
for (p = res_buffer; *p != isc_info_end ;)
{
item = *p++;
length = isc_vax_integer (p, 2);
p += 2;
switch (item)
{
case isc_info_page_size:
page_size = isc_vax_integer (p, length);
break;
case isc_info_num_buffers:
num_buffers = isc_vax_integer (p, length);
break;
default:
break;
}
p += length;
};
5HWXUQ9DOXH isc_database_info()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_attach_database()isc_detach_database()
)RUPRUHLQIRUPDWLRQDERXWUHTXHVWLQJGDWDEDVHDWWDFKPHQWLQIRUPDWLRQVHH´5HTXHVWLQJ
LQIRUPDWLRQDERXWDQDWWDFKPHQWµRQSDJH
isc_decode_date()
7UDQVODWHVDGDWHIURP,QWHU%DVH,6&B48$'IRUPDWLQWRWKH&WPIRUPDW
'HVFULSWLRQ isc_decode_date()WUDQVODWHVDGDWHUHWULHYHGIURPDWDEOHDQGVWRUHGLQDQ,6&B48$'
YDULDEOHLEBGDWHLQWRD&WLPHVWUXFWXUHIRUSURJUDPPDQLSXODWLRQ%RWKLEBGDWHDQGWPBGDWH
PXVWEHGHFODUHGDQGLQLWLDOL]HGEHIRUHXVH
8VHWKHisc_dsqlIDPLO\RI$3,FDOOVWRUHWULHYH,QWHU%DVH'$7(GDWDIURPDWDEOHLQWRWKH
,6&B48$'VWUXFWXUHSULRUWRWUDQVODWLRQ
232 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJFRGHIUDJPHQWLOOXVWUDWHVGHFODULQJWLPHVWUXFWXUHVDQGFDOOLQJ
isc_decode_date()WRWUDQVODWHDQ,QWHU%DVHGDWHIRUPDWLQWRD&WLPHIRUPDW
#include <time.h>
#include <ibase.h>
. . .
struct tm hire_time;
ISC_QUAD hire_date;
. . .
/* Retrieve DATE data from a table here. */
. . .
isc_decode_date(&hire_date, &hire_time);
5HWXUQ9DOXH 1RQH
6HH$OVR isc_encode_date()
isc_delete_user( )
'HOHWHVDXVHUUHFRUGIURPWKHSDVVZRUGGDWDEDVHLVFJGE
'HVFULSWLRQ 7KHWKUHHVHFXULW\IXQFWLRQVisc_add_user()isc_delete_user()DQGisc_modify_user()
PLUURUIXQFWLRQDOLW\WKDWLVDYDLODEOHLQWKHgsecFRPPDQGOLQHXWLOLW\isc_delete_user()
GHOHWHVDUHFRUGIURPLVFJGE,QWHU%DVH·VSDVVZRUGGDWDEDVH
$WDPLQLPXP\RXPXVWSURYLGHWKHXVHUQDPH,IWKHVHUYHULVQRWORFDO\RXPXVWSURYLGH
ERWKDVHUYHUQDPHDQGDSURWRFRO9DOLGFKRLFHVIRUWKHSURWRFROILHOGDUHVHFBSURWRFROBWFSLS
VHFBSURWRFROBQHWEHXLVHFBSURWRFROBVS[DQGVHFBSURWRFROBORFDO
,QWHU%DVHUHDGVWKHVHWWLQJVIRUWKH,6&B86(5DQG,6&B3$66:25'HQYLURQPHQWYDULDEOHVLI
\RXGRQRWSURYLGHD'%$XVHUQDPHDQGSDVVZRUG
7KHGHILQLWLRQIRUWKH86(5B6(&B'$7$VWUXFWLQLEDVHKLVDVIROORZV
typedef struct {
short sec_flags; /* which fields are specified */
int uid; /* the user’s id */
int gid; /* the user’s group id */
int protocol; /* protocol to use for connection */
char *server; /* server to administer */
char *user_name; /* the user’s name */
char *password; /* the user’s password */
char *group_name; /* the group name */
char *first_name; /* the user’s first name */
char *middle_name; /* the user’s middle name */
char *last_name; /* the user’s last name */
char *dba_user_name; /* the dba user name */
char *dba_password; /* the dba password */
} USER_SEC_DATA;
:KHQ\RXSDVVWKLVVWUXFWWRRQHRIWKHWKUHHVHFXULW\IXQFWLRQV\RXFDQWHOOLWZKLFKILHOGV
\RXKDYHVSHFLILHGE\GRLQJDELWZLVH25RIWKHIROORZLQJYDOXHVZKLFKDUHGHILQHGLQLEDVHK
sec_uid_spec 0x01
sec_gid_spec 0x02
sec_server_spec 0x04
sec_password_spec 0x08
sec_group_name_spec 0x10
sec_first_name_spec 0x20
sec_middle_name_spec 0x40
sec_last_name_spec 0x80
sec_dba_user_name_spec 0x100
sec_dba_password_spec 0x200
1RELWYDOXHVDUHDYDLODEOHIRUXVHUQDPHDQGSDVVZRUGVLQFHWKH\DUHUHTXLUHG
234 INTERBASE 5
USING FUNCTION DEFINITIONS
7KHIROORZLQJHUURUPHVVDJHVH[LVWIRUWKLVIXQFWLRQ
sec.server = "kennel";
sec.dba_user_name = "sysdba";
sec.dba_password = "masterkey";
sec.protocol = sec_protocol_tcpip;
sec.user_name = "socks";
sec.sec_flags = sec_server_spec
| sec_dba_user_name_spec
| sec_dba_password_name_spec;
isc_delete_user(status, &sec);
/* check status for errors */
5HWXUQ9DOXH isc_delete_user()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU6HHWKH´'HVFULSWLRQµVHFWLRQIRUWKLVIXQFWLRQIRUDOLVW
RIHUURUFRGHV)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU
´+DQGOLQJ(UURU&RQGLWLRQVµ
6HH$OVR isc_add_user()isc_modify_user()
isc_detach_database()
'HWDFKHVIURPDGDWDEDVHSUHYLRXVO\FRQQHFWHGZLWKisc_attach_database()
'HVFULSWLRQ isc_detach_database()GHWDFKHVDQDWWDFKHGGDWDEDVH&DOOWKLVIXQFWLRQWRUHOHDVHV\VWHP
UHVRXUFHVZKHQ\RXDUHGRQHXVLQJDGDWDEDVHRUEHIRUHUHDWWDFKLQJWKHGDWDEDVHZLWK
GLIIHUHQWDWWDFKSDUDPHWHUV isc_detach_database()DOVRUHOHDVHVWKHEXIIHUVDQGVWUXFWXUHV
WKDWFRQWUROWKHUHPRWHLQWHUIDFHRQWKHFOLHQWDQGWKHUHPRWHVHUYHUZKHUHWKHGDWDEDVHLV
VWRUHG
%HIRUHFDOOLQJisc_detach_database()FRPPLWRUUROOEDFNWUDQVDFWLRQVDIIHFWLQJWKH
GDWDEDVHIURPZKLFK\RXZDQWWRGHWDFK
236 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJFRQGLWLRQDOVWDWHPHQWGHWDFKHVDGDWDEDVH
if (handle)
isc_detach_database(status_vector, &handle);
$VVXPLQJWKDWKDQGOHLVYDOLGDQGLGHQWLILHVDQDWWDFKHGGDWDEDVHWKHVSHFLILHGGDWDEDVHLV
GHWDFKHGZKHQWKLVVWDWHPHQWH[HFXWHV
5HWXUQ9DOXH isc_detach_database()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_attach_database()
isc_drop_database()
'HOHWHVDFXUUHQWO\DWWDFKHGGDWDEDVHDQGDOORILWVVXSSRUWLQJILOHVVXFKDVVHFRQGDU\
GDWDEDVHILOHVZULWHDKHDGORJILOHVDQGVKDGRZILOHV
'HVFULSWLRQ isc_drop_database()GHOHWHVDQDWWDFKHGGDWDEDVHDQGDOORILWVVXSSRUWLQJILOHV&DOOWKLV
URXWLQHZKHQ\RXQRORQJHUKDYHDXVHIRUWKHGDWDEDVH IRUH[DPSOHLI\RXPRYHGDOOWKH
GDWDLQWRDQRWKHUGDWDEDVHRULIWKHGDWDEDVHZDVMXVWWHPSRUDU\DQGLVQRORQJHUQHHGHG
7RVXFFHHGisc_drop_database()PXVWEHLVVXHGZKHQQRRWKHUSURFHVVHVDUHDWWDFKHGWR
WKHGDWDEDVH
([DPSOH 7KHIROORZLQJFRQGLWLRQDOVWDWHPHQWGURSVDGDWDEDVH
if (handle)
isc_drop_database(status_vector, &handle);
$VVXPLQJWKDWKDQGOHLVYDOLGDQGLGHQWLILHVDQDWWDFKHGGDWDEDVHWKHVSHFLILHGGDWDEDVHLV
GURSSHGZKHQWKLVVWDWHPHQWH[HFXWHV
5HWXUQ9DOXH isc_drop_database()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_attach_database()
isc_dsql_allocate_statement()
$OORFDWHVDVWDWHPHQWKDQGOHIRUVXEVHTXHQWXVHZLWKRWKHU$3,G\QDPLF64/ '64/ FDOOV
'HVFULSWLRQ isc_dsql_allocate_statement()DOORFDWHVDVWDWHPHQWKDQGOHDQGUHWXUQVDSRLQWHUWRLWLQ
VWPWBKDQGOH7KLVSRLQWHULVSDVVHGWRisc_dsql_prepare()WRDVVRFLDWHWKHVWDWHPHQWKDQGOH
ZLWKDSDUWLFXODU'64/VWDWHPHQWIRUSURFHVVLQJ
238 INTERBASE 5
USING FUNCTION DEFINITIONS
,ID'64/VWDWHPHQWLVWREHH[HFXWHGPXOWLSOHWLPHVRULILWUHWXUQVRXWSXW RWKHUWKDQWKH
UHVXOWVIURPDVWRUHGSURFHGXUH isc_dsql_allocate_statement()RU
isc_dsql_alloc_statement2()VKRXOGEHFDOOHGWRDOORFDWHDVWDWHPHQWKDQGOHSULRUWR
SUHSDULQJDQGH[HFXWLQJWKHVWDWHPHQWZLWKisc_dsql_prepare()DQGisc_dsql_execute()
Note 7KHIXQFWLRQisc_dsql_allocate_statement()LVYHU\VLPLODUWR WKHIXQFWLRQ,
isc_dsql_alloc_statement2() H[FHSWWKDWVWDWHPHQWKDQGOHVDOORFDWHGXVLQJ
isc_dsql_allocate_statement() DUHQRWDXWRPDWLFDOO\UHVHWWR18//ZKHQWKHGDWDEDVH
XQGHUZKLFKWKH\DUHDOORFDWHGLVGHWDFKHG7RUHVHWVWDWHPHQWKDQGOHVDXWRPDWLFDOO\XVH
isc_dsql_alloc_statement2()
:KHQ\RXDUHGRQHSURFHVVLQJDVWDWHPHQWWKHVWDWHPHQWKDQGOHFDQEHIUHHGZLWKWKH
isc_dsql_free_statement()RUE\FDOOLQJisc_detach_database()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWDOORFDWHVDVWDWHPHQWKDQGOHIRUDQ64/VWDWHPHQWWKDW
ZLOODFFHVVWKHGDWDEDVHUHIHUHQFHGE\WKHGDWDEDVHKDQGOHGDWDEDVHBKDQGOH
ISC_STATUS status_vector[20];
isc_stmt_handle statement_handle;
5HWXUQ9DOXH isc_dsql_allocate_statement()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBGEBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_alloc_statement2()isc_dsql_execute()isc_dsql_free_statement()
isc_dsql_prepare()
isc_dsql_alloc_statement2()
$OORFDWHVDVWDWHPHQWKDQGOHIRUVXEVHTXHQWXVHZLWKRWKHU$3,G\QDPLF64/ '64/ FDOOV
'HVFULSWLRQ isc_dsql_alloc_statement2()DOORFDWHVDVWDWHPHQWKDQGOHDQGUHWXUQVDSRLQWHUWRLWLQ
VWPWBKDQGOH7KLVSRLQWHULVSDVVHGWRisc_dsql_prepare()WRDVVRFLDWHWKHVWDWHPHQWKDQGOH
ZLWKDSDUWLFXODU'64/VWDWHPHQWIRUSURFHVVLQJ
,ID'64/VWDWHPHQWLVWREHH[HFXWHGPXOWLSOHWLPHVRULILWUHWXUQVRXWSXW RWKHUWKDQWKH
UHVXOWVIURPDVWRUHGSURFHGXUH isc_dsql_alloc_statement2()RU
isc_dsql_allocate_statement()VKRXOGEHFDOOHGWRDOORFDWHDVWDWHPHQWKDQGOHSULRUWR
SUHSDULQJDQGH[HFXWLQJWKHVWDWHPHQWZLWKisc_dsql_prepare()DQGisc_dsql_execute()
Note 7KHIXQFWLRQisc_dsql_allocate_statement2()LVYHU\VLPLODUWR WKHIXQFWLRQ,
isc_dsql_alloc_statement() H[FHSWWKDWVWDWHPHQWKDQGOHVDOORFDWHGXVLQJ
isc_dsql_allocate_statement2() DUHDXWRPDWLFDOO\UHVHWWR18//ZKHQWKHGDWDEDVHXQGHU
ZKLFKWKH\DUHDOORFDWHGLVGHWDFKHG
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWDOORFDWHVDVWDWHPHQWKDQGOHIRUDQ64/VWDWHPHQWWKDW
ZLOODFFHVVWKHGDWDEDVHUHIHUHQFHGE\WKHGDWDEDVHKDQGOHGDWDEDVHBKDQGOH
ISC_STATUS status_vector[20];
isc_stmt_handle statement_handle;
240 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_alloc_statement2(
status_vector,
&database_handle, /* Set in previous isc_attach_database() call. */
&statement_handle);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display an error message. */
return(1); /* Return now. */
}
/* Call other functions to associate a particular SQL statement with
the statement handle, and to do other operations necessary to prepare and
execute the DSQL statement. */
;
5HWXUQ9DOXH isc_dsql_alloc_statement2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBGEBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
isc_dsql_describe()
3URYLGHVLQIRUPDWLRQDERXWFROXPQVUHWULHYHGE\WKHH[HFXWLRQRID'64/6(/(&7RU
(;(&87(352&('85(VWDWHPHQW
'HVFULSWLRQ isc_dsql_describe()VWRUHVLQWR[VTOGDDGHVFULSWLRQRIWKHFROXPQVWKDWPDNHXSWKHURZV
UHWXUQHGIRUD6(/(&7VWDWHPHQWRUDGHVFULSWLRQRIWKHUHVXOWYDOXHVUHWXUQHGE\DQ
(;(&87(352&('85(VWDWHPHQW7KHVHVWDWHPHQWVPXVWKDYHEHHQSUHYLRXVO\SUHSDUHG
IRUH[HFXWLRQZLWKisc_dsql_prepare()EHIRUHisc_dsql_describe()FDQEHFDOOHG
Note 8VLQJLVFBGVTOBGHVFULEH LVQRWQHFHVVDU\XQOHVVDSUHYLRXVO\LVVXHG
LVFBGVTOBSUHSDUH IXQFWLRQLQGLFDWHVWKDWWKHUHLVLQVXIILFLHQWURRPLQWKHRXWSXW;64/'$
IRUWKHUHWXUQYDOXHVRIWKH'64/VWDWHPHQWWREHH[HFXWHG
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDVHTXHQFHRIFDOOVZKLFKDOORFDWHVDQ;64/'$
SUHSDUHVDVWDWHPHQWFKHFNVZKHWKHURUQRWWKHDSSURSULDWHQXPEHURI;64/9$5VZDV
DOORFDWHGDQGFRUUHFWVWKHVLWXDWLRQLIQHHGHG
#include <ibase.h>
ISC_STATUS status_vector[20];
XSQLDA *osqlda;
int n;
char *query =
"SELECT * FROM CITIES WHERE STATE = "NY" ORDER BY CITY DESCENDING";
242 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_prepare(
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
0,
query,
1,
osqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_dsql_describe()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHRUDQRWKHU
,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_describe_bind()isc_dsql_execute()isc_dsql_execute2()
isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWSUHSDULQJD'64/VWDWHPHQWZLWKUHWXUQYDOXHVVHH´'64/
SURJUDPPLQJPHWKRGVµRQSDJH )RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJ
WKH;64/'$VHH´8QGHUVWDQGLQJWKH;64/'$µRQSDJH
isc_dsql_describe_bind()
3URYLGHVLQIRUPDWLRQDERXWG\QDPLFLQSXWSDUDPHWHUVUHTXLUHGE\DSUHYLRXVO\SUHSDUHG
'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_describe_bind()VWRUHVLQWRWKHLQSXW;64/'$[VTOGDLQIRUPDWLRQDERXWWKH
G\QDPLFLQSXWSDUDPHWHUVUHTXLUHGE\D'64/VWDWHPHQWSUHYLRXVO\SUHSDUHGZLWK
isc_dsql_prepare()
244 INTERBASE 5
USING FUNCTION DEFINITIONS
%HIRUHDQDSSOLFDWLRQFDQH[HFXWHDVWDWHPHQWZLWKLQSXWSDUDPHWHUVLWPXVWVXSSO\YDOXHV
IRUWKHPLQDQLQSXW;64/'$VWUXFWXUH,I\RXNQRZH[DFWO\KRZPDQ\SDUDPHWHUVDUH
UHTXLUHGDQGWKHLUGDWDW\SHV\RXFDQVHWXSWKH;64/'$GLUHFWO\ZLWKRXWFDOOLQJ
isc_dsql_describe_bind()%XWLI\RXQHHG,QWHU%DVHWRDQDO\]HWKHVWDWHPHQWDQGSURYLGH
LQIRUPDWLRQVXFKDVWKHQXPEHURISDUDPHWHUVDQGWKHLUGDWDW\SHV\RXPXVWFDOO
isc_dsql_describe_bind()WRVXSSO\WKHLQIRUPDWLRQ
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDVHTXHQFHRIFDOOVWKDWDOORFDWHVDQLQSXW
;64/'$SUHSDUHVD'64/83'$7(VWDWHPHQWFDOOVWKHIXQFWLRQ
isc_dsql_describe_bind()FKHFNVZKHWKHURUQRWWKHDSSURSULDWHQXPEHURI;64/9$5V
ZDVDOORFDWHGDQGFRUUHFWVWKHVLWXDWLRQLIQHFHVVDU\
#include <ibase.h>
ISC_STATUS status_vector[20];
XSQLDA *isqlda
int n;
char *str = "UPDATE DEPARTMENT SET BUDGET = ?, LOCATION = ?";
isc_dsql_prepare(
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
0,
str,
1,
NULL);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
/* Allocate an input XSQLDA. */
isqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1);
isqlda->version = SQLDA_VERSION1;
isqlda->sqln = 1;
isc_dsql_describe_bind(
status_vector,
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
1,
isqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
if (isqlda->sqld > isqlda->sqln) /* Need more XSQLVARs. */
{
n = isqlda->sqld;
free(isqlda);
isqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n);
isqlda->sqln = n;
isqlda->version = SQLDA_VERSION1;
isc_dsql_describe_bind(
status_vector,
&stmt_handle,
1,
isqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
}
5HWXUQ9DOXH isc_dsql_describe_bind()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHRUDQRWKHU
,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_describe()
isc_dsql_execute()
isc_dsql_execute2()isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWSUHSDULQJD'64/VWDWHPHQWZLWKLQSXWSDUDPHWHUVVHH´'64/
SURJUDPPLQJPHWKRGVµRQSDJH )RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJ
WKH;64/'$VHH´8QGHUVWDQGLQJWKH;64/'$µRQSDJH
246 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_execute()
([HFXWHVDSUHYLRXVO\SUHSDUHG'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_execute()H[HFXWHVD'64/VWDWHPHQWSUHYLRXVO\SUHSDUHGZLWK
isc_dsql_prepare() isc_dsql_execute()FDQEHXVHGWRH[HFXWHWZRW\SHVRIVWDWHPHQWV
g 6WDWHPHQWVWKDWPD\UHWXUQPRUHWKDQRQHURZRIGDWD
g 6WDWHPHQWVWKDWQHHGWREHH[HFXWHGPRUHWKDQRQFH
,IDVWDWHPHQWWRH[HFXWHKDVLQSXWSDUDPHWHUVWKHQ isc_dsql_execute()UHTXLUHVDQLQSXW
;64/'$WRGHVFULEHWKRVHSDUDPHWHUV,WGRHVQRWSURYLGHIRUDQRXWSXW;64/'$$FDOOWR
isc_dsql_execute()WKDWH[HFXWHVD6(/(&7VWDWHPHQWUHVXOWVLQWKHFUHDWLRQRIDOLVW
FRQWDLQLQJDOOWKHURZVRIGDWDWKDWDUHWKHUHVXOWRIH[HFXWLRQRIWKHVWDWHPHQW7RDFFHVV
WKHVHURZVFDOOisc_dsql_fetch()LQDORRS(DFKFDOOWRisc_dsql_fetch()IHWFKHVWKHQH[W
URZIURPWKHVHOHFWOLVW
,IWKHVWDWHPHQWWREHH[HFXWHGUHTXLUHVLQSXWSDUDPHWHUYDOXHV WKDWLVLILWFRQWDLQV
SDUDPHWHUPDUNHUV WKHVHYDOXHVPXVWEHVXSSOLHGLQWKHLQSXW;64/'$[VTOGDEHIRUHFDOOLQJ
isc_dsql_execute()
Note 7RH[HFXWHDVWDWHPHQWUHSHDWHGO\ZKHQLWERWKKDVLQSXWSDUDPHWHUVDQGUHWXUQYDOXHV
VXFKDV(;(&87(352&('85(XVHisc_dsql_execute2()ZKLFKUHTXLUHVERWKDQLQSXWDQG
DQRXWSXW;64/'$
,I\RXRQO\QHHGWRH[HFXWHDVWDWHPHQWRQFHDQGLWGRHVQRWUHWXUQDQ\GDWDFDOO
isc_dsql_execute_immediate()LQVWHDGRI isc_dsql_prepare()DQGisc_dsql_execute()
7RH[HFXWHDVWDWHPHQWZLWKERWKLQSXWDQGRXWSXWSDUDPHWHUVDVLQJOHWLPHXVH
isc_dsql_exec_immed2()
Note &5($7('$7$%$6(DQG6(775$16$&7,21FDQQRWEHH[HFXWHGZLWK
isc_dsql_execute()RUisc_dsql_execute2()7RH[HFXWHWKHVHVWDWHPHQWVXVH
isc_dsql_execute_immediate()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVFDOOVWRisc_dsql_execute()DQG
isc_dsql_fetch(),WDOORFDWHVLQSXWDQGRXWSXW;64/'$VSUHSDUHVD6(/(&7VWDWHPHQW
H[HFXWHVLWDQGIHWFKHVDQGSURFHVVHVHDFKURZRQHE\RQH
#include <ibase.h>
ISC_STATUS status_vector[20], fetch_stat;
XSQLDA *isqlda, *osqlda;
XSQLVAR *ivar, *ovar;
char *str = "SELECT CITY, POPULATION FROM CITIES WHERE STATE = ?";
char *state = "CA";
/* Allocate an output XSQLDA osqlda. */
osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(2);
osqlda->version = SQLDA_VERSION1;
osqlda->sqln = 2;
248 INTERBASE 5
USING FUNCTION DEFINITIONS
/* Check to see whether or not the output XSQLDA had enough XSQLVARS
allocated. If not, correct it -- see isc_dsql_describe(). */
/* Allocate and fill in the input XSQLDA. This example assumes you know
how many input parameters there are (1), and all other information
necessary to supply a value. If this is not true, you will need to call
isc_dsql_describe_bind(). */
isqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1));
isqlda->version = SQLDA_VERSION1;
isqlda->sqln = 1;
isqlda->sqld = 1;
ivar = isqlda->sqlvar[0];
ivar->sqltype = SQL_TEXT;
ivar->sqllen = sizeof(state);
ivar->sqldata = state;
case SQL_LONG:
ovar->sqldata = (char *)malloc(sizeof(long));
/* Process remaining types. */
. . .
}
if (ovar->sqltype & 1)
{
/* Assign a variable to hold NULL status. */
ovar->sqlind = (short *)malloc(sizeof(short));
}
} /* end of for loop */
/* Fetch and process the rows in the select list one by one. */
while ((fetch_stat = isc_dsql_fetch(
status_vector,
&stmt_handle,
1,
osqlda)) == 0)
{
for (i=0; i < osqlda->sqld; i++)
{
/* Call a function you’ve written to process each returned
select-list item. */
process_column(osqlda->sqlvar[i]);
}
}
5HWXUQ9DOXH isc_dsql_execute()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHLVFBEDGBWUDQVBKDQGOHRU
DQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_describe_bind()
isc_dsql_exec_immed2()isc_dsql_execute_immediate()
isc_dsql_execute2()isc_dsql_fetch()isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJWKH;64/'$VHH´8QGHUVWDQGLQJWKH
;64/'$µRQSDJH
250 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_execute2()
([HFXWHVDSUHYLRXVO\SUHSDUHG'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_execute2()H[HFXWHVDSUHYLRXVO\SUHSDUHG'64/VWDWHPHQWWKDWKDVLQSXW
SDUDPHWHUVDQGUHWXUQVUHVXOWVVXFKDV(;(&87(352&('85(DQG6(/(&7
,IWKHVWDWHPHQWWRH[HFXWHUHTXLUHVLQSXWSDUDPHWHUYDOXHV WKDWLVLILWFRQWDLQVSDUDPHWHU
PDUNHUV WKHVHYDOXHVPXVWEHVXSSOLHGLQWKHLQSXW;64/'$LQB[VTOGDEHIRUHFDOOLQJ
isc_dsql_execute2()
,IWKHVWDWHPHQWWRH[HFXWHUHWXUQVYDOXHVWKH\DUHSODFHGLQWKHVSHFLILHGRXWSXW;64/'$
RXWB[VTOGD,ID18//YDOXHLVVXSSOLHGIRUWKHRXWSXW;64/'$DQGWKHVWDWHPHQWUHWXUQV
YDOXHVWKH\DUHVWRUHGLQDQUHVXOWVHW7RDFFHVVWKHUHWXUQHGGDWDXVHisc_dsql_fetch()LQD
ORRS
7,3 ,I\RXMXVWZDQWWRH[HFXWHRQFHDVWDWHPHQWUHWXUQLQJMXVWRQHJURXSRIGDWDFDOO
isc_dsql_exec_immed2()LQVWHDGRIisc_dsql_prepare()DQGisc_dsql_execute2()
7RH[HFXWHDVWDWHPHQWWKDWGRHVQRWUHWXUQDQ\GDWDDVLQJOHWLPHFDOO
isc_dsql_execute_immediate() LQVWHDG
RI
isc_dsql_prepare() DQGisc_dsql_execute2()
Note &5($7('$7$%$6(DQG6(775$16$&7,21FDQQRWEHH[HFXWHGZLWK
isc_dsql_execute()RUisc_dsql_execute2()7RH[HFXWHWKHVHVWDWHPHQWVXVH
isc_dsql_execute_immediate()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDVHTXHQFHRIFDOOVWKDWDOORFDWHVDQLQSXW
;64/'$DQGORDGVYDOXHVLQWRLWDOORFDWHVDQRXWSXW;64/'$SUHSDUHVDQ(;(&87(
352&('85(VWDWHPHQWDOORFDWHVVSDFHLQWKHRXWSXW;64/'$IRUHDFKFROXPQUHWXUQHGIRU
HDFKURZUHWULHYHGE\WKHFDOODQGH[HFXWHVWKHSUHSDUHGVWDWHPHQWSODFLQJUHWXUQYDOXHVLQ
WKHRXWSXW;64/'$
#include <ibase.h>
ISC_STATUS status_vector[20];
XSQLDA *isqlda, *osqlda;
XSQLVAR *ivar, *ovar;
short null_flag;
char *str = "EXECUTE PROCEDURE P1";
char *state = "CA";
/* Allocate an output XSQLDA osqlda. This example assumes you know that P1
will return one value. */
osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1);
osqlda->version = SQLDA_VERSION1;
osqlda->sqln = 1;
252 INTERBASE 5
USING FUNCTION DEFINITIONS
osqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
/* Set up the output XSQLVAR structure to allocate space for the return
value. Again, this example assumes you know that P1 returns just one value.
For an example of what to do if you’re not sure, see isc_dsql_describe().
For an example of setting up an output XSQLVAR structure to allocate space
for multiple return items, see the isc_dsql_execute() example program. */
ovar = osqlda->sqlvar[0];
dtype = (ovar->sqltype & ~1); /* Drop NULL bit for now. */
switch(dtype)
{
case SQL_TEXT:
ovar->sqldata = (char *)malloc(sizeof(char) * ovar->sqllen);
break;
case SQL_LONG:
ovar->sqldata = (char *)malloc(sizeof(long));
/* Process remaining types. */
. . .
}
if (ovar->sqltype & 1)
{
/* Assign a variable to hold NULL status. */
ovar->sqlind = &null_flag;
}
/* Allocate and fill in the input XSQLDA. This example assumes you know
how many input parameters there are (1), and all other information
necessary to supply a value. If this is not true, you will need to call
isc_dsql_describe_bind(). */
isqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1);
isqlda->version = SQLDA_VERSION1;
isqlda->sqln = 1;
isqlda->sqld = 1;
ivar = isqlda->sqlvar[0];
ivar->sqltype = SQL_TEXT;
ivar->sqllen = sizeof(state);
ivar->sqldata = state;
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
1,
isqlda,
osqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
/* Now process the value returned in osqlda->sqlvar[0]. */
. . .
5HWXUQ9DOXH isc_dsql_execute2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOH
LVFBEDGBWUDQVBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_exec_immed2()isc_dsql_execute_immediate()isc_dsql_execute()
isc_dsql_fetch()isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJWKH;64/'$VHH´8QGHUVWDQGLQJWKH
;64/'$µRQSDJH
254 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_execute_immediate()
3UHSDUHVDQGH[HFXWHVMXVWRQFHD'64/VWDWHPHQWWKDWGRHVQRWUHWXUQGDWD
'HVFULSWLRQ isc_dsql_execute_immediate()SUHSDUHVWKH'64/VWDWHPHQWVSHFLILHGLQVWDWHPHQW
H[HFXWHVLWRQFHDQGGLVFDUGVLW7KHVWDWHPHQWPXVWQRWEHRQHWKDWUHWXUQVGDWD WKDWLVLW
PXVWQRWEHD6(/(&7RU(;(&87(352&('85(VWDWHPHQW
,IVWDWHPHQWUHTXLUHVLQSXWSDUDPHWHUYDOXHV WKDWLVLILWFRQWDLQVSDUDPHWHUPDUNHUV WKHVH
YDOXHVPXVWEHVXSSOLHGLQWKHLQSXW;64/'$[VTOGD
7,3 ,IVWDWHPHQWUHWXUQVGDWDRULILWQHHGVWREHH[HFXWHGPRUHWKDQRQFHXVH
isc_dsql_prepare()DQGisc_dsql_execute() RUisc_dsql_execute2() LQVWHDGRI
isc_dsql_execute_immediate()
Note <RXPXVWFDOOisc_dsql_execute_immediate()IRU&5($7('$7$%$6(DQG6(7
75$16$&7,21\RXFDQQRWSUHSDUHDQGH[HFXWHVXFKVWDWHPHQWVE\FDOOLQJ
isc_dsql_prepare()DQGisc_dsql_execute()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWFDOOVisc_dsql_execute_immediate()
#include <ibase.h>
ISC_STATUS status_vector[20];
char *insert_stmt =
"INSERT INTO CUSTOMER(CUSTNAME, BAL, CUSTNO)
VALUES("John Smith", 299.0, 5050)";
isc_dsql_execute_immediate(
status_vector,
&database_handle, /* Set in previous isc_attach_database() call. */
&tr_handle, /* Set in previous isc_start_transaction() call. */
0,
insert_stmt,
1,
NULL);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_dsql_execute_immediate()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBGEBKDQGOH
LVFBEDGBWUDQVBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_exec_immed2()isc_dsql_execute()isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJWKH;64/'$VHH´8QGHUVWDQGLQJWKH
;64/'$µRQSDJH
256 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_exec_immed2()
3UHSDUHVDQGH[HFXWHVMXVWRQFHD'64/VWDWHPHQWWKDWUHWXUQVQRPRUHWKDQRQHURZRI
GDWD
'HVFULSWLRQ isc_dsql_exec_immed2()SUHSDUHVWKH'64/VWDWHPHQWVSHFLILHGLQVWDWHPHQWH[HFXWHVLW
RQFHDQGGLVFDUGVLWVWDWHPHQWFDQUHWXUQDVLQJOHVHWRIYDOXHV LHLWFDQEHDQ(;(&87(
352&('85(RUVLQJOHWRQ6(/(&7 LQWKHRXWSXW;64/'$
,IVWDWHPHQWUHTXLUHVLQSXWSDUDPHWHUYDOXHV WKDWLVLILWFRQWDLQVSDUDPHWHUPDUNHUV WKHVH
YDOXHVPXVWEHVXSSOLHGLQWKHLQSXW;64/'$LQB[VTOGD
)RUVWDWHPHQWVWKDWUHWXUQPXOWLSOHURZVRIGDWDXVHisc_dsql_prepare()
isc_dsql_execute2()DQGisc_dsql_fetch()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWFDOOVisc_dsql_exec_immed2()
ISC_STATUS status_vector[20];
XSQLDA *in_xsqlda, *out_xsqlda;
char *execute_p1 = "EXECUTE PROCEDURE P1 ?";
/* Set up input and output XSQLDA structures here. */
. . .
isc_dsql_exec_immed2(
status_vector,
&database_handle, /* Set in previous isc_attach_database() call. */
&tr_handle, /* Set in previous isc_start_transaction() call. */
0,
execute_p1,
1,
in_xsqlda,
out_xsqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_dsql_exec_immed2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBGEBKDQGOH
LVFBEDGBWUDQVBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_execute2()isc_dsql_prepare()
)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJWKH;64/'$VHH´8QGHUVWDQGLQJWKH
;64/'$µRQSDJH
258 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_fetch()
5HWULHYHVGDWDUHWXUQHGE\DSUHYLRXVO\SUHSDUHGDQGH[HFXWHG'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_fetch()UHWULHYHVRQHURZRIGDWDLQWR[VTOGDHDFKWLPHLWLVFDOOHG,WLVXVHGLQD
ORRSWRUHWULHYHDQGSURFHVVHDFKURZRIGDWDIRUVWDWHPHQWVWKDWUHWXUQPXOWLSOHURZVLQD
FXUVRU
$FXUVRULVDRQHZD\SRLQWHULQWRWKHRUGHUHGVHWRIURZVUHWULHYHGE\DVWDWHPHQW$FXUVRU
LVRQO\QHHGHGWRSURFHVVSRVLWLRQHG83'$7(DQG'(/(7(VWDWHPHQWVPDGHDJDLQVWWKHURZV
UHWULHYHGE\isc_dsql_fetch()IRU6(/(&7VWDWHPHQWVWKDWVSHFLI\DQRSWLRQDO)2583'$7(
2)FODXVH
,WLVXSWRWKHDSSOLFDWLRQWRSURYLGHWKHORRSFRQVWUXFWIRUIHWFKLQJWKHGDWD
%HIRUHFDOOLQJisc_dsql_fetch()DVWDWHPHQWPXVWEHSUHSDUHGZLWK isc_dsql_prepare()
DQGH[HFXWHGZLWKisc_dsql_execute() RU isc_dsql_execute2()ZLWKD18//RXWSXW
;64/'$DUJXPHQW 6WDWHPHQWH[HFXWLRQSURGXFHVDUHVXOWVHWFRQWDLQLQJWKHGDWDUHWXUQHG
(DFKFDOOWRisc_dsql_fetch()UHWULHYHVWKHQH[WDYDLODEOHURZRIGDWDIURPWKHUHVXOWVHWLQWR
[VTOGD
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDVHTXHQFHRIFDOOVWKDWDOORFDWHVDQRXWSXW
;64/'$SUHSDUHVDVWDWHPHQWIRUH[HFXWLRQDOORFDWHVDQ;64/9$5VWUXFWXUHLQWKH
;64/'$IRUHDFKFROXPQRIGDWDWREHUHWULHYHGH[HFXWHVWKHVWDWHPHQWSURGXFLQJDVHOHFW
OLVWRIUHWXUQHGGDWDWKHQIHWFKHVDQGSURFHVVHVHDFKURZLQDORRS
#include <ibase.h>
#define LASTLEN 20
#define FIRSTLEN 15
#define EXTLEN 4
typedef struct vary {
short vary_length;
char vary_string[1];
} VARY;
ISC_STATUS status_vector[20], retcode;
long SQLCODE;
XSQLDA *osqlda;
XSQLVAR *ovar;
short flag0, flag1, flag2;
char *str =
"SELECT last_name, first_name, phone_ext FROM phone_list
WHERE location = "Monterey" ORDER BY last_name, first_name";
char last_name[LASTLEN + 2];
char first_name[FIRSTLEN + 2];
char phone_ext[EXTLEN + 2];
VARY *vary;
/* Allocate an output XSQLDA osqlda. */
osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(3);
osqlda->version = SQLDA_VERSION1;
osqlda->sqln = 3;
/* Prepare the statement. */
isc_dsql_prepare(
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
0,
str,
1,
osqlda);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
260 INTERBASE 5
USING FUNCTION DEFINITIONS
return(1);
}
/* Set up an output XSQLVAR structure to allocate space for each item to
be returned. */
osqlda->sqlvar[0].sqldata = last_name;
osqlda->sqlvar[0].sqltype = SQL_VARYING + 1;
osqlda->sqlvar[0].sqlind = &flag0;
osqlda->sqlvar[1].sqldata = first_name;
osqlda->sqlvar[1].sqltype = SQL_VARYING + 1;
osqlda->sqlvar[1].sqlind = &flag1;
osqlda->sqlvar[2].sqldata = phone_ext;
osqlda->sqlvar[2].sqltype = SQL_VARYING + 1;
osqlda->sqlvar[2].sqlind = &flag2;
/* Execute the statement. */
isc_dsql_execute(
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
1,
NULL);
if (status_vector[0] == 1 && status_vector[1])
{
/* Process error. */
isc_print_status(status_vector);
return(1);
}
if (retcode != 100L)
{
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
return(1);
}
5HWXUQ9DOXH isc_dsql_fetch()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
7KHYDOXHLQGLFDWHVWKDWQRPRUHURZVUHPDLQWREHUHWULHYHG$Q\RWKHUQRQ]HURYDOXH
LQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXVYHFWRULVVHWWRDQG
WKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHRUDQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_execute()isc_dsql_execute2()isc_dsql_prepare()
isc_dsql_free_statement()
)UHHVDVWDWHPHQWKDQGOHDQGDOOUHVRXUFHVDOORFDWHGIRULWRUFORVHVDFXUVRUDVVRFLDWHGZLWK
WKHVWDWHPHQWUHIHUHQFHGE\DVWDWHPHQWKDQGOH
'HVFULSWLRQ isc_dsql_free_statement()HLWKHUIUHHVDVWDWHPHQWKDQGOHDQGDOOUHVRXUFHVDOORFDWHGIRULW
RSWLRQ '64/BGURS RUFORVHVDFXUVRUDVVRFLDWHGZLWKWKHVWDWHPHQW RSWLRQ
'64/BFORVH
262 INTERBASE 5
USING FUNCTION DEFINITIONS
Note isc_dsql_free_statement()GRHVQRWKLQJLILWLVFDOOHGZLWKDQRSWLRQYDOXHRWKHUWKDQ
'64/BGURSRU'64/BFORVH
4 '64/BFORVH
&DOOisc_dsql_free_statement()ZLWKWKH'64/BFORVHRSWLRQWRFORVHDFXUVRUDIWHULWLVQR
ORQJHUQHHGHGWKDWLVDIWHUIHWFKLQJDQGSURFHVVLQJDOOWKHURZVUHVXOWLQJIURPWKHH[HFXWLRQ
RIDTXHU\$FXUVRUQHHGRQO\EHFORVHGLQWKLVPDQQHULILWZDVSUHYLRXVO\RSHQHGDQG
DVVRFLDWHGZLWKVWPWBKDQGOHE\ isc_dsql_set_cursor_name()
'64/BFORVHFORVHVDFXUVRUEXWWKHVWDWHPHQWLWZDVDVVRFLDWHGZLWKUHPDLQVDYDLODEOHIRU
IXUWKHUH[HFXWLRQ
,I\RXKDYHXVHGDFXUVRUWRSHUIRUPXSGDWHVRUGHOHWHVRQDOOWKHURZVUHWXUQHGIURPWKH
H[HFXWLRQRIDTXHU\DQG\RXZDQWWRSHUIRUPRWKHUXSGDWHRUGHOHWHRSHUDWLRQVRQURZV
UHVXOWLQJIURPH[HFXWLRQRIWKHVDPHVWDWHPHQWDJDLQ SRVVLEO\ZLWKGLIIHUHQWLQSXW
SDUDPHWHUV IROORZWKHVHVWHSV
&ORVHWKHFXUVRUZLWKisc_dsql_free_statement()
5HRSHQLWZLWKisc_dsql_set_cursor_name()
,IGHVLUHGFKDQJHWKHLQSXWSDUDPHWHUVWREHSDVVHGWRWKHVWDWHPHQW
5HH[HFXWHWKHVWDWHPHQWWRUHWULHYHDQHZVHOHFWOLVW
5HWULHYHURZVLQDORRSZLWKisc_dsql_fetch()DQGSURFHVVWKHPDJDLQZLWK
isc_dsql_execute_immediate()
4 '64/BGURS
6WDWHPHQWKDQGOHVDOORFDWHGZLWKisc_dsql_allocate_statement() PXVWEHUHOHDVHGZKHQQR
ORQJHUQHHGHGE\FDOOLQJisc_dsql_free_statement()ZLWKWKH'64/BGURSRSWLRQ7KLV
RSWLRQIUHHVDOOUHVRXUFHVDVVRFLDWHGZLWKWKHVWDWHPHQWKDQGOHDQGFORVHVDQ\RSHQFXUVRUV
DVVRFLDWHGZLWKWKHVWDWHPHQWKDQGOH
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWVKRZVH[DPSOHVRIWKHWZRW\SHVRI
isc_dsql_free_statement()FDOOV,WDVVXPHVWKDWVWPWBKDQGOHDQGVWPWBKDQGOHDUH
VWDWHPHQWKDQGOHVHDFKRIZKLFKZDVSUHYLRXVO\DOORFDWHGZLWKHLWKHU
isc_dsql_allocate_statement()RUisc_dsql_alloc_statement2()$FXUVRULVDOVR
DVVXPHGWRKDYHEHHQDVVRFLDWHGZLWKWKHVWDWHPHQWUHIHUHQFHGE\VWPWBKDQGOH
#include <ibase.h>
ISC_STATUS status_vector[20];
. . .
/* Free the cursor associated with stmt_handle1. */
isc_dsql_free_statement(
status_vector,
&stmt_handle1,
DSQL_close);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
/* Free stmt_handle2. */
isc_dsql_free_statement(
status_vector,
&stmt_handle2,
DSQL_drop);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_dsql_free_statement()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHRUDQRWKHU
,QWHU%DVHHUURUFRGH7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKH
VWDWXVYHFWRUGLUHFWO\)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU
´+DQGOLQJ(UURU&RQGLWLRQVµ
6HH$OVR isc_dsql_allocate_statement()isc_dsql_alloc_statement2()
isc_dsql_set_cursor_name()
264 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_prepare()
3UHSDUHVD'64/VWDWHPHQWIRUUHSHDWHGH[HFXWLRQ
'HVFULSWLRQ isc_dsql_prepare()UHDGLHVWKH'64/VWDWHPHQWVSHFLILHGLQVWDWHPHQWIRUUHSHDWHG
H[HFXWLRQE\FKHFNLQJLWIRUV\QWD[HUURUVDQGSDUVLQJLWLQWRDIRUPDWWKDWFDQEHHIILFLHQWO\
H[HFXWHG$OO6(/(&7VWDWHPHQWVPXVWEHSUHSDUHGZLWKisc_dsql_prepare()
$IWHUDVWDWHPHQWLVSUHSDUHGLWLVDYDLODEOHIRUH[HFXWLRQDVPDQ\WLPHVDVQHFHVVDU\GXULQJ
WKHFXUUHQWVHVVLRQ3UHSDULQJDVWDWHPHQWIRUUHSHDWHGH[HFXWLRQLVPRUHHIILFLHQWWKDQXVLQJ
isc_dsql_execute_immediate()RU isc_dsql_exec_immed2()RYHUDQGRYHUDJDLQWR
SUHSDUHDQGH[HFXWHDVWDWHPHQW
,IDVWDWHPHQWWREHSUHSDUHGGRHVQRWUHWXUQGDWDVHWWKHRXWSXW;64/'$WR18//
2WKHUZLVHWKHRXWSXW;64/'$PXVWEHDOORFDWHGSULRUWRFDOOLQJisc_dsql_prepare()
$OORFDWHWKH;64/'$XVLQJWKHPDFUR;64/'$B/(1*7+GHILQHGLQLEDVHKDVIROORZV
xsqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
;64/'$B/(1*7+FDOFXODWHVWKHQXPEHURIE\WHVUHTXLUHGZKHQQUHVXOWFROXPQVZLOOEH
UHWXUQHGE\WKHVWDWHPHQWDQGDOORFDWHVWKHDSSURSULDWHDPRXQWRIVWRUDJH
$IWHUDOORFDWLQJWKH;64/'$[VTOGDVHW[VTOGD!YHUVLRQWR64/'$B9(56,21DQGVHW
[VTOGDBVTOQWRLQGLFDWHWKHQXPEHURI;64/9$5VWUXFWXUHVDOORFDWHG
:KHQisc_dsql_prepare()LVFDOOHGLWILOOVLQWKHRWKHUILHOGVRIWKH;64/'$DQGDOOWKH
;64/9$5VZLWKLQIRUPDWLRQVXFKDVWKHGDWDW\SHOHQJWKDQGQDPHRIWKHFRUUHVSRQGLQJ
VHOHFWOLVWLWHPVLQWKHVWDWHPHQW,WILOOVLQ[VTOGD!VTOGZLWKWKHDFWXDOQXPEHURIVHOHFWOLVW
LWHPVUHWXUQHG,I[VTOGD!VTOGLVJUHDWHUWKDQ[VTOGD!VTOQWKHQHQRXJKURRPLVQRWDOORFDWHG
DQGWKH;64/'$PXVWEHUHVL]HGE\IROORZLQJWKHVHVWHSV
5HFRUGWKHFXUUHQWYDOXHRIWKH[VTOGD!VTOG
)UHHWKHVWRUDJHSUHYLRXVO\DOORFDWHGIRU[VTOGD
5HDOORFDWHVWRUDJHIRU[VTOGDWKLVWLPHVSHFLI\LQJWKHFRUUHFWQXPEHU IURPVWHS
LQWKHDUJXPHQWWR;64/'$B/(1*7+
5HVHW[VTOGD!VTOGDQG[VTOGD!YHUVLRQ
([HFXWHisc_dsql_describe()WRILOOLQWKH[VTOGDILHOGV
Note ,IWKHSUHSDUHGVWDWHPHQWUHTXLUHVLQSXWSDUDPHWHUYDOXHVWKHQDQLQSXW;64/'$ZLOO
QHHGWREHDOORFDWHGDQGILOOHGLQZLWKDSSURSULDWHYDOXHVSULRUWRFDOOLQJisc_dsql_execute()
RUisc_dsql_execute2()<RXFDQHLWKHUDOORFDWHDQGGLUHFWO\ILOOLQDOOWKHILHOGVRIWKHLQSXW
;64/'$RU\RXFDQDOORFDWHLWFDOOisc_dsql_describe_bind()WRJHWLQIRUPDWLRQUHJDUGLQJ
WKHQXPEHUDQGW\SHVRISDUDPHWHUVUHTXLUHGWKHQILOOLQDSSURSULDWHYDOXHV
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVWKHDOORFDWLRQRIWKHRXWSXW;64/'$DQGDFDOO
WRisc_dsql_prepare()
#include <ibase.h>
ISC_STATUS status_vector[20];
XSQLDA *osqlda;
char *query =
"SELECT CITY, STATE, POPULATION FROM CITIES \
WHERE STATE = "NY" ORDER BY CITY DESCENDING";
266 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_dsql_prepare(
status_vector,
&tr_handle, /* Set in previous isc_start_transaction() call. */
&stmt_handle,
/* Allocated previously by isc_dsql_allocate_statement()
or isc_dsql_alloc_statement2() call. */
0,
query,
1,
osqlda);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
0RUHFRPSOHWHH[DPSOHVVKRZLQJWKHVXEVHTXHQWH[HFXWLRQDQGIHWFKLQJRIUHVXOWGDWDDUH
SURYLGHGLQWKHH[DPSOHSURJUDPVIRUisc_dsql_execute()isc_dsql_execute2()DQG
isc_dsql_fetch()
5HWXUQ9DOXH isc_dsql_prepare()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHLVFBEDGBWUDQVBKDQGOHRU
DQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_describe()isc_dsql_describe_bind()isc_dsql_execute()
isc_dsql_execute2()isc_dsql_fetch()
)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJDQGSRSXODWLQJWKH;64/'$VHH´8QGHUVWDQGLQJWKH
;64/'$µRQSDJH RI&KDSWHU´:RUNLQJZLWK'\QDPLF64/µ
isc_dsql_set_cursor_name()
'HILQHVDFXUVRUQDPHDQGDVVRFLDWHVLWZLWKD'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_set_cursor_name()GHILQHVDFXUVRUQDPHDQGDVVRFLDWHVLWZLWKD'64/
VWDWHPHQWKDQGOHIRUDVWDWHPHQWWKDWUHWXUQVPXOWLSOHURZVRIGDWD IRUH[DPSOH6(/(&7
HIIHFWLYHO\RSHQLQJWKHFXUVRUIRUDFFHVV
$FXUVRULVDRQHZD\SRLQWHULQWRWKHRUGHUHGVHWRIURZVUHWULHYHGE\DVWDWHPHQW$FXUVRU
LVRQO\QHHGHGWRSURFHVVSRVLWLRQHG83'$7(DQG'(/(7(VWDWHPHQWVPDGHDJDLQVWWKHURZV
UHWULHYHGE\isc_dsql_fetch()IRU6(/(&7VWDWHPHQWVWKDWVSHFLI\DQRSWLRQDO)2583'$7(
2)FODXVH
Note ,Q83'$7(RU'(/(7(VWDWHPHQWVWKHFXUVRUQDPHFDQQRWEHVXSSOLHGDVDSDUDPHWHU
PDUNHU "
:KHQDFXUVRULVQRORQJHUQHHGHGFORVHLWZLWKWKH'64/BFORVHRSWLRQRI
isc_dsql_free_statement()
([DPSOH 7KHIROORZLQJSVHXGRFRGHLOOXVWUDWHVWKHFDOOLQJVHTXHQFHQHFHVVDU\WRH[HFXWHDQ83'$7(
RU'(/(7(ZLWKWKH:+(5(&855(172)FODXVHXVLQJDFXUVRUQDPHHVWDEOLVKHGDQG
RSHQHGZLWKisc_dsql_set_cursor_name()
#include <ibase.h>
ISC_STATUS status_vector[20], fetch_stat;
isc_stmt_handle st_handle = NULL;
char *cursor = "S";
268 INTERBASE 5
USING FUNCTION DEFINITIONS
5HWXUQ9DOXH isc_dsql_set_cursor_name()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRLVFBEDGBVWPWBKDQGOHRU
DQRWKHU,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_fetch()isc_dsql_free_statement()
isc_dsql_sql_info()
5HWXUQVUHTXHVWHGLQIRUPDWLRQDERXWDSUHSDUHG'64/VWDWHPHQW
'HVFULSWLRQ isc_dsql_sql_info()UHWXUQVUHTXHVWHGLQIRUPDWLRQDERXWDVWDWHPHQWSUHSDUHGZLWKDFDOO
WRisc_dsql_prepare()7KHPDLQDSSOLFDWLRQQHHGIRUWKLVIXQFWLRQLVWRGHWHUPLQHWKH
VWDWHPHQWW\SHRIDQXQNQRZQSUHSDUHGVWDWHPHQWIRUH[DPSOHDVWDWHPHQWHQWHUHGE\WKH
XVHUDWUXQWLPH
5HTXHVWHGLQIRUPDWLRQFDQLQFOXGHWKH
g 6WDWHPHQWW\SH
270 INTERBASE 5
USING FUNCTION DEFINITIONS
g 1XPEHURILQSXWSDUDPHWHUVUHTXLUHGE\WKHVWDWHPHQW
g 1XPEHURIRXWSXWYDOXHVUHWXUQHGE\WKHVWDWHPHQW
g 'HWDLOHGLQIRUPDWLRQUHJDUGLQJHDFKLQSXWSDUDPHWHURURXWSXWYDOXHLQFOXGLQJLWVGDWDW\SH
VFDOHDQGOHQJWK
([DPSOH 7KHIROORZLQJLOOXVWUDWHVDFDOOWRisc_dsql_sql_info()WRGHWHUPLQHWKHVWDWHPHQWW\SHRI
WKHVWDWHPHQWZKRVHKDQGOHLVUHIHUHQFHGE\VWPW
int statement_type;
int length;
char type_item[] = {isc_info_sql_stmt_type};
char res_buffer[8];
isc_dsql_sql_info(
status_vector,
&stmt,
/* Allocated previously by isc_dsql_allocate_statement() or
isc_dsql_alloc_statement2() call. */
sizeof(type_item),
type_item,
sizeof(res_buffer),
res_buffer);
if (res_buffer[0] == isc_info_sql_stmt_type)
{
length = isc_vax_integer(buffer[1], 2);
statement_type = isc_vax_integer(buffer[3], length);
}
5HWXUQ9DOXH isc_dsql_sql_info()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_dsql_describe_bind()isc_dsql_describe()isc_vax_integer()
)RUPRUHLQIRUPDWLRQDERXWGHWHUPLQLQJXQNQRZQVWDWHPHQWW\SHVDWUXQWLPHVHH
´'HWHUPLQLQJDQXQNQRZQVWDWHPHQWW\SHDWUXQWLPHµRQSDJH RI&KDSWHU´:RUNLQJ
ZLWK'\QDPLF64/µ
isc_encode_date()
7UDQVODWHVDGDWHIURPWKH&WPIRUPDWWR,QWHU%DVH,6&B48$'IRUPDWSULRUWRLQVHUWLQJRU
XSGDWLQJD'$7(YDOXHLQDWDEOH
'HVFULSWLRQ isc_encode_date()WUDQVODWHVDGDWHLQD&WLPHVWUXFWXUHLQWRDQ,6&B48$'IRUPDWLQWHUQDO
WR,QWHU%DVH7KLVFDOOLVXVHGSULRUWRZULWLQJ'$7(GDWDWRDWDEOHWRJXDUDQWHHWKDWWKHGDWH
LVLQDIRUPDWUHFRJQL]HGE\,QWHU%DVH
8VHWKHisc_dsqlIDPLO\RI$3,FDOOVWRLQVHUWRUXSGDWH'$7(GDWDIURPWKH,6&B48$'
VWUXFWXUHLQDWDEOH
([DPSOH 7KHIROORZLQJFRGHIUDJPHQWLOOXVWUDWHVGHFODULQJWLPHVWUXFWXUHVDQGFDOOLQJ
isc_encode_date()WRWUDQVODWHD&WLPHIRUPDWLQWRDQ,QWHU%DVHGDWHIRUPDWSULRUWR
LQVHUWLQJRUXSGDWLQJDWDEOH
#include <time.h>
#include <ibase.h>
. . .
struct tm hire_time;
ISC_QUAD hire_date;
. . .
/* Store date info into the tm struct here. */
. . .
isc_encode_date(&hire_time, &hire_date);
/* Now use a DSQL INSERT or UPDATE statement to move the date into a DATE
column. */
5HWXUQ9DOXH 1RQH
6HH$OVR isc_decode_date()
272 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_event_block()
$OORFDWHVWZRHYHQWSDUDPHWHUEXIIHUV (3%V IRUVXEVHTXHQWXVHZLWKRWKHU$3,HYHQWFDOOV
'HVFULSWLRQ isc_event_block()PXVWEHFDOOHGEHIRUHDQ\RWKHUHYHQWIXQFWLRQV,W
g $OORFDWHVWZRHYHQWSDUDPHWHUEXIIHUVRIWKHVDPHVL]HDQGVWRUHVWKHLUDGGUHVVHVLQWRWKH
FKDUDFWHUSRLQWHUVDGGUHVVHGE\HYHQWBEXIIHUDQGUHVXOWBEXIIHU
g 6WRUHVLQWRWKHEXIIHUUHIHUHQFHGE\HYHQWBEXIIHUWKHQDPHVDQGHYHQWFRXQWVIRUHDFKRIWKH
VSHFLILHGHYHQWV7KHQDPHVDUHWKHRQHVWKDWDSSHDUDVWKHILQDODUJXPHQWVWR
isc_event_block()7KHHYHQWFRXQWVDUHLQLWLDOL]HGWR]HURDQGDUHXVHGWRVSHFLI\KRZ
PDQ\WLPHVHDFKHYHQWKDVEHHQSRVWHGSULRUWRHDFKZDLWIRUHYHQWVWRRFFXU
g 5HWXUQVWKHOHQJWKLQE\WHVRIWKHEXIIHUV
7KHEXIIHUVDQGWKHLUOHQJWKVDUHXVHGLQVXEVHTXHQWFDOOVWRWKHIXQFWLRQV
isc_wait_for_event()isc_que_events()DQGisc_event_counts()HYHQWBEXIIHULVXVHGWR
LQGLFDWHWKHHYHQWVRILQWHUHVWDQGWRKROGWKHFRXQWVLQHIIHFWEHIRUHDZDLWIRURQHRIWKH
HYHQWV$IWHUDQHYHQWLVSRVWHGUHVXOWBEXIIHULVILOOHGLQH[DFWO\DVHYHQWBEXIIHUH[FHSWWKDWWKH
HYHQWFRXQWVDUHXSGDWHGisc_event_counts()LVWKHQFDOOHGWRGHWHUPLQHZKLFKHYHQWVZHUH
SRVWHGEHWZHHQWKHWLPHWKHFRXQWVZHUHVHWLQHYHQWBEXIIHUDQGWKHWLPHWKHFRXQWVDUHVHWLQ
UHVXOWBEXIIHU
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDFDOOWRisc_event_block()
#define number_of_stocks 3;
length = isc_event_block(
&event_buffer,
&result_buffer,
number_of_stocks,
"DEC", "HP", "SUN");
5HWXUQ9DOXH isc_event_block()UHWXUQVDQXPEHUWKDWLVWKHVL]HLQE\WHVRIHDFKHYHQWSDUDPHWHU
EXIIHULWDOORFDWHV
6HH$OVR isc_event_counts()isc_que_events()isc_wait_for_event()
isc_event_counts()
&RPSDUHVHYHQWSDUDPHWHUEXIIHUV (3%V WRGHWHUPLQHZKLFKHYHQWVKDYHEHHQSRVWHGDQG
SUHSDUHVWKHHYHQWSDUDPHWHUEXIIHUVIRUWKHQH[WFDOOWRisc_que_events()RU
isc_wait_for_event()
274 INTERBASE 5
USING FUNCTION DEFINITIONS
'HVFULSWLRQ isc_event_counts()FRPSDUHVWKHHYHQWFRXQWVLQWKHHYHQWSDUDPHWHUEXIIHUVHYHQWBEXIIHU
DQGUHVXOWBEXIIHUDQGVHWVXSWRWKHILUVWHOHPHQWVRIVWDWXVBDUUD\WRFRQWDLQWKHGLIIHUHQFHV
,WWKHQPRGLILHVHYHQWBEXIIHUWRFRQWDLQWKHVDPHHYHQWFRXQWVDVUHVXOWBEXIIHULQSUHSDUDWLRQ
IRUWKHQH[WFDOOWRHLWKHUisc_wait_for_event() RU isc_que_events()
7KHFRXQWVLQHYHQWBEXIIHUVSHFLI\KRZPDQ\WLPHVHDFKHYHQWKDGEHHQSRVWHGVLQFHWKH
SUHYLRXVFDOOWRisc_event_wait() RU isc_que_events()7KHFRXQWVLQU HVXOWBEXIIHUHTXDOWKH
YDOXHVLQHYHQWBEXIIHUSOXVWKHQXPEHURIDGGLWLRQDOWLPHVDQHYHQWLVSRVWHGDIWHUWKHFXUUHQW
FDOOWRisc_event_wait()RUisc_que_events(),IDQHYHQWLVSRVWHGDIWHUDFDOOWRHLWKHURI
WKHVHIXQFWLRQVLWVFRXQWLVJUHDWHULQUHVXOWBEXIIHUWKDQLQHYHQWBEXIIHU2WKHUHYHQWFRXQWVPD\
DOVREHJUHDWHUEHFDXVHDQHYHQWPD\KDYHEHHQSRVWHGEHWZHHQFDOOVWRHLWKHURIWKHVH
IXQFWLRQV7KHYDOXHVLQVWDWXVBDUUD\DUHWKHGLIIHUHQFHVLQYDOXHVEHWZHHQHYHQWBEXIIHUDQG
UHVXOWBEXIIHU7KLVPHFKDQLVPRIFRPSDULQJDOOWKHFRXQWVHQVXUHVWKDWQRHYHQWSRVWLQJVDUH
PLVVHG
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVWKHVHWXSDQGZDLWLQJRQDQ\RIWKHHYHQWV
QDPHG´'(&µ´+3µRU´681µWKHQFDOOLQJisc_event_counts()WRGHWHUPLQHZKLFK
HYHQWVKDYHEHHQSRVWHG
#include <ibase.h>
#define number_of_stocks 3;
length = isc_event_block(
&event_buffer,
&result_buffer,
number_of_stocks,
"DEC", "HP", "SUN");
isc_wait_for_event(
status_vector,
&database_handle, /* Set by previous isc_attach_database(). */
length, /* Returned from isc_event_block(). */
event_buffer,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
isc_event_counts(
status_vector,
(short) length,
event_buffer,
result_buffer);
5HWXUQ9DOXH 1RQH
6HH$OVR isc_que_events()isc_wait_for_event()
isc_expand_dpb()
'\QDPLFDOO\EXLOGVRUH[SDQGVDGDWDEDVHSDUDPHWHUEXIIHU '3% WRLQFOXGHGDWDEDVH
SDUDPHWHUV
276 INTERBASE 5
USING FUNCTION DEFINITIONS
'HVFULSWLRQ isc_expand_dpb()EXLOGVRUH[SDQGVD'3%G\QDPLFDOO\,WVPDLQXVHLVWRVLPSOLI\WKH
EXLOGLQJRIWKH'3%SULRUWRDFDOOWRisc_attach_database()RUWRDOORZDQHQGXVHUWR
VXSSO\DXVHUQDPHDQGSDVVZRUGFRPELQDWLRQDWUXQWLPH,QPDQ\FDVHVWKH'3%PXVWEH
FRQVWUXFWHGSURJUDPPDWLFDOO\EXWisc_expand_dpb()HQDEOHVDQDSSOLFDWLRQWRSDVVXVHU
QDPHVSDVVZRUGPHVVDJHILOHDQGFKDUDFWHUVHWSDUDPHWHUVWRWKHIXQFWLRQZKLFKWKHQ
DGGVWKHPWRDQH[LVWLQJ'3%
$SRLQWHUWRDSUHYLRXVO\DOORFDWHGDQGLQLWLDOL]HG'3%PXVWEHSDVVHGWR isc_expand_dpb()
DORQJZLWKDSRLQWHUWRDYDULDEOHFRQWDLQLQJWKHFXUUHQWVL]HRIWKH'3%ZKHQWKLVIXQFWLRQ
LVFDOOHG,IWKHVSDFHDOORFDWHGIRUWKH'3%LVQRWODUJHHQRXJKIRUWKHSDUDPHWHUVSDVVHGWR
isc_expand_dpb()WKHQWKHIXQFWLRQUHDOORFDWHVDODUJHU'3%SUHVHUYLQJLWVFXUUHQW
FRQWHQWVDQGDGGVWKHQHZSDUDPHWHUV
7RHQVXUHSURSHUPHPRU\PDQDJHPHQWDSSOLFDWLRQVWKDWFDOOisc_expand_dpb()VKRXOG
DOZD\VDOORFDWH'3%VODUJHHQRXJKWRKROGDOODQWLFLSDWHGSDUDPHWHUV
([DPSOH 7KHIROORZLQJFRGHFDOOVisc_expand_dpb()WRFUHDWHD'3%WKHQDWWDFKHVWRDGDWDEDVH
XVLQJWKHQHZO\FUHDWHG'3%XVHUBQDPHDQGXVHUBSDVVZRUGDUHDVVXPHGWREHYDULDEOHVZKRVH
YDOXHVKDYHEHHQILOOHGLQIRUH[DPSOHDIWHUDVNLQJWKHXVHUWRVSHFLI\WKHQDPHDQG
SDVVZRUGWREHXVHG
#include <ibase.h>
char *dpb;
ISC_STATUS status_vector[20];
isc_db_handle handle = NULL;
short dpb_length;
isc_attach_database(
status_vector,
0,
"employee.db",
&handle,
dpb_length,
dpb_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
/* An error occurred. */
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH 1RQH
6HH$OVR isc_attach_database()
isc_get_segment()
5HDGVDVHJPHQWIURPDQRSHQ%ORE
278 INTERBASE 5
USING FUNCTION DEFINITIONS
,I%OREILOWHUVDUHVSHFLILHGZKHQD%ORELVRSHQHGWKHQHDFKVHJPHQWUHWULHYHGE\
isc_get_segment()LVILOWHUHGRQUHDG
Note %OREILOWHUVDUHQRWVXSSRUWHGRQ1HW:DUH
<RXFDQUHDGELWPDSVDQGRWKHUELQDU\ILOHVGLUHFWO\ZLWKRXWILOWHULQJXQOHVV\RXLQWHQGWR
FKDQJHIURPRQHIRUPDWWRDQRWKHUVD\IURP *(0WR%03<RXFDQDOVRVWRUHFRPSUHVVHG
ELWPDSVGLUHFWO\LQDGDWDEDVHLQIRUPDWVVXFKDV-3* -3(* %03 :LQGRZVQDWLYH
ELWPDSV RU*,) &RPSX6HUYH*UDSKLF,QWHUFKDQJH)RUPDW 1RILOWHULQJLVUHTXLUHG
<RXFDQVWRUHELWPDSVLQDGDWDEDVHLQURZPDMRURUFROXPQPDMRURUGHU
,IWKHEXIIHULVQRWODUJHHQRXJKWRKROGWKHHQWLUHFXUUHQWVHJPHQWWKHIXQFWLRQUHWXUQV
LVFBVHJPHQWDQGWKHQH[WFDOOWRisc_get_segment()JHWVWKHQH[WFKXQNRIWKHRYHUVL]HG
VHJPHQWUDWKHUWKDQJHWWLQJWKHQH[WVHJPHQW
:KHQisc_get_segment()UHDGVWKHODVWVHJPHQWRIWKH%OREWKHIXQFWLRQUHWXUQVWKHFRGH
LVFBVHJVWUBHRI
)RUPRUHLQIRUPDWLRQDERXWUHDGLQJGDWDIURPD%OREVHH&KDSWHU´:RUNLQJZLWK%ORE
'DWDµ
([DPSOH 7KHIROORZLQJFDOOJHWVDVHJPHQWIURPRQH%OREDQGZULWHVLWWRDQRWKHU
get_status = isc_get_segment(status, &from_blob, &seg_len, 80, buffer);
if (status[0] == 1 && status[1])
{
isc_print_status(status);
return(1);
}
if (get_status != isc_segstr_eof)
write_status = isc_put_segment(status, &to_blob, seg_len, buffer);
if (status[0] == 1 && status[1])
{
isc_print_status(status);
return(1);
}
5HWXUQ9DOXH isc_get_segment()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
LVFBVHJPHQWLQGLFDWHVWKHEXIIHULVQRWODUJHHQRXJKWRKROGWKHHQWLUHFXUUHQWVHJPHQWWKH
QH[WFDOOWRisc_get_segment()JHWVWKHQH[WFKXQNRIWKHRYHUVL]HGVHJPHQWUDWKHUWKDQ
JHWWLQJWKHQH[WVHJPHQWLVFBVHJVWUBHRILQGLFDWHVWKDWWKHODVWVHJPHQWRIWKH%OREKDVEHHQ
UHDG$Q\RWKHUQRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRI
WKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_create_blob2()isc_open_blob2()isc_put_segment()
isc_interprete()
([WUDFWVWKHWH[WIRUDQ,QWHU%DVHHUURUPHVVDJHIURPWKHHUURUVWDWXVYHFWRUWRDXVHUGHILQHG
EXIIHU
'HVFULSWLRQ *LYHQERWKWKHORFDWLRQRIDVWRUDJHEXIIHUDOORFDWHGLQDSURJUDPDQGWKHDGGUHVVRIWKH
VWDWXVYHFWRUisc_interprete()EXLOGVDQHUURUPHVVDJHVWULQJIURPWKHLQIRUPDWLRQLQWKH
VWDWXVYHFWRUSXWVWKHIRUPDWWHGVWULQJLQWKHEXIIHUZKHUHWKHSURJUDPFDQPDQLSXODWHLW
DQGDGYDQFHVWKHVWDWXVYHFWRUSRLQWHUWRWKHVWDUWRIWKHQH[WFOXVWHURIHUURUPHVVDJH
LQIRUPDWLRQ)RUH[DPSOH\RXPLJKWGHFODUHDQHUURUVWULQJEXIIHUFDOOisc_interprete()WR
UHWULHYHWKHILUVWHUURUPHVVDJHDQGLQVHUWWKHPHVVDJHLQWRWKHEXIIHUZULWHWKHEXIIHUWRD
ORJILOHWKHQSHHNDWWKHQH[WFOXVWHUWRVHHLILWFRQWDLQVPRUHHUURULQIRUPDWLRQ
isc_interprete()UHWULHYHVDQGIRUPDWVDVLQJOHPHVVDJHHDFKWLPHLWLVFDOOHG:KHQDQHUURU
RFFXUVKRZHYHUWKHVWDWXVYHFWRUXVXDOO\FRQWDLQVPRUHWKDQRQHHUURUPHVVDJH7RUHWULHYH
DOOUHOHYDQWHUURUPHVVDJHV\RXPXVWPDNHUHSHDWHGFDOOVWRisc_interprete()XQWLOQRPRUH
PHVVDJHVDUHUHWXUQHG
Note 'RQRWSDVVWKHDGGUHVVRIWKHVWDWXVYHFWRUGLUHFWO\EHFDXVHHDFKWLPH
isc_interprete()LVFDOOHGLWPRGLILHVWKHSRLQWHUWRWKHVWDWXVYHFWRUWRSRLQWWRWKHVWDUWRI
WKHQH[WDYDLODEOHPHVVDJH
7RGLVSOD\DOOHUURUPHVVDJHVRQWKHVFUHHQLQVWHDGRIWRDEXIIHUXVHisc_print_status()
([DPSOH 7KHIROORZLQJFRGHGHFODUHVDPHVVDJHEXIIHUDVWDWXVYHFWRUDQGDSRLQWHUWRWKHYHFWRU
WKHQLOOXVWUDWHVKRZUHSHDWHGFDOOVDUHPDGHWRisc_interprete()WRVWRUHDOOPHVVDJHVLQWKH
EXIIHU
280 INTERBASE 5
USING FUNCTION DEFINITIONS
#include <ibase.h>
char msg[512];
ISC_STATUS status_vector[20];
long *pvector; /* Pointer to pointer to status vector. */
FILE *efile; /* Code fragment assumes this points to an open file. */
. . .
pvector = status_vector; /* (Re)set to start of status vector. */
isc_interprete(msg, &pvector); /* Retrieve first message. */
fprintf(efile, "%s\n", msg); /* Write buffer to log file. */
msg[0] = ’-’; /* Append leading hyphen to secondary messages. */
while(isc_interprete(msg + 1,&pvector)) /* More messages? */
{
fprintf(efile, "%s\n", msg); /* If so, write them, too. */
}
fclose(efile);
. . .
5HWXUQ9DOXH ,IVXFFHVVIXOisc_interprete()UHWXUQVWKHOHQJWKRIWKHHUURUPHVVDJHVWULQJLWVWRUHVLQ
EXIIHU,WDOVRDGYDQFHVWKHVWDWXVYHFWRUSRLQWHUWRWKHVWDUWRIWKHQH[WFOXVWHURIHUURU
PHVVDJHLQIRUPDWLRQ
,IWKHUHDUHQRPRUHPHVVDJHVLQWKHVWDWXVYHFWRURULI isc_interprete()FDQQRWLQWHUSUHWWKH
QH[WPHVVDJHLWUHWXUQV
6HH$OVR isc_print_sqlerror()isc_print_status()isc_sqlcode()isc_sql_interprete()
isc_modify_user( )
0RGLILHVDXVHUUHFRUGIURPWKHSDVVZRUGGDWDEDVHLVFJGE
'HVFULSWLRQ 7KHWKUHHVHFXULW\IXQFWLRQVisc_add_user()isc_delete_user()DQGisc_modify_user()
PLUURUIXQFWLRQDOLW\WKDWLVDYDLODEOHLQWKHgsecFRPPDQGOLQHXWLOLW\isc_modify_user()
PRGLILHVDUHFRUGIURPLVFJGE,QWHU%DVH·VSDVVZRUGGDWDEDVH
$WDPLQLPXP\RXPXVWSURYLGHWKHXVHUQDPH$Q\DGGLWLRQDOXVHULQIRUPDWLRQWKDW\RX
VXSSO\VXFKDVILUVWQDPHODVWQDPHRUSDVVZRUGRYHUZULWHVWKHLQIRUPDWLRQWKDWLVDOUHDG\
LQLVFJGE
,IWKHVHUYHULVQRWORFDO\RXPXVWSURYLGHERWKDVHUYHUQDPHDQGDSURWRFRO9DOLGFKRLFHV
IRUWKHSURWRFROILHOGDUHVHFBSURWRFROBWFSLSVHFBSURWRFROBQHWEHXLVHFBSURWRFROBVS[DQG
VHFBSURWRFROBORFDO
,QWHU%DVHUHDGVWKHVHWWLQJVIRUWKH,6&B86(5DQG,6&B3$66:25'HQYLURQPHQWYDULDEOHVLI
\RXGRQRWSURYLGHD'%$XVHUQDPHDQGSDVVZRUG
7KHGHILQLWLRQIRUWKH86(5B6(&B'$7$VWUXFWLQLEDVHKLVDVIROORZV
typedef struct {
short sec_flags; /* which fields are specified */
int uid; /* the user’s id */
int gid; /* the user’s group id */
int protocol; /* protocol to use for connection */
char *server; /* server to administer */
char *user_name; /* the user’s name */
char *password; /* the user’s password */
char *group_name; /* the group name */
char *first_name; /* the user’s first name */
char *middle_name; /* the user’s middle name */
char *last_name; /* the user’s last name */
char *dba_user_name; /* the dba user name */
282 INTERBASE 5
USING FUNCTION DEFINITIONS
:KHQ\RXSDVVWKLVVWUXFWWRRQHRIWKHWKUHHVHFXULW\IXQFWLRQV\RXFDQWHOOLWZKLFKILHOGV
\RXKDYHVSHFLILHGE\GRLQJDELWZLVH25RIWKHIROORZLQJYDOXHVZKLFKDUHGHILQHGLQLEDVHK
sec_uid_spec 0x01
sec_gid_spec 0x02
sec_server_spec 0x04
sec_password_spec 0x08
sec_group_name_spec 0x10
sec_first_name_spec 0x20
sec_middle_name_spec 0x40
sec_last_name_spec 0x80
sec_dba_user_name_spec 0x100
sec_dba_password_spec 0x200
1RELWYDOXHVDUHDYDLODEOHIRUXVHUQDPHDQGSDVVZRUGVLQFHWKH\DUHUHTXLUHG
7KHIROORZLQJHUURUPHVVDJHVH[LVWIRUWKLVIXQFWLRQ
([DPSOH 7KHIROORZLQJH[DPSOHPRGLILHVLVFJGEWRFKDQJHWKHSDVVZRUGIRUWKHXVHU6RFNVXVLQJ
WKHELWZLVH25WHFKQLTXHIRUSDVVLQJYDOXHVIURPWKH86(5B6(&B'$7$VWUXFW
{
ISC_STATUS status[20];
USER_SEC_DATA sec;
sec.server = "kennel";
sec.dba_user_name = "sysdba";
sec.dba_password = "masterkey";
sec.protocol = sec_protocol_tcpip;
sec.user_name = "socks";
sec.password = "feed_me!"; /* Note: do not hardcode passwords */
sec.sec_flags = sec_server_spec
| sec_password_spec
| sec_dba_user_name_spec
| sec_dba_password_spec;
isc_add_user(status, &sec);
/* check status for errors */
if (status[0] == 1 && status[1])
{
switch (status[1]) {
case isc_usrname_too_long:
printf("Security database cannot accept long user names\n");
break;
...
}
}
}
5HWXUQ9DOXH isc_modify_user()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU6HHWKH´'HVFULSWLRQµVHFWLRQIRUWKLVIXQFWLRQIRUDOLVW
RIHUURUFRGHV)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU
´+DQGOLQJ(UURU&RQGLWLRQVµ
6HH$OVR isc_add_user()isc_delete_user()
284 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_open_blob2()
2SHQVDQH[LVWLQJ%OREIRUUHWULHYDODQGRSWLRQDOILOWHULQJ
7KHEOREBLGLGHQWLILHVZKLFKSDUWLFXODU%ORELVWREHRSHQHG7KLVEOREBLGLVVHWE\DVHTXHQFH
RI'64/IXQFWLRQFDOOV
2QVXFFHVVisc_open_blob2()DVVLJQVDXQLTXH,'WREOREBKDQGOH6XEVHTXHQW$3,FDOOVXVH
WKLVKDQGOHWRLGHQWLI\WKH%OREDJDLQVWZKLFKWKH\RSHUDWH
$IWHUDEORELVRSHQHGLWVGDWDFDQEHUHDGE\DVHTXHQFHRIFDOOVWRisc_get_segment()
:KHQILQLVKHGDFFHVVLQJWKH%OREFORVHLWZLWKisc_close_blob()
)RUPRUHLQIRUPDWLRQDERXWRSHQLQJD%OREIRUUHWULHYDODQGRSWLRQDOILOWHULQJVHH&KDSWHU
´:RUNLQJZLWK%ORE'DWDµ
([DPSOH 7KHIROORZLQJIUDJPHQWLVH[FHUSWHGIURPWKHH[DPSOHILOHDSLF7KHH[DPSOHSURJUDP
GLVSOD\VMREGHVFULSWLRQVWKDWDUHSDVVHGWKURXJKDILOWHU
while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
{
printf("\nJOB CODE: %5s GRADE: %d", job_code, job_grade);
printf(" COUNTRY: %-20s\n\n", job_country);
/* Open the blob with the fetched blob_id. */
isc_open_blob2(status, &DB, &trans, &blob_handle, &blob_id, 9, bpb);
if (status[0] == 1 && status[1])
{
isc_print_status(status);
return(1);
}
}
5HWXUQ9DOXH isc_open_blob2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_close_blob()
286 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_prepare_transaction()
([HFXWHVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWDJDLQVWPXOWLSOHGDWDEDVHV
'HVFULSWLRQ isc_prepare_transaction()LQLWLDWHVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWXQGHUSURJUDP
GLUHFWLRQ,WDOHUWV,QWHU%DVHZKLFKSROOVDOOGDWDEDVHSDUWLFLSDQWVDQGZDLWVIRUUHSOLHV7KH
isc_prepare_transaction()IXQFWLRQSXWVWKHWUDQVDFWLRQLQOLPER
%HFDXVHDFDOOWRWKLVIXQFWLRQLQGLFDWHVWKDW\RXLQWHQGWRFRQWURODOOSKDVHVRIWKHFRPPLW
\RXPXVWFRPSOHWHWKHVHFRQGSKDVHRIWKHFRPPLWE\H[SOLFLWO\FDOOLQJWKH
isc_commit_transaction()IXQFWLRQ
,IDFDOOWRisc_prepare_transaction()IDLOVWKHDSSOLFDWLRQVKRXOGUROOEDFNWKHWUDQVDFWLRQ
ZLWKDFDOOWR WKH isc_rollback_transaction()IXQFWLRQ
Note ,I\RXZDQW,QWHU%DVHWRDXWRPDWLFDOO\SHUIRUPWKHWZRSKDVHFRPPLWFDOO
isc_commit_transaction()ZLWKRXWFDOOLQJisc_prepare_transaction()
([DPSOH 7KHIROORZLQJH[DPSOHH[HFXWHVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWDQGLQFOXGHVD
UROOEDFNLQFDVHRIIDLOXUH
isc_prepare_transaction(status_vector, &trans);
if (status_vector[0] == 1 && status_vector[1])
rb_status = isc_rollback_transaction(status_vector, &trans)
else
{
isc_commit_transaction(status_vector, &trans);
if (!(status_vector[0] == 1 && status_vector[1]))
fprintf("Commit successful.");
}
5HWXUQ9DOXH isc_prepare_transaction()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()
isc_prepare_transaction2()
isc_rollback_transaction()
isc_prepare_transaction2()
3HUIRUPVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWIRUPXOWLGDWDEDVHWUDQVDFWLRQV
'HVFULSWLRQ isc_prepare_transaction2()SHUIRUPVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWMXVWDV
isc_prepare_transaction()GRHVEXWisc_prepare_transaction2()H[SHFWV\RXWRSURYLGH
WZRDGGLWLRQDODUJXPHQWV
g $QLQIRUPDWLRQPHVVDJHWRZULWHWRWKH5'%75$16$&7,21B'(6&5,37,21FROXPQLQWKH
5'%75$16$&7,216V\VWHPWDEOHWKDWGHVFULEHVWKHWUDQVDFWLRQWRFRPPLWVRWKDWUHFRYHU\
LVSRVVLEOHLQWKHHYHQWDV\VWHPFUDVKRFFXUVGXULQJWKHFRPSOHWLRQRIWKHFRPPLW
g 7KHOHQJWKLQE\WHVRIWKHLQIRUPDWLRQPHVVDJH
288 INTERBASE 5
USING FUNCTION DEFINITIONS
%\HOHFWLQJWRXVH isc_prepare_transaction2()\RXDUHLQHIIHFWGLVDEOLQJWKHDXWRPDWLF
UHFRYHU\IXQFWLRQVLQKHUHQWLQWKHWZRSKDVHFRPPLW,WLV\RXUUHVSRQVLELOLW\WRGHDOZLWK
UHFRYHU\LVVXHVWKDWPLJKWRFFXUGXULQJIDLOXUHRIWKHWZRSKDVHFRPPLW1RUPDOO\,QWHU%DVH
DXWRPDWLFDOO\ZULWHVWRWKH5'%75$16$&7,21B'(6&5,37,21FROXPQLQWKH
5'%75$16$&7,216V\VWHPWDEOHLQIRUPDWLRQWKDWPDNHVLWSRVVLEOHWRUHFRQQHFWIROORZLQJ
DV\VWHPFUDVKGXULQJWKHFRPPLW<RXFDQPDQXDOO\ZULWHDPHVVDJHVWULQJLQWR
5'%75$16$&7,216E\XVLQJWKHPHVVDJHSDUDPHWHULQWKLVIXQFWLRQ
$WWKHULVNRISUHYHQWLQJUHFRYHU\LQWKHHYHQWRIDV\VWHPFUDVK\RXPLJKWFKRRVHWRDYRLG
ZULWLQJDPHVVDJHWR5'%75$16$&7,21DOWRJHWKHULI\RXGHWHUPLQHWKDWWKHUHLVWRRPXFK
RYHUKHDGDVVRFLDWHGZLWKWKLVH[WUDDFWLRQHYHU\WLPH\RXUDSSOLFDWLRQFRPPLWV
([DPSOH 7KHIROORZLQJH[DPSOHH[HFXWHVWKHILUVWSKDVHRIDWZRSKDVHFRPPLWDQGLQFOXGHVD
UROOEDFNLQFDVHRIIDLOXUH
isc_prepare_transaction2(status_vector, &trans, msg_len, msg);
if (status_vector[0] == 1 && status_vector[1])
rb_status = isc_rollback_transaction(status_vector, &trans);
5HWXUQ9DOXH isc_prepare_transaction2()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HUR
LQGLFDWHVVXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQW
RIWKHVWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()
isc_prepare_transaction()
isc_rollback_transaction()
isc_print_sqlerror()
'LVSOD\VDQ64/&2'(YDOXHDFRUUHVSRQGLQJ64/HUURUPHVVDJHDQGDQ\DGGLWLRQDO
,QWHU%DVHHUURUPHVVDJHVLQWKHHUURUVWDWXVYHFWRU
'HVFULSWLRQ 'XULQJWKHSURFHVVLQJRI'64/$3,FDOOV64/HUURUVFDQRFFXU64/HUURUVDUHJHQHUDOO\
UHSRUWHGLQDYDULDEOHFDOOHG64/&2'('64/FDOOVUHWXUQHUURULQIRUPDWLRQWRD
XVHUGHILQHGHUURUVWDWXVYHFWRUOLNHDQ\RWKHU$3,FDOOEXWisc_print_sqlerror()FDQEH
XVHGWRLQWHUSUHWWKHSULPDU\HUURUFRQGLWLRQDVDQ64/HUURUPHVVDJHIRUGLUHFWGLVSOD\RQ
WKHVFUHHQ7RXVHisc_print_sqlerror()DQDSSOLFDWLRQPXVWGHFODUHERWKDQ64/&2'(
YDULDEOHIRUKROGLQJWKH64/HUURUQXPEHUDQGDQHUURUVWDWXVYHFWRUIRUKROGLQJ,QWHU%DVH
HUURULQIRUPDWLRQisc_print_sqlerror()GLVSOD\VWKH64/&2'(YDOXHDUHODWHG64/HUURU
PHVVDJHDQGDQ\DGGLWLRQDO,QWHU%DVHHUURUPHVVDJHVLQWKHVWDWXVDUUD\
Note 6RPHZLQGRZLQJV\VWHPVGRQRWSHUPLWGLUHFWVFUHHQZULWHV'RQRWXVH
isc_print_sqlerror()ZKHQGHYHORSLQJDSSOLFDWLRQVIRUWKHVHHQYLURQPHQWV,QVWHDGXVH
isc_sql_interprete()DQGisc_interprete()WRFDSWXUHPHVVDJHVWRDEXIIHUIRUGLVSOD\
([DPSOH 7KHIROORZLQJFRGHFDOOVisc_print_sqlerror()ZKHQDQHUURURFFXUV
#include <ibase.h>
long SQLCODE;
ISC_STATUS status_vector[20];
. . .
if (status_vector[0] == 1 && status_vector[1])
{
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
}
5HWXUQ9DOXH 1RQH
6HH$OVR isc_interprete()isc_print_status()isc_sql_interprete()isc_sqlcode()
isc_print_status()
%XLOGVDQGGLVSOD\VHUURUPHVVDJHVEDVHGRQWKHFRQWHQWVRIWKH,QWHU%DVHHUURUVWDWXVYHFWRU
'HVFULSWLRQ isc_print_status()EXLOGVDOOHUURUPHVVDJHVEDVHGRQWKHFRQWHQWVRIWKHHUURUVWDWXV
YHFWRUDQGGLVSOD\VWKHPRQWKHVFUHHQVWDWXVBYHFWRUPXVWEHGHFODUHGLQWKHSURJUDPDVDQ
DUUD\RIWZHQW\HOHPHQWV
290 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJFRGHGLVSOD\VHUURUPHVVDJHVZKHQDQHUURURFFXUVGXULQJSURFHVVLQJ
#include <ibase.h>
ISC_STATUS status_vector[20];
. . .
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
return(1);
}
5HWXUQ9DOXH isc_print_status()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_interprete()isc_print_sqlerror()isc_sqlcode()isc_sql_interprete()
isc_put_segment()
:ULWHVD%OREVHJPHQW
([DPSOH 7KHIROORZLQJH[DPSOHUHDGVDVHJPHQWRIRQH%OREDQGZULWHVLWWRDQRWKHU%ORE
get_status = isc_get_segment(status, &from_blob, &seg_len, 80, buffer);
if (status[0] == 1 && status[1])
{
isc_print_status(status);
return(1);
}
if (get_status != isc_segstr_eof)
write_status = isc_put_segment(status, &to_blob, seg_len, buffer);
if (status[0] == 1 && status[1])
{
isc_print_status(status);
return(1);
292 INTERBASE 5
USING FUNCTION DEFINITIONS
5HWXUQ9DOXH isc_put_segment()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV
$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXV
YHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_close_blob()isc_get_segment()isc_open_blob2()
isc_que_events()
5HTXHVWVDV\QFKURQRXVQRWLILFDWLRQRIRQHRIDVSHFLILHGJURXSRIHYHQWV
'HVFULSWLRQ isc_que_events()LVFDOOHGWRUHTXHVWDV\QFKURQRXVQRWLILFDWLRQRIDQ\RIWKHHYHQWVOLVWHG
LQHYHQWBEXIIHU8SRQFRPSOHWLRQRIWKHFDOOEXWEHIRUHHYHQWVDUHSRVWHGFRQWUROLVUHWXUQHG
WRWKHFDOOLQJDSSOLFDWLRQZKLFKFDQFRQWLQXHRWKHUSURFHVVLQJ:KHQDUHTXHVWHGHYHQWLV
SRVWHG,QWHU%DVHFDOOVWKHIXQFWLRQVSHFLILHGLQHYHQWBIXQFWLRQWRSURFHVVHYHQWRFFXUUHQFH
$IWHUHYHQWBIXQFWLRQLVFDOOHG\RXPXVWFDOOisc_que_events()DJDLQLI\RXZDQWWRVWDUWDQRWKHU
DV\QFKURQRXVZDLWRQWKHVSHFLILHGHYHQWV
Note isc_que_events()FDQQRWEHFDOOHGIURPZLWKLQHYHQWBIXQFWLRQ
,I\RXZDQWWRFDQFHO\RXUisc_que_events()UHTXHVWIRUDV\QFKURQRXVHYHQWQRWLILFDWLRQ
FDOOisc_cancel_events()
Note 7RUHTXHVWV\QFKURQRXVQRWLILFDWLRQFDOOisc_wait_for_event()
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVFDOOLQJisc_que_events()WRZDLW
DV\QFKURQRXVO\IRUHYHQWRFFXUUHQFHV:LWKLQDORRSLWSHUIRUPVRWKHUSURFHVVLQJDQG
FKHFNVWKHHYHQWIODJ SUHVXPDEO\VHWE\WKHVSHFLILHGHYHQWIXQFWLRQ WRGHWHUPLQHZKHQDQ
HYHQWKDVEHHQSRVWHG,IRQHKDVWKHSURJUDPUHVHWVWKHHYHQWIODJFDOOV
isc_event_counts()WRGHWHUPLQHZKLFKHYHQWVKDYHEHHQSRVWHGVLQFHWKHODVWFDOOWR
isc_que_events()DQGFDOOVisc_que_events()WRLQLWLDWHDQRWKHUDV\QFKURQRXVZDLW
#include <ibase.h>
#define number_of_stocks 3;
#define MAX_LOOP 10
294 INTERBASE 5
USING FUNCTION DEFINITIONS
length = (short)isc_event_block(
&event_buffer,
&result_buffer,
number_of_stocks,
"DEC", "HP", "SUN");
isc_que_events(
status_vector,
&database_handle, /* Set in previous isc_attach_database(). */
&event_id,
length, /* Returned from isc_event_block(). */
event_buffer,
(isc_callback)event_function,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
};
counter = 0;
while (counter < MAX_LOOP)
{
counter++;
if (!event_flag)
{
/* Do whatever other processing you want. */
;
}
else
{ event_flag = 0;
isc_event_counts(
count_array,
length,
event_buffer,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
}
isc_que_events(
status_vector,
&database_handle,
&event_id,
length,
event_buffer,
(isc_callback)event_function,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
}
} /* End of else. */
} /* End of while. */
5HWXUQ9DOXH isc_que_events()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHVVXFFHVV$
QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKHVWDWXVYHFWRU
LVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
296 INTERBASE 5
USING FUNCTION DEFINITIONS
6HH$OVR isc_cancel_events()
isc_event_block()
isc_event_counts()
isc_wait_for_event()
)RUPRUHLQIRUPDWLRQDERXWZULWLQJDQDV\QFKURQRXVHYHQWWUDS $67 IXQFWLRQVHH&KDSWHU
´:RUNLQJZLWK(YHQWVµ
isc_rollback_transaction()
8QGRHVFKDQJHVPDGHE\DWUDQVDFWLRQDQGUHVWRUHVWKHGDWDEDVHWRLWVVWDWHSULRUWRWKHVWDUW
RIWKHVSHFLILHGWUDQVDFWLRQ
'HVFULSWLRQ isc_rollback_transaction()UROOVEDFNDVSHFLILHGWUDQVDFWLRQFORVHVUHFRUGVWUHDPVIUHHV
V\VWHPUHVRXUFHVDQGVHWVWKHWUDQVDFWLRQKDQGOHWR]HUR,WLVW\SLFDOO\XVHGWRXQGRDOO
GDWDEDVHFKDQJHVPDGHE\DWUDQVDFWLRQZKHQDQHUURURFFXUV
$FDOOWRWKLVIXQFWLRQFDQIDLORQO\LI
g <RXSDVVD18//RULQYDOLGWUDQVDFWLRQKDQGOH
g 7KHWUDQVDFWLRQGHDOWZLWKPRUHWKDQRQHGDWDEDVHDQGDFRPPXQLFDWLRQVOLQNIDLOVGXULQJ
WKHUROOEDFNRSHUDWLRQ,IWKDWKDSSHQVVXEWUDQVDFWLRQVRQWKHUHPRWHQRGHZLOOHQGXSLQ
OLPER<RXPXVWXVHWKHGDWDEDVHPDLQWHQDQFHXWLOLW\WRPDQXDOO\UROOEDFNWKRVH
WUDQVDFWLRQV
([DPSOH 7KHIROORZLQJFDOOUROOVEDFNDWUDQVDFWLRQ
isc_rollback_transaction(status_vector, &trans);
5HWXUQ9DOXH isc_rollback_transaction()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()
isc_sqlcode()
7UDQVODWHVDQ,QWHU%DVHHUURUFRGHLQWKHHUURUVWDWXVYHFWRUWRDQ64/HUURUFRGHQXPEHU
'HVFULSWLRQ isc_sqlcode()VHDUFKHVVWDWXVBYHFWRUIRUDUHSRUWHG64/HUURUDQGLILWILQGVLWWUDQVODWHVWKH
,QWHU%DVHHUURUFRGHQXPEHULQWRDQDSSURSULDWH64/HUURUFRGH7\SLFDOO\WKLVFDOOLVXVHG
WRSRSXODWHDSURJUDPYDULDEOH XVXDOO\FDOOHG64/&2'(IRUSRUWDELOLW\DPRQJ64/
LPSOHPHQWDWLRQV ZLWKDQ64/HUURUQXPEHUIRUXVHLQDQ64/HUURUKDQGOLQJURXWLQH
([DPSOH 7KHIROORZLQJFRGHLOOXVWUDWHVKRZisc_sqlcode()PLJKWEHFDOOHGLQD'64/DSSOLFDWLRQ
#include <ibase.h>
long SQLCODE;
ISC_STATUS status_vector[20];
. . .
if (status_vector[0] == 1 && status_vector[1])
{
SQLCODE = isc_sqlcode(status_vector);
isc_print_sqlerror(SQLCODE, status_vector);
}
5HWXUQ9DOXH ,IVXFFHVVIXOisc_sqlcode()UHWXUQVWKHILUVWYDOLG64/HUURUFRGHGHFRGHGIURPWKH
,QWHU%DVHVWDWXVYHFWRU
,IQRYDOLG64/HUURUFRGHLVIRXQGisc_sqlcode()UHWXUQV²
6HH$OVR isc_interprete()isc_print_sqlerror()isc_print_status()isc_sql_interprete()
298 INTERBASE 5
USING FUNCTION DEFINITIONS
isc_sql_interprete()
%XLOGVDQ64/HUURUPHVVDJHVWULQJDQGVWRUHVLWLQDXVHUGHILQHGEXIIHU
'HVFULSWLRQ *LYHQDQ64/&2'(YDOXHOHVVWKDQ]HURisc_sql_interprete()EXLOGVDFRUUHVSRQGLQJ64/
HUURUPHVVDJHVWULQJDQGVWRUHVLWLQDXVHUGHILQHGEXIIHU7KHVL]HRIWKHEXIIHULQE\WHV
PXVWDOVREHSDVVHGWRWKLVIXQFWLRQ
7RGLVSOD\DQ64/HUURUPHVVDJHFRUUHVSRQGLQJWRDQ64/&2'(YDOXHXVH
isc_print_sqlerror()LQVWHDGRIWKLVFDOO
([DPSOH 7KHIROORZLQJFRGHIUDJPHQWLOOXVWUDWHVDFDOOWRisc_sql_interprete()
#include <ibase.h>
long SQLCODE;
char err_buf[256];
. . .
if (status_vector[0] == 1 && status_vector[1])
{
SQLCODE = isc_sqlcode(status_vector);
isc_sql_interprete(SQLCODE, err_buf, sizeof(err_buff));
}
5HWXUQ9DOXH 1RQH
6HH$OVR isc_interprete()isc_print_sqlerror()isc_print_status()isc_sqlcode()
isc_start_multiple()
%HJLQVDQHZWUDQVDFWLRQDJDLQVWPXOWLSOHGDWDEDVHV
'HVFULSWLRQ &DOOisc_start_multiple()LI\RX
g $UHXVLQJDODQJXDJHWKDWGRHVQRWVXSSRUWDYDULDEOHQXPEHURIDUJXPHQWVLQDIXQFWLRQFDOO
g 'RQRWNQRZKRZPDQ\GDWDEDVHV\RXZDQWWRDWWDFKWRZKHQFRGLQJWKHVWDUWWUDQVDFWLRQ
IXQFWLRQ
isc_start_multiple()SDVVHVLQIRUPDWLRQDERXWHDFKWDUJHWGDWDEDVHWR,QWHU%DVH7KDW
LQIRUPDWLRQLVVWRUHGLQDQDUUD\RIWUDQVDFWLRQH[LVWHQFHEORFNV 7(%V SRLQWHGWRE\WKH
WHEBYHFWRUSDUDPHWHU
WHEBYHFWRULVDSRLQWHUWRDE\WHDUUD\WKDWFRQVLVWVRIFRQVHFXWLYH7(%VRQH7(%IRUHDFK
GDWDEDVHWRFRQQHFWWR(DFK7(%FRQVLVWVRIWKUHHLWHPVDSRLQWHUWRWKHGDWDEDVHKDQGOH
IRUDGDWDEDVHDJDLQVWZKLFKWKHWUDQVDFWLRQVKRXOGUXQWKHOHQJWKLQE\WHVRIWKH
WUDQVDFWLRQSDUDPHWHUEXIIHU 73% IRUWKHGDWDEDVHDQGDSRLQWHUWRWKH73%7KHLWHPVLQ
D7(%FRUUHVSRQGWRWKHLWHPVSDVVHGGLUHFWO\DVSDUDPHWHUVLQFDOOVWR
isc_start_transaction()&SURJUDPPHUVVKRXOGXVHisc_start_transaction()LQVWHDGRI
isc_start_multiple()ZKHQHYHUSRVVLEOHEHFDXVHLWGRHVQRWUHTXLUHVHWWLQJXS7(%V
)RUPRUHLQIRUPDWLRQDERXWHVWDEOLVKLQJ7(%VDQGFDOOLQJisc_start_multiple()VHH
´&DOOLQJLVFBVWDUWBPXOWLSOH µRQSDJH RI&KDSWHU´:RUNLQJZLWK7UDQVDFWLRQVµ
([DPSOH 7KHIROORZLQJSURJUDPVWDUWVDPXOWLSOHGDWDEDVHWUDQVDFWLRQ
300 INTERBASE 5
USING FUNCTION DEFINITIONS
#include <ibase.h>
static char
isc_tpb_0[] = { /* Declare the first transaction parameter
buffer. */
isc_tpb_version3, /* InterBase version. */
isc_tpb_write,/* Read-write access. */
isc_tpb_consistency, /* Serializable. */
isc_tpb_wait, /* Wait on lock. */
isc_tpb_lock_write, 3, /* Reserving IDS for update. */
’I’,’D’,’S’,
isc_tpb_protected},/* Don’t allow other transactions to
write to the table. */
main()
{
db0 = db1 = 0;
trans = 0;
teb_vec[1].dbb_ptr = &db1;
teb_vec[1].tpb_len = sizeof (isc_tpb_1);
teb_vec[1].tpb_ptr = isc_tpb_1;
if (trans)
isc_commit_transaction(isc_status, &trans);
5HWXUQ9DOXH isc_start_multiple()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()
isc_prepare_transaction()isc_prepare_transaction2()
isc_rollback_transaction()isc_start_transaction()
302 INTERBASE 5
USING FUNCTION DEFINITIONS
)RUPRUHLQIRUPDWLRQDERXWWUDQVDFWLRQKDQGOHVVHH´&UHDWLQJWUDQVDFWLRQKDQGOHVµRQ
SDJH RI&KDSWHU´:RUNLQJZLWK7UDQVDFWLRQVµ)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJ
DQGSRSXODWLQJD73%VHH´&UHDWLQJDWUDQVDFWLRQSDUDPHWHUEXIIHUµRQSDJH RI&KDSWHU
´:RUNLQJZLWK7UDQVDFWLRQVµ)RUPRUHLQIRUPDWLRQRQ7(%VVHH´&DOOLQJ
LVFBVWDUWBPXOWLSOH µRQSDJH RI&KDSWHU´:RUNLQJZLWK7UDQVDFWLRQVµ
isc_start_transaction()
6WDUWVDQHZWUDQVDFWLRQDJDLQVWRQHRUPRUHGDWDEDVHV
'HVFULSWLRQ isc_start_transaction()VWDUWVDQHZWUDQVDFWLRQDJDLQVWRQHRUPRUHGDWDEDVHVVSHFLILHGDV
GDWDEDVHKDQGOHV
Note ,I\RXKDYHDYDULDEOHQXPEHURIGDWDEDVHVWRXSGDWHRUDUHXVLQJDODQJXDJHWKDWGRHV
QRWVXSSRUWDYDULDEOHQXPEHURIDUJXPHQWVLQDIXQFWLRQFDOOXVH isc_start_multiple()
LQVWHDGRIisc_start_transaction()
$VLQJOHWUDQVDFWLRQFDQDFFHVVPXOWLSOHGDWDEDVHV7KLVIXQFWLRQSDVVHVLQIRUPDWLRQDERXW
HDFKGDWDEDVHLWDFFHVVHVDQGWKHFRQGLWLRQVRIDFFHVVIRUWKDWGDWDEDVHLQDWUDQVDFWLRQ
SDUDPHWHUEXIIHU 73% 7KH73%LVDYDULDEO\VL]HGYHFWRURIE\WHVGHFODUHGDQGSRSXODWHGE\
WKHSURJUDP,WFRQWDLQVLQIRUPDWLRQGHVFULELQJLQWHQGHGWUDQVDFWLRQEHKDYLRUVXFKDVLWV
DFFHVVDQGORFNPRGHV
isc_start_transaction()FDQVWDUWDWUDQVDFWLRQDJDLQVWXSWRGDWDEDVHV<RXPXVWSDVVD
GDWDEDVHKDQGOHDQGD73%IRUHDFKUHIHUHQFHGGDWDEDVH,I\RXZDQWWRXVHGHIDXOWVIRUWKH
WUDQVDFWLRQVHWWSEBOHQJWKWR]HUR,QWKLVFDVHWSEBYHFWRULVD18//SRLQWHU
([DPSOH 7KHIROORZLQJSURJUDPLQFOXGHVDFDOOWRWKHVWDUWWUDQVDFWLRQIXQFWLRQ
#include <ibase.h>
long
isc_status[20], /* Status vector. */
*db, /* Database handle. */
*trans, /* Transaction handle. */
static char
isc_tpb_0[] = {
isc_tpb_version3, /* InterBase version. */
isc_tpb_write,/* Read-write access. */
isc_tpb_consistency, /* Consistency-mode transaction. */
isc_tpb_wait, /* Wait on lock. */
isc_tpb_lock_write, 3, /* Reserving IDS table for update. */
"I","D","S",
isc_tpb_protected};/* Don’t allow other transactions to
write against this table. */
main()
{
db = trans = 0;
isc_attach_database(isc_status, 0, "test.gdb", &db, 0,0);
if (db)
{
isc_start_transaction(
isc_status, &trans, 1, &db,
sizeof(isc_tpb_0), isc_tpb_0);
if (isc_status[0] == 1 && isc_status[1])
isc_print_status(isc_status);
304 INTERBASE 5
USING FUNCTION DEFINITIONS
}
if (trans)
isc_commit_transaction(isc_status, &trans);
5HWXUQ9DOXH isc_start_transaction()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_commit_transaction()
isc_prepare_transaction()
isc_prepare_transaction2()
isc_rollback_transaction()isc_start_multiple()
)RUPRUHLQIRUPDWLRQDERXWWUDQVDFWLRQKDQGOHVVHH´&UHDWLQJWUDQVDFWLRQKDQGOHVµRQ
SDJH RI&KDSWHU´:RUNLQJZLWK7UDQVDFWLRQVµ)RUPRUHLQIRUPDWLRQDERXWFUHDWLQJ
DQGSRSXODWLQJD73%VHH´&UHDWLQJDWUDQVDFWLRQSDUDPHWHUEXIIHUµRQSDJH RI&KDSWHU
´:RUNLQJZLWK7UDQVDFWLRQVµ
isc_transaction_info()
5HWXUQVLQIRUPDWLRQDERXWWKHVSHFLILHGQDPHGWUDQVDFWLRQ
'HVFULSWLRQ isc_transaction_info()UHWXUQVLQIRUPDWLRQQHFHVVDU\IRUNHHSLQJWUDFNRIWUDQVDFWLRQ,'V
7KLVFDOOLVXVHGLQWHUQDOO\E\isc_prepare_transaction()<RXVKRXOGQRWQHHGWRXVHLWLQ
\RXURZQDSSOLFDWLRQV
<RXFDQH[SOLFLWO\UHWULHYHLQIRUPDWLRQDERXWWKHWUDQVDFWLRQ,'E\LQFOXGLQJWKHIROORZLQJ
FRQVWDQWLQWKHLWHPOLVWEXIIHUZKHUHWKHWUDQVDFWLRQLWHPVDERXWZKLFK\RXZDQW
LQIRUPDWLRQDUHOLVWHG
isc_transaction_info()XVHVWZREXIIHUVGHILQHGLQWKHFDOOLQJSURJUDPWKHLWHPOLVWEXIIHU
ZKLFKOLVWVWUDQVDFWLRQLWHPVDERXWZKLFK\RXZDQWLQIRUPDWLRQDQGDUHVXOWEXIIHUZKHUHWKH
LQIRUPDWLRQUHTXHVWHGLVUHSRUWHG
306 INTERBASE 5
USING FUNCTION DEFINITIONS
7RGHILQHWKHLWHPOLVWEXIIHULQFOXGHWKHSDUDPHWHUVLWHPBOLVWBEXIIHUBOHQJWKDQG
LWHPBOLVWBEXIIHUBDGGUHVV7KHLWHPOLVWEXIIHULVDUHJXODUE\WHYHFWRUZLWKQRVWUXFWXUH
7RGHILQHWKHUHVXOWEXIIHULQFOXGHWKHSDUDPHWHUVUHVXOWBEXIIHUBOHQJWKDQGUHVXOWBEXIIHUBDGGUHVV
7KHVHSDUDPHWHUVVSHFLI\WKHOHQJWKDQGDGGUHVVRIDEXIIHUZKHUHWKH,QWHU%DVHHQJLQHZLOO
SODFHWKHUHWXUQYDOXHVIURPWKHIXQFWLRQFDOO
7KHYDOXHVUHWXUQHGWRWKHUHVXOWEXIIHUDUHXQDOLJQHGFOXVWHUVRIJHQHULFELQDU\QXPEHUV
)XUWKHUPRUHDOOQXPEHUVDUHUHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WH
ILUVWDQGWKHPRVWVLJQLILFDQWE\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUW
WKHQXPEHUVWRDGDWDW\SHQDWLYHWR\RXUV\VWHPEHIRUHLQWHUSUHWLQJWKHP
,Q\RXUFDOOLQFOXGHWKHLWHPVSHFLI\LQJWKHWUDQVDFWLRQ,'LVFBLQIRBWUDBLG,QWHU%DVHUHWXUQV
WKHWUDQVDFWLRQ,'LQWKHUHVXOWEXIIHU,QDGGLWLRQWRWKHLQIRUPDWLRQ,QWHU%DVHUHWXUQVLQ
UHVSRQVHWRDUHTXHVW,QWHU%DVHFDQDOVRUHWXUQRQHRUPRUHRIWKHIROORZLQJVWDWXVPHVVDJHV
WRWKHUHVXOWEXIIHU(DFKVWDWXVPHVVDJHLVRQHXQVLJQHGE\WHLQOHQJWK
Item Description
isc_info_end End of the messages
isc_info_truncated Result buffer is too small to hold any more requested information
isc_info_error Requested information is unavailable; check the status vector for an error
code and message
TABLE 12.21 Status message return items
7KHIXQFWLRQUHWXUQYDOXHLQGLFDWHVRQO\WKDW,QWHU%DVHDFFHSWHGWKHUHTXHVWIRULQIRUPDWLRQ
,WGRHVQRWPHDQWKDWLWXQGHUVWRRGWKHUHTXHVWRUWKDWLWVXSSOLHGDOORIWKHUHTXHVWHG
LQIRUPDWLRQ<RXUDSSOLFDWLRQPXVWLQWHUSUHWWKHFRQWHQWVRIWKHUHVXOWEXIIHUIRUGHWDLOV
DERXWWKHWUDQVDFWLRQ
([DPSOH 7KHIROORZLQJFRGHIUDJPHQWJHWVLQIRUPDWLRQDERXWDWUDQVDFWLRQ
static char /* Declare item-list buffer. */
tra_items[] =
{isc_info_tra_id};
/* Declare result buffer. */
CHAR tra_info[32];
isc_transaction_info(status_vector,
&tr_handle,
sizeof (tra_items), /* Length of item-list buffer. */
&tra_items, /* Address of item-list buffer. */
5HWXUQ9DOXH isc_transaction_info()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_start_transaction()
isc_vax_integer()
5HYHUVHVWKHE\WHRUGHURIDQLQWHJHU
'HVFULSWLRQ isc_vax_integer()UHYHUVHVWKHE\WHRUGHURIDQLQWHJHUVSHFLILHGLQEXIIHUDQGUHWXUQVWKH
QHZO\RUGHUHGYDOXH
$W\SLFDOXVHIRUWKLVIXQFWLRQLVWRFRQYHUWLQWHJHUYDOXHVSDVVHGLQWRDGDWDEDVHSDUDPHWHU
EXIIHUWRDIRUPDWZKHUHWKHOHDVWVLJQLILFDQWE\WHPXVWEHILUVWDQGWKHPRVWVLJQLILFDQWE\WH
ODVW,Q,QWHU%DVHLQWHJHUYDOXHVPXVWEHUHSUHVHQWHGLQLQSXWSDUDPHWHUEXIIHUV IRUH[DPSOH
WKH'3% DQGDUHUHWXUQHGLQUHVXOWEXIIHUVLQDJHQHULFIRUPDWZKHUHWKHOHDVWVLJQLILFDQW
E\WHLVILUVWDQGWKHPRVWVLJQLILFDQWE\WHODVWisc_vax_integer()LVXVHGWRFRQYHUWLQWHJHUV
WRDQGIURPWKLVIRUPDW
308 INTERBASE 5
USING FUNCTION DEFINITIONS
([DPSOH 7KHIROORZLQJFRGHIUDJPHQWFRQYHUWVDE\WHYDOXHVWRUHGLQDFKDUDFWHUEXIIHUWKDWLVWKH
UHVXOWEXIIHUUHWXUQHGE\DIXQFWLRQVXFKDVisc_database_info()
#include <ibase.h>
char *p;
. . .
for(p = res_buffer; *p != isc_info_end;)
{
/* Read item type of next cluster in the result buffer. */
item = *p++;
/* Read length of next value in result buffer, and convert. */
len = isc_vax_integer(p, 2);
p += len;
/* Now process the actual value, len bytes in size. */
. . .
}
5HWXUQ9DOXH isc_vax_integer()DOZD\VUHWXUQVDE\WHUHYHUVHGORQJLQWHJHUYDOXH
6HH$OVR isc_attach_database()isc_database_info()
isc_version()
5HWXUQVGDWDEDVHLPSOHPHQWDWLRQDQGYHUVLRQLQIRUPDWLRQ
7,3 ,ID18//SRLQWHULVSDVVHGIRUIXQFWLRQBQDPHisc_version()VHWVIXQFWLRQBQDPHWRSRLQWWR
WKH&printf()IXQFWLRQ
([DPSOHV 7KHIROORZLQJFRGHIUDJPHQWFDOOVisc_version()ZLWKD18//FDOOEDFNIXQFWLRQ
#include <ibase.h>
. . .
int ret;
. . .
ret = isc_version(&db1, NULL, "\t%s\n");
310 INTERBASE 5
USING FUNCTION DEFINITIONS
5HWXUQ9DOXH ,IVXFFHVVIXOisc_version()UHWXUQV2WKHUZLVHLWUHWXUQVDQRQ]HURYDOXH
6HH$OVR isc_database_info()
isc_wait_for_event()
:DLWVV\QFKURQRXVO\XQWLORQHRIDVSHFLILHGJURXSRIHYHQWVLVSRVWHG
Note 7KHisc_wait_for_event()IXQFWLRQZDVFDOOHGgds_$event_wait()LQ,QWHU%DVH,W
LVWKHUHIRUHWKHRQO\IXQFWLRQWKDWFDQ·WEHWUDQVODWHGIURPQRPHQFODWXUHWRDOOODWHU
YHUVLRQVE\UHSODFLQJgds_$ ZLWKisc_
'HVFULSWLRQ isc_wait_for_event()LVXVHGWRZDLWV\QFKURQRXVO\XQWLORQHRIDVSHFLILHGJURXSRIHYHQWV
LVSRVWHG&RQWUROLVQRWUHWXUQHGWRWKHFDOOLQJDSSOLFDWLRQXQWLORQHRIWKHVSHFLILHGHYHQWV
RFFXUV
(YHQWVWRZDLWRQDUHVSHFLILHGLQHYHQWBEXIIHUZKLFKVKRXOGKDYHEHHQLQLWLDOO\DOORFDWHGDQG
ILOOHGLQE\DSUHYLRXVFDOOWRisc_event_block()
:KHQRQHRIWKHVHHYHQWVLVSRVWHGisc_wait_for_event() ILOOVLQUHVXOWBEXIIHUZLWKGDWDWKDW
H[DFWO\FRUUHVSRQGVWRWKDWLQWKHLQLWLDOEXIIHUH[FHSWWKDWWKHHYHQWFRXQWVZLOOEHWKH
XSGDWHGRQHV&RQWUROWKHQUHWXUQVIURP isc_wait_for_event()WRWKHFDOOLQJDSSOLFDWLRQ
7KHDSSOLFDWLRQVKRXOGWKHQFDOOisc_event_counts()WRGHWHUPLQHZKLFKHYHQWZDVSRVWHG
Note 7RUHTXHVWDV\QFKURQRXVQRWLILFDWLRQRIHYHQWSRVWLQJVXVH isc_que_events()LQVWHDGRI
isc_wait_for_event()<RXPXVWXVHDV\QFKURQRXVQRWLILFDWLRQVLQ0LFURVRIW:LQGRZV
DSSOLFDWLRQVRUZKHUHYHUDSURFHVVPXVWQRWVWRSSURFHVVLQJ
([DPSOH 7KHIROORZLQJSURJUDPIUDJPHQWLOOXVWUDWHVDFDOOWRisc_wait_for_event()WRZDLWIRUD
SRVWLQJRIDQ\RIWKHHYHQWVQDPHG´'(&µ´+3µRU´681µ
#include <ibase.h>
#define number_of_stocks 3;
length = (short)isc_event_block(
&event_buffer,
&result_buffer,
number_of_stocks,
"DEC", "HP", "SUN");
isc_wait_for_event(
status_vector,
&database_handle,
length, /* Returned from isc_event_block(). */
event_buffer,
result_buffer);
if (status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector); /* Display error message. */
return(1);
}
5HWXUQ9DOXH isc_wait_for_event()UHWXUQVWKHVHFRQGHOHPHQWRIWKHVWDWXVYHFWRU=HURLQGLFDWHV
VXFFHVV$QRQ]HURYDOXHLQGLFDWHVDQHUURU)RU,QWHU%DVHHUURUVWKHILUVWHOHPHQWRIWKH
VWDWXVYHFWRULVVHWWRDQGWKHVHFRQGHOHPHQWLVVHWWRDQ,QWHU%DVHHUURUFRGH
312 INTERBASE 5
USING FUNCTION DEFINITIONS
7RFKHFNIRUDQ,QWHU%DVHHUURUH[DPLQHWKHILUVWWZRHOHPHQWVRIWKHVWDWXVYHFWRUGLUHFWO\
)RUPRUHLQIRUPDWLRQDERXWH[DPLQLQJWKHVWDWXVYHFWRUVHH&KDSWHU´+DQGOLQJ(UURU
&RQGLWLRQVµ
6HH$OVR isc_event_block()isc_que_events()
InterBase Document
AppendixA
A
Conventions
7KLVDSSHQGL[GHVFULEHVWKH,QWHU%DVHGRFXPHQWDWLRQVHWWKHSULQWLQJFRQYHQWLRQVXVHG
WRGLVSOD\LQIRUPDWLRQLQWH[WDQGLQFRGHH[DPSOHVDQGFRQYHQWLRQVIRUQDPLQJGDWDEDVH
REMHFWVDQGILOHVLQDSSOLFDWLRQV
315
APPENDIX A INTERBASE DOCUMENT CONVENTIONS
Book Description
Operations Guide Provides an introduction to InterBase and an explanation of tools and
procedures for performing administrative tasks on databases and database
servers. Also includes full reference on InterBase utilities, including isql, gbak,
Server Manager for Windows, and others.
Data Definition Guide Explains how to create, alter, and delete database objects through ISQL.
Language Reference Describes SQL and DSQL syntax and usage.
Programmer’s Guide Describes how to write embedded SQL and DSQL database applications in a
host language, precompiled through gpre.
API Guide Explains how to write database applications using the InterBase API.
TABLE A.1 Books in the InterBase 5.1 documentation set
316 INTERBASE 5
PRINTING CONVENTIONS
Printing conventions
7KH,QWHU%DVHGRFXPHQWDWLRQVHWXVHVYDULRXVW\SRJUDSKLFFRQYHQWLRQVWRLGHQWLI\REMHFWV
DQGV\QWDFWLFHOHPHQWV
7KHIROORZLQJWDEOHOLVWVW\SRJUDSKLFFRQYHQWLRQVXVHGLQWH[WDQGSURYLGHVH[DPSOHVRIWKHLU
XVH
Syntax conventions
7KHIROORZLQJWDEOHOLVWVWKHFRQYHQWLRQVXVHGLQV\QWD[VWDWHPHQWVDQGVDPSOHFRGHDQG
SURYLGHVH[DPSOHVRIWKHLUXVH
318 INTERBASE 5
APPENDIX
Data Structures
AppendixB
B
7KLVDSSHQGL[GRFXPHQWVWKHGDWDVWUXFWXUHVFRPSLOHWLPHFRQVWDQWVSDUDPHWHUEXIIHUV
DQGLQIRUPDWLRQEXIIHUVXWLOL]HGLQ,QWHU%DVH$3,DSSOLFDWLRQV
7KLVLQIRUPDWLRQDOVRDSSHDUVWKURXJKRXWWKHUHVWRIWKLV$3,*XLGHEXWLVFRQVROLGDWHGKHUH
DVDFRQYHQLHQFH6HHRWKHUVHFWLRQVRIWKLVPDQXDOIRUPRUHLQIRUPDWLRQ
$OOWKHVWUXFWXUHVDQGFRPSLOHWLPHFRQVWDQWVPHQWLRQHGDUHGHILQHGLQWKHLEDVHKKHDGHUILOH
,WHPVDUHGRFXPHQWHGDOSKDEHWLFDOO\DVIROORZV
g $UUD\GHVFULSWRU
g %OREGHVFULSWRU
g %ORELQIRUPDWLRQLWHPOLVWEXIIHUDQGUHVXOWEXIIHU
g %ORESDUDPHWHUEXIIHU
g 'DWDEDVHLQIRUPDWLRQUHTXHVWEXIIHUDQGUHVXOWEXIIHU
g 'DWDEDVHSDUDPHWHUEXIIHU
g 64/GDWDW\SHPDFURFRQVWDQWV
g 6WDWXVYHFWRU
g 7UDQVDFWLRQSDUDPHWHUEXIIHU
g ;64/'$DQG;64/9$5VWUXFWXUHV
319
APPENDIX B DATA STRUCTURES
Array descriptor
$QDUUD\GHVFULSWRU,6&B$55$<B'(6&LVDVWUXFWXUHGHILQHGLQWKHLEDVHKKHDGHUILOHDV
typedef struct {
unsigned char array_desc_dtype;
char array_desc_scale;
unsigned short array_desc_length;
char array_desc_field_name [32];
char array_desc_relation_name [32];
short array_desc_dimensions;
short array_desc_flags;
ISC_ARRAY_BOUND array_desc_bounds [16];
} ISC_ARRAY_DESC;
,6&B$55$<B%281'LVGHILQHGDV
typedef struct {
short array_bound_lower; /* lower bound */
short array_bound_upper; /* upper bound */
} ISC_ARRAY_BOUND;
Field Description
array_desc_dtype Datatype (see below)
array_desc_scale Scale for numeric datatypes
array_desc_length Length in bytes of each array element
array_desc_field_name NULL-terminated column name
array_desc_relation_name NULL-terminated relation name
array_desc_dimensions Number of array dimensions
array_desc_flags Specifies whether array is to be accessed in row- major or column-major
order
• 0: row-major
• 1: column-major
array_desc_bounds Lower and upper bounds for each dimension
TABLE B.1 Array descriptor fields
320 INTERBASE 5
DATATYPES FOR ARRAY DESCRIPTORS
array_desc_dtype
value Corresponding InterBase datatype
blr_text CHAR
blr_text2 CHAR
blr_short SMALLINT
blr_long INTEGER
blr_float FLOAT
blr_date DATE
blr_varying VARCHAR
blr_varying2 VARCHAR
Blob descriptor
$%OREGHVFULSWRULVGHILQHGDV
typedef struct {
short blob_desc_subtype;
short blob_desc_charset;
short blob_desc_segment_size;
unsigned char blob_desc_field_name [32];
unsigned char blob_desc_relation_name [32];
} ISC_BLOB_DESC;
Field Description
blob_desc_subtype Type of Blob data
0: unstructured
1: TEXT
negative integer between –1 and –32678: user-defined subtype
blob_desc_charset Character set (see below)
blob_desc_segment_size Segment size
blob_desc_field_name NULL-terminated column name
Character sets
,QWHU%DVHVXSSRUWVDQXPEHURIFKDUDFWHUVHWV)RUDOLVWRIWKHFKDUDFWHUVHWVVXSSRUWHGDQG
WKHFKDUDFWHUVHWYDOXHWKDWPXVWEHHQWHUHGLQWKHEOREBGHVFBFKDUVHWILHOGRID%OREGHVFULSWRU
VHHWKH'DWD'HILQLWLRQ*XLGH
322 INTERBASE 5
BLOB DESCRIPTOR
4 ,WHPOLVWEXIIHU
7KHLWHPOLVWEXIIHULVDE\WHYHFWRULQWRZKLFKLVSODFHGDVHTXHQFHRIE\WHYDOXHVRQHSHU
UHTXHVWHGLWHPRILQIRUPDWLRQ(DFKE\WHLVDQLWHPW\SHVSHFLI\LQJWKHNLQGRILQIRUPDWLRQ
GHVLUHG&RPSLOHWLPHFRQVWDQWVIRUDOOLWHPW\SHVDUHGHILQHGLQLEDVHK
#define isc_info_blob_num_segments 4
#define isc_info_blob_max_segment 5
#define isc_info_blob_total_length 6
#define isc_info_blob_type 7
4 5HVXOWEXIIHU
7KHUHVXOWEXIIHULVDE\WHYHFWRULQZKLFK,QWHU%DVHUHWXUQVDVHULHVRIFOXVWHUVRILQIRUPDWLRQ
RQHSHULWHPUHTXHVWHG(DFKFOXVWHUFRQVLVWVRIWKUHHSDUWV
$RQHE\WHLWHPW\SH(DFKLVWKHVDPHDVRQHRIWKHLWHPW\SHVLQWKHLWHPOLVW
EXIIHU
$E\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHURI
WKHFOXVWHU
$YDOXHVWRUHGLQDYDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQGHSHQGVRQ
WKHLWHPW\SH
$FDOOLQJSURJUDPLVUHVSRQVLEOHIRULQWHUSUHWLQJWKHFRQWHQWVRIWKHUHVXOWEXIIHUDQGIRU
GHFLSKHULQJHDFKFOXVWHUDVDSSURSULDWH
7KHFOXVWHUVUHWXUQHGWRWKHUHVXOWEXIIHUDUHQRWDOLJQHG)XUWKHUPRUHDOOQXPEHUVDUH
UHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQW
E\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUWWKHQXPEHUVWRDGDWDW\SH
QDWLYHWR\RXUV\VWHPLIQHFHVVDU\EHIRUHLQWHUSUHWLQJWKHP7KH$3,FDOO
isc_vax_integer()FDQEHXVHGWRSHUIRUPWKHFRQYHUVLRQ
,QDGGLWLRQWRWKHLQIRUPDWLRQ,QWHU%DVHUHWXUQVLQUHVSRQVHWRDUHTXHVW,QWHU%DVHFDQDOVR
UHWXUQRQHRUPRUHRIWKHIROORZLQJVWDWXVPHVVDJHVWRWKHUHVXOWEXIIHU(DFKVWDWXVPHVVDJH
LVRQHXQVLJQHGE\WHLQOHQJWK
Item Description
isc_info_end End of the messages
isc_info_truncated Result buffer is too small to hold any more requested information
isc_info_error Requested information is unavailable. Check the status vector for an error
code and message
TABLE B.5 Status message return items
324 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
(DFKFOXVWHUFRQVLVWVRIWKHIROORZLQJSDUWV
$RQHE\WHSDUDPHWHUW\SH7KHUHDUHFRPSLOHWLPHFRQVWDQWVGHILQHGIRUDOOWKH
SDUDPHWHUW\SHV IRUH[DPSOHLVFBESEBWDUJHWBW\SH
$RQHE\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHU
RIWKHFOXVWHU
$YDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQGHSHQGVRQWKHSDUDPHWHU
W\SH
$OOQXPEHUVLQWKH%ORESDUDPHWHUEXIIHUPXVWEHUHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKH
OHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQWE\WHODVW6LJQHGQXPEHUVVKRXOGKDYHWKH
VLJQLQWKHODVWE\WH7KH$3,IXQFWLRQisc_vax_integer()FDQEHXVHGWRUHYHUVHWKHE\WH
RUGHURIDQXPEHU)RUPRUHLQIRUPDWLRQDERXWisc_vax_integer()VHH´LVFBYD[BLQWHJHU µ
RQSDJH RI&KDSWHU´$3,)XQFWLRQ5HIHUHQFHµ
7KHIROORZLQJWDEOHOLVWVWKHSDUDPHWHUW\SHVDQGWKHLUPHDQLQJ)RUOLVWVRIWKHSRVVLEOH
VXEW\SHVDQGFKDUDFWHUVHWVVHH´%OREGHVFULSWRUµRQSDJH
Request buffer
7KHUHTXHVWEXIIHULVDE\WHYHFWRULQWRZKLFKLVSODFHGDVHTXHQFHRIE\WHYDOXHVRQHSHU
UHTXHVWHGLWHPRILQIRUPDWLRQ(DFKE\WHLVDQLWHPW\SHVSHFLI\LQJWKHNLQGRILQIRUPDWLRQ
GHVLUHG&RPSLOHWLPHFRQVWDQWVIRUDOOLWHPW\SHVDUHGHILQHGLQLEDVHKDQGVKRZQEHORZ
Result buffer
7KHUHVXOWEXIIHULVDE\WHYHFWRULQZKLFK,QWHU%DVHUHWXUQVDVHULHVRIFOXVWHUVRILQIRUPDWLRQ
RQHSHULWHPUHTXHVWHG(DFKFOXVWHUFRQVLVWVRIWKUHHSDUWV
$RQHE\WHLWHPUHWXUQW\SH7KHVHDUHWKHVDPHDVWKHLWHPW\SHVVSHFLILHGLQWKH
UHTXHVWEXIIHU
$WZRE\WHQXPEHUVSHFLI\LQJWKHQXPEHURIE\WHVWKDWIROORZLQWKHUHPDLQGHU
RIWKHFOXVWHU
$YDOXHVWRUHGLQDYDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQ HJDVD
QXPEHURUDVDVWULQJRIFKDUDFWHUV GHSHQGVRQWKHLWHPUHWXUQW\SH
$FDOOLQJSURJUDPLVUHVSRQVLEOHIRULQWHUSUHWLQJWKHFRQWHQWVRIWKHUHVXOWEXIIHUDQGIRU
GHFLSKHULQJHDFKFOXVWHUDVDSSURSULDWH,QPDQ\FDVHVWKHYDOXHVLPSO\FRQWDLQVDQXPEHU
RUDVWULQJ VHTXHQFHRIFKDUDFWHUV %XWLQRWKHUFDVHVWKHYDOXHLVDQXPEHURIE\WHVZKRVH
LQWHUSUHWDWLRQGHSHQGVRQWKHLWHPUHWXUQW\SH
7KHFOXVWHUVUHWXUQHGWRWKHUHVXOWEXIIHUDUHQRWDOLJQHG)XUWKHUPRUHDOOQXPEHUVDUH
UHSUHVHQWHGLQDJHQHULFIRUPDWZLWKWKHOHDVWVLJQLILFDQWE\WHILUVWDQGWKHPRVWVLJQLILFDQW
E\WHODVW6LJQHGQXPEHUVKDYHWKHVLJQLQWKHODVWE\WH&RQYHUWWKHQXPEHUVWRDGDWDW\SH
QDWLYHWR\RXUV\VWHPLIQHFHVVDU\EHIRUHLQWHUSUHWLQJWKHP7KH$3,FDOO
isc_vax_integer()FDQEHXVHGWRSHUIRUPWKHFRQYHUVLRQ
,QDGGLWLRQWRWKHLQIRUPDWLRQ,QWHU%DVHUHWXUQVLQUHVSRQVHWRDUHTXHVW,QWHU%DVHFDQDOVR
UHWXUQRQHRUPRUHRIWKHIROORZLQJVWDWXVPHVVDJHVWRWKHUHVXOWEXIIHU(DFKVWDWXVPHVVDJH
LVRQHXQVLJQHGE\WHLQOHQJWK
Item Description
isc_info_end End of the messages
isc_info_truncated Result buffer is too small to hold any more requested information
isc_info_error Requested information is unavailable; check the status vector for an error code
and message
TABLE B.7 Status message return items
326 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
4 'DWDEDVHFKDUDFWHULVWLFV
6HYHUDOLWHPVDUHSURYLGHGIRUGHWHUPLQLQJGDWDEDVHFKDUDFWHULVWLFVVXFKDVLWVVL]HDQGPDMRU
DQGPLQRU2'6YHUVLRQQXPEHUV7KHIROORZLQJWDEOHOLVWVWKHUHTXHVWEXIIHULWHPVWKDWFDQ
EHSDVVHGDQGWKHLQIRUPDWLRQUHWXUQHGLQWKHUHVXOWEXIIHUIRUHDFKLWHPW\SH
328 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
4 (QYLURQPHQWDOFKDUDFWHULVWLFV
6HYHUDOLWHPVDUHSURYLGHGIRUGHWHUPLQLQJHQYLURQPHQWDOFKDUDFWHULVWLFVVXFKDVWKHDPRXQW
RIPHPRU\FXUUHQWO\LQXVHRUWKHQXPEHURIGDWDEDVHFDFKHEXIIHUVFXUUHQWO\DOORFDWHG
7KHVHLWHPVDUHGHVFULEHGLQWKHIROORZLQJWDEOH
1RWDOOHQYLURQPHQWDOLQIRUPDWLRQLWHPVDUHDYDLODEOHRQDOOSODWIRUPV
4 3HUIRUPDQFHVWDWLVWLFV
7KHUHDUHIRXULWHPVSURYLGLQJSHUIRUPDQFHVWDWLVWLFVIRUDGDWDEDVH7KHVHVWDWLVWLFV
DFFXPXODWHIRUDGDWDEDVHIURPWKHPRPHQWLWLVILUVWDWWDFKHGE\DQ\SURFHVVXQWLOWKHODVW
UHPDLQLQJSURFHVVGHWDFKHVIURPWKHGDWDEDVH$SURJUDPUHTXHVWLQJWKLVLQIRUPDWLRQ
WKHUHIRUHVHHVLQIRUPDWLRQSHUWDLQLQJWRLWVRZQDWWDFKPHQWDQGDOORWKHUDWWDFKPHQWV
)RUH[DPSOHWKHYDOXHUHWXUQHGIRULVFBLQIRBUHDGVLVWKHQXPEHURIUHDGVVLQFHWKHFXUUHQW
GDWDEDVHZDVILUVWDWWDFKHGLWLVDQDJJUHJDWHRIDOOUHDGVGRQHE\DOODWWDFKHGSURFHVVHVUDWKHU
WKDQWKHQXPEHURIUHDGVGRQHIRUWKHFDOOLQJSURJUDPVLQFHLWDWWDFKHGWRWKHGDWDEDVH
330 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
7KHLWHPVSURYLGLQJSHUIRUPDQFHVWDWLVWLFVDUHVXPPDUL]HGLQWKHIROORZLQJWDEOH
4 'DWDEDVHRSHUDWLRQFRXQWV
6HYHUDOLQIRUPDWLRQLWHPVDUHSURYLGHGIRUGHWHUPLQLQJWKHQXPEHURIYDULRXVGDWDEDVH
RSHUDWLRQVSHUIRUPHGE\WKHFXUUHQWO\DWWDFKHGFDOOLQJSURJUDP7KHVHYDOXHVDUHFDOFXODWHG
RQDSHUWDEOHEDVLV
:KHQDQ\RIWKHVHLQIRUPDWLRQLWHPVLVUHTXHVWHG,QWHU%DVHUHWXUQVWRWKHUHVXOWEXIIHU
E\WHVSHFLI\LQJWKHLWHPW\SH IRUH[DPSOHLVFBLQIRBLQVHUWBFRXQW
E\WHVWHOOLQJKRZPDQ\E\WHVFRPSRVHWKHVXEVHTXHQWYDOXHSDLUV
$SDLURIYDOXHVIRUHDFKWDEOHLQWKHGDWDEDVHRQZKLFKWKHUHTXHVWHGW\SHRI
RSHUDWLRQKDVRFFXUUHGVLQFHWKHGDWDEDVHZDVODVWDWWDFKHG
(DFKSDLUFRQVLVWVRI
E\WHVVSHFLI\LQJWKHWDEOH,'
E\WHVOLVWLQJWKHQXPEHURIRSHUDWLRQV IRUH[DPSOHLQVHUWV GRQHRQWKDWWDEOH
7RGHWHUPLQHDQDFWXDOWDEOHQDPHIURPDWDEOH,'TXHU\WKH5'%5(/$7,21V\VWHPWDEOH
7KHIROORZLQJWDEOHGHVFULEHVWKHLWHPVZKLFKUHWXUQFRXQWYDOXHVIRURSHUDWLRQVRQWKH
GDWDEDVH
332 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
$YDULDEOHQXPEHURIE\WHVZKRVHLQWHUSUHWDWLRQ DVDQXPEHURUDVDVWULQJRI
FKDUDFWHUVIRUH[DPSOH GHSHQGVRQWKHSDUDPHWHUW\SH
7KHIROORZLQJWDEOHOLVWV'3%LWHPVE\SXUSRVH
7KHIROORZLQJWDEOHOLVWV'3%SDUDPHWHUVLQDOSKDEHWLFDORUGHU)RUHDFKSDUDPHWHULWOLVWVLWV
SXUSRVHWKHOHQJWKLQE\WHVRIDQ\YDOXHVSDVVHGZLWKWKHSDUDPHWHUDQGWKHYDOXHWRSDVV
334 INTERBASE 5
DATABASE INFORMATION REQUEST BUFFER AND RESULT BUFFER
6RPHSDUDPHWHUVVXFKDVLVFBGSEBGHOHWHBVKDGRZDUHGLUHFWLYHVWKDWGRQRWUHTXLUHDGGLWLRQDO
SDUDPHWHUV(YHQVR\RXPXVWVWLOOSURYLGHOHQJWKDQGYDOXHE\WHVIRUWKHVHSDUDPHWHUV6HW
OHQJWKWRDQGYDOXHWR,QWHU%DVHLJQRUHVWKHVHSDUDPHWHUYDOXHVEXWWKH\DUHUHTXLUHGWR
PDLQWDLQWKHIRUPDWRIWKH'3%
sqlind
SQL datatype Macro expression C datatype or typedef used?
Array SQL_ARRAY ISC_QUAD No
Array SQL_ARRAY + 1 ISC_QUAD Yes
Blob SQL_BLOB ISC_QUAD No
Blob SQL_BLOB + 1 ISC_QUAD Yes
CHAR SQL_TEXT char[ ] No
CHAR SQL_TEXT + 1 char[ ] Yes
DATE SQL_DATE ISC_QUAD No
DATE SQL_DATE + 1 ISC_QUAD Yes
DECIMAL SQL_SHORT, SQL_LONG, int, long, or double No
or SQL_DOUBLE
336 INTERBASE 5
SQL DATATYPE MACRO CONSTANTS
sqlind
SQL datatype Macro expression C datatype or typedef used?
NUMERIC SQL_SHORT, SQL_LONG, int, long, or double No
or SQL_DOUBLE
'(&,0$/DQG180(5,&GDWDW\SHVDUHVWRUHGLQWHUQDOO\DV60$//,17,17(*(5RU
'28%/(35(&,6,21GDWDW\SHV7RVSHFLI\WKHFRUUHFWPDFURH[SUHVVLRQWRSURYLGHIRUD
'(&,0$/RU180(5,&FROXPQXVHisqlWRH[DPLQHWKHFROXPQGHILQLWLRQLQWKHWDEOHWRVHH
KRZ,QWHU%DVHLVVWRULQJFROXPQGDWDWKHQFKRRVHDFRUUHVSRQGLQJPDFURH[SUHVVLRQ
7KHGDWDW\SHLQIRUPDWLRQIRUDSDUDPHWHURUVHOHFWOLVWLWHPLVFRQWDLQHGLQWKHVTOW\SHILHOGRI
WKH;64/9$5VWUXFWXUH7KHYDOXHFRQWDLQHGLQVTOW\SHSURYLGHVWZRSLHFHVRILQIRUPDWLRQ
g 7KHGDWDW\SHRIWKHSDUDPHWHURUVHOHFWOLVWLWHP
g :KHWKHUVTOLQGLVXVHGWRLQGLFDWH18//YDOXHV,IVTOLQGLVXVHGLWVYDOXHVSHFLILHVZKHWKHUWKH
SDUDPHWHURUVHOHFWOLVWLWHPLV18// RUQRW18//
)RUH[DPSOHLIVTOW\SHHTXDOV64/B7(;7WKHSDUDPHWHURUVHOHFWOLVWLWHPLVD&+$5WKDWGRHV
QRWXVHVTOLQGWRFKHFNIRUD18//YDOXH EHFDXVHLQWKHRU\18//YDOXHVDUHQRWDOORZHGIRU
LW ,IVTOW\SHHTXDOV64/B7(;7WKHQVTOLQGFDQEHFKHFNHGWRVHHLIWKHSDUDPHWHURU
VHOHFWOLVWLWHPLV18//
7KH&ODQJXDJHH[SUHVVLRQVTOW\SH SURYLGHVDXVHIXOWHVWRIZKHWKHUDSDUDPHWHURU
VHOHFWOLVWLWHPFDQFRQWDLQD18//7KHH[SUHVVLRQHYDOXDWHVWRLIWKHSDUDPHWHURU
VHOHFWOLVWLWHPFDQQRWFRQWDLQD18//DQGLIWKHSDUDPHWHURUVHOHFWOLVWLWHPFDQFRQWDLQ
D18//
Status vector
0RVW$3,IXQFWLRQVUHWXUQVWDWXVLQIRUPDWLRQWKDWLQGLFDWHVVXFFHVVRUIDLOXUH6WDWXV
LQIRUPDWLRQLVUHSRUWHGLQDQHUURUVWDWXVYHFWRUGHFODUHGLQDSSOLFDWLRQVDVDQDUUD\RIWZHQW\
ORQJLQWHJHUVXVLQJWKHIROORZLQJV\QWD[
#include "ibase.h"
. . .
ISC_STATUS status_vector[20];
,I\RXSODQWRZULWH\RXURZQURXWLQHVLQVWHDGRIWKH,QWHU%DVHHUURUKDQGOLQJURXWLQHVWR
UHDGDQGUHDFWWRWKHFRQWHQWVRIWKHVWDWXVYHFWRU\RXQHHGWRNQRZKRZWRLQWHUSUHWLW
,QWHU%DVHVWRUHVHUURULQIRUPDWLRQLQWKHVWDWXVYHFWRULQFOXVWHUVRIWZRRUWKUHHORQJV7KH
ILUVWFOXVWHULQWKHVWDWXVYHFWRUDOZD\VLQGLFDWHVWKHSULPDU\FDXVHRIWKHHUURU6XEVHTXHQW
FOXVWHUVPD\FRQWDLQVXSSRUWLQJLQIRUPDWLRQDERXWWKHHUURUIRUH[DPSOHVWULQJVRUQXPEHUV
IRUGLVSOD\LQDQDVVRFLDWHGHUURUPHVVDJH7KHDFWXDOQXPEHURIFOXVWHUVXVHGWRUHSRUW
VXSSRUWLQJLQIRUPDWLRQYDULHVIURPHUURUWRHUURU
,QPDQ\FDVHVDGGLWLRQDOHUURUVPD\EHUHSRUWHGLQWKHVWDWXVYHFWRU$GGLWLRQDOHUURUVDUH
UHSRUWHGLPPHGLDWHO\IROORZLQJWKHILUVWHUURUDQGLWVVXSSRUWLQJLQIRUPDWLRQLIDQ\7KHILUVW
FOXVWHUIRUHDFKDGGLWLRQDOHUURUPHVVDJHLGHQWLILHVWKHHUURU6XEVHTXHQWFOXVWHUVPD\FRQWDLQ
VXSSRUWLQJLQIRUPDWLRQDERXWWKHHUURU
338 INTERBASE 5
MEANING OF THE FIRST LONG IN A CLUSTER
7KHIROORZLQJWDEOHOLVWVSRVVLEOHYDOXHVIRUWKHILUVWORQJLQDQ\FOXVWHULQWKHVWDWXVYHFWRU
1RWHWKDWWKHILUVWFOXVWHULQWKHVWDWXVYHFWRUFDQRQO\FRQWDLQYDOXHVRIRUJUHDWHUWKDQ
Longwords in
Value cluster Meaning
0 — End of error information in the status vector
1 2 Second long is an InterBase error code
2 2 Second long is the address of string used as a replaceable parameter in a generic
InterBase error message
3 3 Second long is the length, in bytes, of a variable length string provided by the
operating system (most often this string is a file name); third long is the address of
the string
4 2 Second long is a number used as a replaceable parameter in a generic InterBase
error message
5 2 Second long is the address of an error message string requiring no further
processing before display
6 2 Second long is a VAX/VMS error code
7 2 Second long is a Unix error code
8 2 Second long is an Apollo Domain error code
9 2 Second long is an MS-DOS or OS/2 error code
10 2 Second long is an HP MPE/XL error code
11 2 Second long is an HP MPE/XL IPC error code
12 2 Second long is a NeXT/Mach error code
NOTE As InterBase is adapted to run on other hardware and software platforms, additional numeric
descriptors for specific platform and operating system error codes may be added to the end of this list.
TABLE B.15 Interpretation of status vector clusters
7KHIROORZLQJWDEOHOLVWVWKHLEDVHKGHILQHHTXLYDOHQWVRIHDFKQXPHULFGHVFULSWRU
340 INTERBASE 5
TRANSACTION PARAMETER BUFFER
$73%LVGHFODUHGLQD&SURJUDPDVDFKDUDUUD\RIRQHE\WHHOHPHQWV(DFKHOHPHQWLVD
SDUDPHWHUWKDWGHVFULEHVDVLQJOHWUDQVDFWLRQDWWULEXWH7KHILUVWHOHPHQWLQHYHU\73%PXVW
EHWKHLVFBWSEBYHUVLRQFRQVWDQW7KHIROORZLQJWDEOHOLVWVDYDLODEOH73%FRQVWDQWVGHVFULEHV
WKHLUSXUSRVHVDQGLQGLFDWHVZKLFKFRQVWDQWVDUHDVVLJQHGDVDGHIDXOWVHWRIDWWULEXWHVZKHQ
D18//73%SRLQWHULVSDVVHGWRisc_start_transaction()
Parameter Description
isc_tpb_version3 InterBase version 3 transaction
isc_tpb_consistency Table-locking transaction model
isc_tpb_concurrency High throughput, high concurrency transaction with acceptable consistency; use
of this parameter takes full advantage of the InterBase multi-generational
transaction model [Default]
isc_tpb_shared Concurrent, shared access of a specified table among all transactions.; use in
conjunction with isc_tpb_lock_read and isc_tpb_lock_write to establish the lock
option [Default]
isc_tpb_protected Concurrent, restricted access of a specified table; use in conjunction with
isc_tpb_lock_read and isc_tpb_lock_write to establish the lock option
isc_tpb_wait Lock resolution specifies that the transaction is to wait until locked resources are
released before retrying an operation [Default]
isc_tpb_nowait Lock resolution specifies that the transaction is not to wait for locks to be released,
but instead, a lock conflict error should be returned immediately
isc_tpb_read Access mode of read-only that allows a transaction only to select data from tables
isc_tpb_write Access mode of read-write that allows a transaction to select, insert, update, and
delete table data [Default]
isc_tpb_lock_read Read-only access of a specified table; use in conjunction with isc_tpb_shared,
isc_tpb_protected, and isc_tpb_exclusive to establish the lock option
isc_tpb_lock_write Read-write access of a specified table; use in conjunction with isc_tpb_shared,
isc_tpb_protected, and isc_tpb_exclusive to establish the lock option [Default]
TABLE B.17 TPB constants
Parameter Description
isc_tpb_read_committed High throughput, high concurrency transaction that can read changes committed
by other concurrent transactions; use of this parameter takes full advantage of the
InterBase multi-generational transaction model
isc_tpb_rec_version Enables an isc_tpb_read_committed transaction to read the most recently
committed version of a record even if other, uncommitted versions are pending.
isc_tpb_no_rec_version Enables an isc_tpb_read_committed transaction to read only the latest committed
version of a record
If an uncommitted version of a record is pending and isc_tpb_wait is also
specified, then the transaction waits for the pending record to be committed or
rolled back before proceeding; otherwise, a lock conflict error is reported at once
TABLE B.17 TPB constants (continued)
73%SDUDPHWHUVVSHFLI\WKHIROORZLQJFODVVHVRILQIRUPDWLRQ
g 7UDQVDFWLRQYHUVLRQQXPEHULVXVHGLQWHUQDOO\E\WKH,QWHU%DVHHQJLQH,WLVDOZD\VEHWKHILUVW
DWWULEXWHVSHFLILHGLQWKH73%DQGPXVWDOZD\VEHVHWWRLVFBWSEBYHUVLRQ
g $FFHVVPRGHGHVFULEHVWKHDFWLRQVWKDWFDQEHSHUIRUPHGE\WKHIXQFWLRQVDVVRFLDWHGZLWKWKH
WUDQVDFWLRQ9DOLGDFFHVVPRGHVDUH
LVFBWSEBUHDG
LVFBWSEBZULWH
g ,VRODWLRQOHYHOGHVFULEHVWKHYLHZRIWKHGDWDEDVHJLYHQDWUDQVDFWLRQDVLWUHODWHVWRDFWLRQV
SHUIRUPHGE\RWKHUVLPXOWDQHRXVO\RFFXUULQJWUDQVDFWLRQV9DOLGLVRODWLRQOHYHOVDUH
LVFBWSEBFRQFXUUHQF\
LVFBWSEBFRQVLVWHQF\
LVFBWSEBUHDGBFRPPLWWHGLVFBWSEBUHFBYHUVLRQ
LVFBWSEBUHDGBFRPPLWWHGLVFBWSEBQRBUHFBYHUVLRQ
g /RFNUHVROXWLRQGHVFULEHVKRZDWUDQVDFWLRQVKRXOGUHDFWLIDORFNFRQIOLFWRFFXUV9DOLGORFN
UHVROXWLRQVDUH
LVFBWSEBZDLW
LVFBWSEBQRZDLW
g 7DEOHUHVHUYDWLRQRSWLRQDOO\GHVFULEHVDQDFFHVVPHWKRGDQGORFNUHVROXWLRQIRUDVSHFLILHGWDEOH
WKDWWKHWUDQVDFWLRQDFFHVVHV:KHQWDEOHUHVHUYDWLRQLVXVHGWDEOHVDUHUHVHUYHGIRUWKH
VSHFLILHGDFFHVVZKHQWKHWUDQVDFWLRQLVVWDUWHGUDWKHUWKDQZKHQWKHWUDQVDFWLRQDFWXDOO\
DFFHVVHVWKHWDEOH9DOLGUHVHUYDWLRQVDUH
342 INTERBASE 5
XSQLDA AND XSQLVAR
LVFBWSEBVKDUHGLVFBWSEBORFNBZULWH
LVFBWSEBVKDUHGLVFBWSEBORFNBUHDG
LVFBWSEBSURWHFWHGLVFBWSEBORFNBZULWH
LVFBWSEBSURWHFWHGLVFBWSEBORFNBUHDG
$SSOLFDWLRQVGRQRWGHFODUHLQVWDQFHVRIWKH;64/9$5DKHDGRIWLPHEXWPXVWLQVWHDG
G\QDPLFDOO\DOORFDWHVWRUDJHIRUWKHSURSHUQXPEHURI;64/9$5VWUXFWXUHVUHTXLUHGIRUHDFK
'64/VWDWHPHQWEHIRUHLWLVH[HFXWHGWKHQGHDOORFDWHLWDVDSSURSULDWHDIWHUVWDWHPHQW
H[HFXWLRQ
7KHIROORZLQJILJXUHLOOXVWUDWHVWKHUHODWLRQVKLSEHWZHHQWKH;64/'$DQGWKH;64/9$5
short version
char sqldaid[8]
ISC_LONG sqldabc
short sqln
short sqld
$QLQSXW;64/'$FRQVLVWVRIDVLQJOH;64/'$VWUXFWXUHDQGRQH;64/9$5VWUXFWXUHIRU
HDFKLQSXWSDUDPHWHU$QRXWSXW;64/'$DOVRFRQVLVWVRIRQH;64/'$VWUXFWXUHDQGRQH
;64/9$5VWUXFWXUHIRUHDFKGDWDLWHPUHWXUQHGE\WKHVWDWHPHQW
344 INTERBASE 5
XSQLDA AND XSQLVAR
7KH
isc_dsql_prepare() isc_dsql_describe() DQG
isc_dsql_describe_bind() VWDWHPHQWV
FDQEHXVHGWRGHWHUPLQHWKHSURSHUQXPEHURI;64/9$5VWUXFWXUHVWRDOORFDWHDQGWKH
;64/'$B/(1*7+PDFURFDQEHXVHGWRDOORFDWHWKHSURSHUDPRXQWRIVSDFH
346 INTERBASE 5
XSQLDA AND XSQLVAR
A DUJXPHQWV6HHSDUDPHWHUV
DFFHVVPRGHSDUDPHWHU DUUD\EXIIHUV
DFFHVVLQJ DUUD\FROXPQV
DUUD\V ² DVVRFLDWLQJZLWKDUUD\V
DUUD\V'64/DSSOLFDWLRQV VHOHFWLQJ
DFWLRQV6HHHYHQWV VL]HVHWWLQJ
DGGUHVVHV ZULWLQJGDWDWR ²
HUURUPHVVDJHV DUUD\GHVFULSWRUV ²
QXPHULFGDWD FUHDWLQJ
DJJUHJDWHIXQFWLRQV GDWDW\SHV
DUUD\VDQG IODJVVHWWLQJ
$/,*1PDFUR LQLWLDOL]LQJ
DOORFDWLQJPHPRU\ SRSXODWLQJ ²
DQLPDWLRQ VHWWLQJILHOGVGLUHFWO\
$3,FDOOVUHIHUHQFLQJGHUHIHUHQFLQJ DUUD\HOHPHQWV
$3,IXQFWLRQV ² VL]HVHWWLQJ
DUUD\V DUUD\,'V
%/2%GDWD GHFODULQJ
FDWHJRULHVVXPPDUL]HG ² IHWFKLQJ
FRQYHUVLRQV LQLWLDOL]LQJ
GDWDEDVH DUUD\VOLFHV ²
'64/ FKDQJLQJRQHVOLFH
HUURUKDQGOLQJ FUHDWLQJGDWDEXIIHUV
'64/DSSOLFDWLRQV ² GHILQHG
HYHQWV UHDGLQJRQHVOLFH
H[DPSOHSURJUDPV ZULWLQJGDWDWR ²
LQIRUPDWLRQDO DUUD\V ²
SURFHVVLQJ64/VWDWHPHQWV ² 6HHDOVRHUURUVWDWXVDUUD\
;64/'$VDQG $3,IXQFWLRQV
SURWRW\SHV DVVRFLDWLQJZLWKDUUD\FROXPQV
WUDQVDFWLRQV FROXPQPDMRURUGHUVSHFLI\LQJ
DSSOLFDWLRQV FUHDWLQJ
6HHDOVR'64/DSSOLFDWLRQV GURSSLQJ
%/2%GDWDDQG '64/DSSOLFDWLRQVDQG
DOORFDWLQJ PXOWLGLPHQVLRQDO
W\SHFKHFNLQJ GLPHQVLRQVUDQJH
FRPSLOLQJ6HHFRPSLOLQJ QHVWHG
HUURUKDQGOLQJ RYHUYLHZ
OLQNLQJ6HHOLQNLQJ SURFHVVLQJ
PRQLWRULQJSHUIRUPDQFH UHDGLQJGDWD ²
SURJUDPPLQJ ² FUHDWLQJGDWDEXIIHUV
UHFRYHULQJGDWD UHWULHYLQJGDWD
:LQGRZV6HH:LQGRZVDSSOLFDWLRQV VHOHFWHGURZV
API GUIDE i
URZPDMRURUGHUVSHFLI\LQJ WUDQVODWLQJ
VXEVFULSWV XSGDWLQJ ²
VXEVHWV %/2%GDWDW\SH
UHWULHYLQJ DUUD\VDQG
ZULWLQJWR 18//YDOXHV
XSGDWLQJ ² XVHUGHILQHG
DV\QFKURQRXVHYHQWV %/2%GHVFULSWRUV ²
FDQFHOLQJQRWLILFDWLRQ SRSXODWLQJ ²
UHTXHVWLQJQRWLILFDWLRQ VWUXFWXUHGHILQHG
DV\QFKURQRXVWUDSV ² %/2%ILOWHUIXQFWLRQ
FUHDWLQJ DFWLRQPDFURGHILQLWLRQV
DWWDFKLQJWRDGDWDEDVH GHILQLQJ
DWWDFKLQJWRGDWDEDVHV ² LQSXWRXWSXWILHOGV
6HHDOVRFRQQHFWLQJWRGDWDEDVHV %/2%ILOWHUV ²
'3%VDQG FRQWUROVWUXFWXUHGHILQHG
RSWLRQDOHQWULHV H[WHUQDO ²
UHOHDVLQJV\VWHPUHVRXUFHV GHFODULQJ
UHWULHYLQJLQIRUPDWLRQDERXW ² ZULWLQJ ²
WHPSRUDULO\ LQYRNLQJ
:LQGRZVFOLHQWV 1HW:DUHVHUYHUVDQG
DXWRPDWLFUHFRYHU\IXQFWLRQV RSHQLQJ%/2%V
VSHFLI\LQJ
XVHUGHILQHG
B %/2%KDQGOHV
ELQDU\GDWD DOORFDWLQJ
ELQDU\ILOHW\SHVVXSSRUWHG %/2%,'V
ELQDU\ODUJHREMHFWV6HH%/2% FUHDWLQJ
ELWPDSSHGLPDJHV GHFODULQJ
%/2% GHILQHG UHVHWWLQJ
%/2%$3,IXQFWLRQV %/2%SDUDPHWHUEXIIHUV ²
%/2%FROXPQV JHQHUDWLQJ
FUHDWLQJ ² QXPHULFIRUPDWV
ZULWLQJGDWDWR SDUDPHWHUW\SHV
%/2%ILOWHUVDQG %/2%VHJPHQWV
%/2%GDWD ² DOORFDWLQJ
FKDQJLQJ GHILQHG
FUHDWLQJ UHDGLQJ
GHOHWLQJ UHWULHYLQJ
'64/DSSOLFDWLRQVDQG ² VL]H
IHWFKLQJ ZULWLQJ
ILOWHULQJ ² %/2%VXEW\SHV
SURFHVVLQJ ILOWHULQJ
UHDGLQJ ² UHWULHYLQJ
%/2%ILOWHUVDQG VHWWLQJ
UHWULHYLQJLQIRUPDWLRQDERXW ² %RUODQG&&6HH&ODQJXDJH
GHIDXOWV %3%V6HH%/2%SDUDPHWHUEXIIHUV
VHOHFWLQJ ² EXIIHUV
VWDWXVPHVVDJHVV %/2%ILOWHUV
VWRULQJ FDSWXULQJHUURUPHVVDJHV
VXSSRUW GDWDEDVHDWWDFKPHQWV
ii INTERBASE 5
UHLQLWLDOL]LQJHYHQW UHWDLQLQJFRQWH[W
WUDQVDFWLRQV FRPSLOLQJ
E\WHRUGHUUHYHUVLQJ FRQQHFWLQJWRGDWDEDVHV ²
6HHDOVRDWWDFKLQJWRGDWDEDVHV
FRQVWDQWV
C LWHPW\SHV %/2%V
&ODQJXDJH FRQYHUWLQJ
FRQYHUWLQJGDWHV ² GDWHV ²
GLUHFWLYHV &5($7('$7$%$6(
HUURUKDQGOLQJ '64/DSSOLFDWLRQV
HYHQWQRWLILFDWLRQ FXUVRUV
SUHGHILQHGFRQVWDQWV FORVLQJ
LWHPW\SHV %/2%V GHFODULQJ
SUHGHILQHGPDFURV '64/DSSOLFDWLRQV
DFWLRQPHVVDJHV %/2%V QDPLQJ
GDWDW\SHV ;64/'$V ² RSHQLQJ
LQIRUPDWLRQDO 64/
WLPHVWUXFWXUHV
&$'ILOHV D
FKDQJHV GDWD
XQGRLQJ ELQDU\
6HHDOVRUROOEDFNV FRUUXSWHG
FKDUDFWHUVHWV IHWFKLQJ
%/2%GDWDDQG '64/DSSOLFDWLRQV
UHWULHYLQJFXUUHQW ORVLQJ
VHWWLQJ SURWHFWLQJ6HHVHFXULW\
FKDUDFWHUVWULQJV UHDGLQJ ²
FRQYHUWLQJ UHFRYHULQJ
64/VWDWHPHQWVWR UHWULHYLQJ
&+$5$&7(59$5<,1*GDWDW\SH VHOHFWHGURZV
'64/DSSOLFDWLRQVDQG VWRULQJ
FOLHQWDSSOLFDWLRQV6HH64/FOLHQWDSSOLFDWLRQV:LQGRZV YDULDEOHOHQJWK
FOLHQWV SURFHVVLQJLQ;64/'$V
FOLHQWOLEUDULHV GDWDEDVH$3,IXQFWLRQV
&/26( GDWDEDVHKDQGOHV ²
FORVLQJ DVVLJQLQJDWUXQWLPH
GDWDEDVHV GHFODULQJ
FRHUFLQJGDWDW\SHV ;64/'$V ² GHILQHG
FROXPQQDPHV LQLWLDOL]LQJ
VWRULQJ PXOWLSOHGDWDEDVHV
FROXPQPDMRURUGHU GDWDEDVHSDJHV
VSHFLI\LQJ UHWULHYLQJLQIRUPDWLRQDERXW
FROXPQV GDWDEDVHSDUDPHWHUEXIIHUV
DUUD\VDQG DOORFDWLQJVWRUDJHVSDFH
'64/DSSOLFDWLRQV FUHDWLQJ ²
UHWULHYLQJLQIRUPDWLRQDERXW H[SDQGLQJ
FRPPLWV QXPHULFIRUPDWV
6HHDOVRWUDQVDFWLRQV SDUDPHWHUV
GHOD\LQJ DGGLQJDWUXQWLPH
H[HFXWLQJ GDWDEDVHV
iv INTERBASE 5
6HHDOVR64/HUURUPHVVDJHV ILOHW\SHV
DGGUHVVHV %/2%GDWD
EXLOGLQJ ILOWHULQJ%/2%GDWD ²
GLVSOD\LQJ 6HHDOVR%/2%ILOWHUV
'64/DSSOLFDWLRQV ² IRUPDWWLQJ
HUURUVWDWXVDUUD\ HUURUPHVVDJHV
HUURUVWDWXVYHFWRUV IXQFWLRQSURWRW\SHV
FKHFNLQJ
FOXVWHUV
GHFODULQJ G
QXPHULFGHVFULSWRUV ² *'6'//
QXPHULFYDOXHV
SDUVLQJ ²
HUURUKDQGOLQJ$3,IXQFWLRQV H
'64/DSSOLFDWLRQV ² KDQGOHV6HHGDWDEDVHKDQGOHVWUDQVDFWLRQKDQGOHV
HUURUKDQGOLQJURXWLQHV KHDGHUILOHV6HHLEDVHK
64/ KRVWQDPHVVSHFLI\LQJ
HUURUV
UXQWLPH
WUDQVDFWLRQV I
HYHQWEXIIHUUHLQLWLDOL]LQJ LEDVHK
HYHQWSDUDPHWHUEXIIHUV %/2%GHVFULSWRUV
DOORFDWLQJ HUURUV
FRPSDULQJHYHQWFRXQWV ;64/'$VWUXFWXUHV
FUHDWLQJ LQFOXGHILOHV6HHLEDVHK
HYHQWV LQGHWHUPLQDWHGDWDW\SHV
DV\QFKURQRXV LQIRUPDWLRQLWHPPDFURV 64/
FDQFHOLQJQRWLILFDWLRQ LQIRUPDWLRQDO$3,IXQFWLRQV
UHTXHVWLQJQRWLILFDWLRQ LQLWLDOL]LQJ
SRVWLQJ DUUD\GHVFULSWRUV
SURFHVVLQJ ² DUUD\,'V
UHWULHYLQJ %/2%KDQGOHV
V\QFKURQRXV %/2%,'V
WUDQVDFWLRQFRQWURO GDWDEDVHKDQGOHV
ZDLWLQJRQ WUDQVDFWLRQKDQGOHV
H[DPSOHSURJUDPV LQSXWGHVFULSWRUV6HH;64/'$V
(;(&87( LQSXWILHOGV
(;(&87(,00(',$7( %/2%ILOWHUV
(;(&87(352&('85( LQSXWSDUDPHWHUV
'64/DSSOLFDWLRQV '64/VWDWHPHQWV
H[WHQGHG64/GHVFULSWRUDUHDV6HH;64/'$V ,16(57
H[WHUQDO%/2%ILOWHUV6HH%/2%ILOWHUV DUUD\V
%/2%GDWD
,6&B$55$<B%281'VWUXFWXUH
F ,6&B$55$<B'(6&VWUXFWXUH
)(7&+ LVFBDUUD\BJHWBVOLFH
IHWFKLQJGDWD LVFBDUUD\BORRNXSBERXQGV
6HHDOVRUHWULHYLQJGDWD LVFBDUUD\BORRNXSBGHVF
'64/DSSOLFDWLRQV LVFBDUUD\BSXWBVOLFH
),/(VWUXFWXUH LVFBDUUD\BVHWBGHVF
API GUIDE v
LVFBDWWDFKBGDWDEDVH ,6&B48$'VWUXFWXUH
'3%VDQG LVFBTXHBHYHQWV ²
LVFBEOREBGHIDXOWBGHVF LVFBUROOEDFNBWUDQVDFWLRQ
LVFBEOREBJHQBESE LVFBVTOBLQWHUSUHWH ²
LVFBEOREBLQIR ² LVFBVTOFRGH
LVFBEOREBORRNXSBGHVF LVFBVWDUWBPXOWLSOH
LVFBEOREBVHWBGHVF LVFBVWDUWBWUDQVDFWLRQ YV
LVFBFDQFHOBEORE LVFBVWDUWBWUDQVDFWLRQ
LVFBFDQFHOBHYHQWV ,6&B67$786SRLQWHU
LVFBFORVHBEORE LVFBWUBKDQGOHW\SH
LVFBFRPPLWBUHWDLQLQJ LVFBWUDQVDFWLRQBLQIR
LVFBFRPPLWBWUDQVDFWLRQ ,6&B86(5HQYLURQPHQWYDULDEOH
LVFBFUHDWHBEORE LVFBYD[BLQWHJHU
,6&B'$7$%$6(HQYLURQPHQWYDULDEOH LVFBYHUVLRQ
LVFBGDWDEDVHBLQIR LVFBZDLWBIRUBHYHQW ²
LVFBGEBKDQGOHW\SH LVRODWLRQOHYHOSDUDPHWHU
LVFBGHFRGHBGDWH UHVWULFWLYH
LVFBGHWDFKBGDWDEDVH LWHPW\SHFRQVWDQWV %/2%V
LVFBGURSBGDWDEDVH LWHPOLVWEXIIHU
LVFBGVTOBDOORFDWHBVWDWHPHQW ² 6HHDOVRLVFBEOREBLQIR
LVFBGVTOBDOORFDWHBVWDWHPHQW
LVFBGVTOBGHVFULEH
LVFBGVTOBGHVFULEHBELQG L
LVFBGVTOBH[HFBLPPHG OLEUDULHV
LVFBGVTOBH[HFXWH ² %/2%ILOWHULQJURXWLQHV
LVFBGVTOBH[HFXWHBLPPHGLDWH G\QDPLFOLQN6HH'//V
LVFBGVTOBH[HFXWH OLPERWUDQVDFWLRQV
LVFBGVTOBIHWFK OLQNLQJ
6(/(&7VWDWHPHQWVDQG ORFNUHVROXWLRQSDUDPHWHU
LVFBGVTOBSUHSDUH ² ORJILOHV
LVFBGVTOBVTOBLQIR DQG
LVFBGVTOBVHWBFXUVRUBQDPH
LVFBGVTOBVTOBLQIR ² M
LVFBHQFRGHBGDWH PDFURV
LVFBHYHQWBEORFN DFWLRQPHVVDJHV %/2%V
LVFBHYHQWBFRXQWV ² $/,*1
LVFBH[SDQGBGSE GDWDW\SHV ;64/'$V ²
,6&B(;3257NH\ZRUG LQIRUPDWLRQDO 64/
LVFBJHWBVHJPHQW ;64/'$B/(1*7+
%/2%ILOWHUVDQG PHPRU\
LVFBLQIRBWUXQFDWHGYDOXH DOORFDWLQJ
LVFBLQWHUSUHWH UHWULHYLQJLQIRUPDWLRQDERXW
LVFBRSHQBEORE PHVVDJHV6HHHUURUPHVVDJHVVWDWXVPHVVDJHV
,6&B3$66:25'HQYLURQPHQWYDULDEOH 0LFURVRIW&&6HH&ODQJXDJH
LVFBSUHSDUHBWUDQVDFWLRQ 0LFURVRIW:LQGRZV6HH:LQGRZV
LVFBSUHSDUHBWUDQVDFWLRQ PRQLWRULQJSHUIRUPDQFH
LVFBSULQWBVTOHUURU PXOWLGLPHQVLRQDODUUD\V
LVFBSULQWBVWDWXV GLPHQVLRQVUDQJH
LVFBSXWBVHJPHQW PXOWLSOHGDWDEDVHV
%/2%ILOWHUVDQG DWWDFKLQJWR
vi INTERBASE 5
WUDQVDFWLRQVDQG SDVVZRUGV
6HHDOVRVHFXULW\
RYHUULGLQJ
N VXSSO\LQJDWUXQWLPH
1&+$59$5<,1*GDWDW\SH :LQGRZVFOLHQWV
'64/DSSOLFDWLRQVDQG 3&GHYHORSPHQWHQYLURQPHQWV
QHVWHGDUUD\V SHUIRUPDQFHVWDWLVWLFV
1HW:DUHVHUYHUV SHUIRUPDQFHPRQLWRULQJ
%/2%ILOWHUVDQG SRLQWHUV
XVHUQDPHVUHWXUQLQJ 6HHDOVRFXUVRUV
QHWZRUN'//V ),/(VWUXFWXUH
18//SRLQWHUV WUDQVDFWLRQV
18//VWDWXV 35(3$5(
18//YDOXHV SURJUDPPLQJ
DUUD\VDQG $3,DSSOLFDWLRQV ²
%/2%FROXPQV '64/DSSOLFDWLRQV ²
%/2%KDQGOHV HUURUKDQGOLQJ6HHHUURUV
H[WHQGHGGHVFULSWRUDUHDV :LQGRZVDSSOLFDWLRQV
QXPEHUV SURWHFWLQJGDWD6HHVHFXULW\
DOLJQPHQWDGGUHVVHV
E\WHRUGHULQJ
SURFHVVLQJLQ;64/'$V Q
180(5,&GDWDW\SH TXHULHV
'64/DSSOLFDWLRQVDQG 6HHDOVR64/
QXPHULFYDOXHV6HHYDOXHV DUUD\VDQG
'64/DSSOLFDWLRQV ²
O
2'66HHRQGLVNVWUXFWXUH R
RQGLVNVWUXFWXUH 5'%75$16$&7,216
UHWULHYLQJLQIRUPDWLRQDERXW UHDGLQJ%/2%GDWD ²
23(1 %/2%ILOWHUVDQG
RSHQLQJ UHDGLQJGDWD ²
%/2%V UHFRYHULQJGDWD
FXUVRUV UHTXHVWEXIIHUV ²""
RXWSXW GHILQHG
HUURUPHVVDJHV UHVHWWLQJ%/2%,'V
RXWSXWGHVFULSWRUV6HH;64/'$V UHVXOWEXIIHUV ²""
RXWSXWILHOGV %/2%V ²
%/2%ILOWHUV GHILQHG
UHWULHYLQJGDWD
'64/DSSOLFDWLRQV
P VHOHFWHGURZV
SDUDPHWHUV UHYHUVLQJE\WHRUGHU
'3%V UROOEDFNV
'64/VWDWHPHQWV 6HHDOVRWUDQVDFWLRQV
LQSXW URXWLQHV
64/VWDWHPHQWV %/2%ILOWHUV
SURFHVVLQJZLWKQR ²² HUURUKDQGOLQJ
WUDQVDFWLRQSDUDPHWHUEXIIHUV 73%V ² 64/
viii INTERBASE 5
WUDQVDFWLRQV 6HHDOVR18//YDOXHV
DFFHVVPRGHV QXPHULFGHVFULSWRUV
DFFHVVLQJWDEOHV ² 9$5&+$5GDWDW\SH
FRPPLWWLQJ '64/DSSOLFDWLRQVDQG
H[HFXWLQJWZRSKDVHFRPPLWV YDULDEOHOHQJWKGDWDSURFHVVLQJ
UHWDLQLQJFRQWH[W YHFWRUJUDSKLFILOHVVXSSRUWHG
HQGLQJ YHUVLRQQXPEHUV
HYHQWVDQG GDWDEDVHV
LVRODWLRQOHYHOV ² RQGLVNVWUXFWXUH
OLPER WUDQVDFWLRQSURFHVVLQJ
ORFNLQJFRQIOLFWV YLGHRILOHVVXSSRUWHG
PXOWLSOHGDWDEDVHV YLGHRVHJPHQWV
RSWLPL]LQJ YLHZV
UHIHUHQFLQJ DUUD\VDQG
UHWULHYLQJLQIRUPDWLRQDERXW
UROOLQJEDFN
VLPXOWDQHRXV W
VSHFLI\LQJDWWULEXWHV ² :LQGRZVDSSOLFDWLRQV
VWDUWLQJ GHILQLQJGDWDW\SHV
VWDWXVPHVVDJHV HYHQWQRWLILFDWLRQ
WUDQVDFWLRQH[LVWHQFHEORFNV 7(%V VHWWLQJGHIDXOWGLUHFWRULHV
WUDQVDFWLRQSDUDPHWHUEORFNV 73%V ² :LQGRZVFOLHQWV
WUDSV ² DWWDFKLQJ
6HHDOVRHYHQWV HVWDEOLVKLQJSURJUDPSDUDPHWHUV
VHFXULW\
ZULWLQJGDWD
U WRDUUD\V ²
XQNQRZQGDWDW\SHV WR%/2%V
XQNQRZQVWDWHPHQWV %/2%ILOWHUVDQG
83'$7(
DUUD\V ²
%/2%GDWD ² X
'64/DSSOLFDWLRQV ;64/'$B/(1*7+PDFUR
XSGDWLQJ ;64/'$V ²
DUUD\V ² 6HHDOVR;64/9$5VWUXFWXUH
%/2%GDWD ² DGGUHVVDOLJQPHQW
XVHUQDPHV FRHUFLQJGDWDW\SHV ²
RYHUULGLQJ QXPEHUV
UHWULHYLQJLQIRUPDWLRQDERXW YDULDEOHOHQJWKGDWD
VXSSO\LQJDWUXQWLPH GHFODULQJ
:LQGRZVFOLHQWV ILHOGV
XVHUGHILQHG%/2%ILOWHUV LQSXWGHVFULSWRUV
XVHUGHILQHGW\SHV DOORFDWLQJ
%/2%GDWD DUUD\V
FUHDWLQJ
RXWSXWGHVFULSWRUV
V DOORFDWLQJ
YDOXHSDUDPHWHUV FUHDWLQJ
64/VWDWHPHQWV UHVL]LQJ
YDOXHV UHWULHYLQJ18//YDOXHV
API GUIDE ix
VHOHFWOLVWLWHPVDQG
DUUD\V
%/2%GDWD
VHWWLQJ18//YDOXHV
VSHFLI\LQJGDWDW\SHV ²
QXPEHUV
YDULDEOHOHQJWKGDWD
VWUXFWXUHV
;64/9$5VWUXFWXUH
DOORFDWLQJ
DUUD\V
%/2%GDWD
GDWDW\SHV
GHILQHG
ILHOGV
VHWWLQJXSVHOHFWOLVWLWHPV
x INTERBASE 5