' odbc_test.bas v1.0b29.23
' ScriptBasic ODBC module test program
' ------------------------------------------------------------------------
' 1.0b29 is the version of ScriptBasic (with ODBC module) to test
' subversion 23 identifies this particular version of odbc_test.bas
' ------------------------------------------------------------------------
' Copyright (c) Gábor Pohl (2002)
' All rights reserved.
'
' Redistribution and use in source and binary forms, with or without
' modification, are permitted provided that the following conditions
' are met:
' 1. Redistributions of source code must retain the above copyright
' notice, this list of conditions and the following disclaimer.
' 2. Redistributions in binary form must reproduce the above copyright
' notice, this list of conditions and the following disclaimer in the
' documentation and/or other materials provided with the distribution.
' 3. The names of contributors may not be used to endorse or promote
' products derived from this software without specific prior written
' permission.
'
' THIS SOFTWARE IS PROVIDED ``AS IS'' AND
' ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
' IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
' ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE
' FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
' DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
' OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
' HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
' LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
' OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
' SUCH DAMAGE.
' ------------------------------------------------------------------------
import odbc.bas
' *************************************************************************
' odbctest config
' *************************************************************************
' ODBC data source parameters
' DSN_? is the "Data Source Name" parameter of ODBC::Connect and ODBC::RealConnect
' USER_? and PASS_? are only used in ODBC::RealConnect
DSN[1]="odbctest"
USER[1]="odbctest"
PASS[1]="pwd"
DSN[2]="odbctest2"
USER[2]="odbctest"
PASS[2]="pwd"
NUM_OF_DATA_SOURCES = 2
' *************************************************************************
' End of odbctest config
' *************************************************************************
'-------------------------------------------------------------------------
' START OF MAIN CODE
'-------------------------------------------------------------------------
print
print "\n#########################################################################\n"
print "! STARTING SCRIPTBASIC ODBC MODULE TEST PROGRAM v1.0b29.23"
print "\n#########################################################################\n"
print
print
print "\n#########################################################################\n"
print "! Connecting to ODBC data sourcees using ODBC::RealConnect..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> DB[",i,"] = ODBC::RealConnect(DSN[",i,"], USER[",i,"], PASS[",i,"])\n"
DB[i] = ODBC::RealConnect(DSN[i], USER[i], PASS[i])
print "DB[",i,"] = ",DB[i],"\n"
NEXT
print
print "\n#########################################################################\n"
print "! Creating table Person in all data sources..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"CREATE TABLE Person (LastName varchar(30), FirstName varchar(30), Age smallint, ID integer)\"\n"
ODBC::Query DB[i],"CREATE TABLE Person (LastName varchar(30), FirstName varchar(30), Age smallint, ID integer)"
NEXT
print
print "\n#########################################################################\n"
print "! Creating table Phone in all data sources..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"CREATE TABLE Phone (ID int, Phone varchar(30))\"\n"
ODBC::Query DB[i],"CREATE TABLE Phone (ID integer, Phone varchar(30))"
NEXT
print
print "\n#########################################################################\n"
print "! Populating table Person in all data sources..."
print "\n#########################################################################\n"
print
lname[1] = "Smith"
fname[1] = "Peter"
age[1] = 33
lname[2] = "Pan"
fname[2] = "Peter"
age[2] = 40
lname[3] = "Smith"
fname[3] = "John"
age[3] = 30
lname[4] = "Plymouth"
fname[4] = "Mary"
age[4] = 52
lname[5] = "McGill"
fname[5] = "Ann"
age[5] = 15
lname[6] = "McGill"
fname[6] = "Donald"
age[6] = 17
'id is assigned in the loop that populates the table
NUM_OF_PEOPLE = 6
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
FOR j=1 TO NUM_OF_PEOPLE STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"INSERT INTO Person (LastName,FirstName,Age,ID) VALUES ('"&lname[j]&"', '"&fname[j]&"', "&age[j]&", "&j&")\"\n"
ODBC::Query DB[i],"INSERT INTO Person (LastName,FirstName,Age,ID) VALUES ('"&lname[j]&"', '"&fname[j]&"', "&age[j]&", "&j&")"
print "Number of affected rows = ",ODBC::AffectedRows(DB[i]),"\n"
NEXT
NEXT
print
print "\n#########################################################################\n"
print "! Populating table Phone in all data sources..."
print "\n#########################################################################\n"
print
id[1] = 1
phone[1] = "12345678"
id[2] = 2
phone[2] = "23456789"
id[3] = 2
phone[3] = "23456788"
id[4] = 2
phone[4] = "23456787"
id[5] = 3
phone[5] = "34567890"
id[6] = 4
phone[6] = "45678901"
id[7] = 5
phone[7] = "5678"
id[8] = 6
phone[8] = "5678"
NUM_OF_PHONES = 8
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
FOR j=1 TO NUM_OF_PHONES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"INSERT INTO Phone (ID,Phone) VALUES ("&id[j]&", '"&phone[j]&"')\"\n"
ODBC::Query DB[i],"INSERT INTO Phone (ID,Phone) VALUES ("&id[j]&", '"&phone[j]&"')"
print "Number of affected rows = ",ODBC::AffectedRows(DB[i]),"\n"
NEXT
NEXT
print
print "\n#########################################################################\n"
print "! Selecting all data from table Person in all data sources...\n"
print "! Printing tables using both ODBC::FetchArray(...) and ODBC::FetchHash(...)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT * FROM Person\"\n"
ODBC::Query DB[i],"SELECT * FROM Person"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Selecting only 3 columns from table Person in all data sources...\n"
print "! Printing tables using both ODBC::FetchArray(...) and ODBC::FetchHash(...)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT LastName,FirstName,ID FROM Person\"\n"
ODBC::Query DB[i],"SELECT LastName,FirstName,ID FROM Person"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Listing each person's name and phone number\n"
print "! Printing tables using both ODBC::FetchArray(...) and ODBC::FetchHash(...)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT LastName, FirstName, Phone FROM Person, Phone WHERE Person.ID = Phone.ID\"\n"
ODBC::Query DB[i],"SELECT LastName, FirstName, Phone FROM Person, Phone WHERE Person.ID = Phone.ID"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Doing a SELECT that returns an empty table...\n"
print "! Printing tables using both ODBC::FetchArray(...) and ODBC::FetchHash(...)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT * FROM Phone WHERE ID = 987654321\"\n"
ODBC::Query DB[i],"SELECT * FROM Phone WHERE ID = 987654321"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Testing COUNT... \n"
print " Select will return the number of people over 18 in table Person."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT COUNT(*) FROM Person WHERE Age >= 18\"\n"
ODBC::Query DB[i],"SELECT COUNT(*) FROM Person WHERE Age >= 18"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Testing UPDATE... (1)\n"
print "! Making every person a year older in table Person."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"UPDATE Person SET Age = Age + 1\"\n"
ODBC::Query DB[i],"UPDATE Person SET Age = Age + 1"
print "Number of affected rows = ",ODBC::AffectedRows(DB[i]),"\n"
print "Printing table after update.\n"
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT * FROM Person\"\n"
ODBC::Query DB[i],"SELECT * FROM Person"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Testing UPDATE... (2)\n"
print "! Making every person under 50 a year older in table Person. "
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"UPDATE Person SET Age = Age + 1 WHERE Age < 50\"\n"
ODBC::Query DB[i],"UPDATE Person SET Age = Age + 1 WHERE Age < 50"
print "Number of affected rows = ",ODBC::AffectedRows(DB[i]),"\n"
print "Printing table after update.\n"
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT * FROM Person\"\n"
ODBC::Query DB[i],"SELECT * FROM Person"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! Closing data sources... (We will reconnect to them.)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print ">ODBC::Close DB[",i,"]\n"
ODBC::Close DB[i]
NEXT
print
print "\n#########################################################################\n"
print "! Reconnecting to ODBC data sourcees using ODBC::Connect..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> DB[",i,"] = ODBC::Connect(DSN[",i,"])\n"
DB[i] = ODBC::Connect(DSN[i])
print "DB[",i,"] = ",DB[i],"\n"
NEXT
print
print "\n#########################################################################\n"
print "! Reconnecting using ODBC::Connect without closing open connections ..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> DB[",i,"] = ODBC::Connect(DSN[",i,"])\n"
DB[i] = ODBC::Connect(DSN[i])
print "DB[",i,"] = ",DB[i],"\n"
NEXT
print
print "\n#########################################################################\n"
print "! Testing DELETE... (2)\n"
print "! Deleting all McGills from table Person"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"DELETE FROM Person WHERE LastName = 'McGill'\"\n"
ODBC::Query DB[i],"DELETE FROM Person WHERE LastName = 'McGill'"
print "Number of affected rows = ",ODBC::AffectedRows(DB[i]),"\n"
print "Printing table after delete.\n"
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT * FROM Person\"\n"
ODBC::Query DB[i],"SELECT * FROM Person"
CALL PrintTable(DB[i])
NEXT
print
print "\n#########################################################################\n"
print "! NOW ERROR CODES ARE EXAMINED, SO IT IS ALL RIGHT IF YOU SEE ERRORS."
print "\n#########################################################################\n"
print
' *************************************************************************
' THE FOLLOWING CODE CAUSES A SERIOUS ERROR
' (scriba.exe is terminated by the OS)
' *************************************************************************
'
'print
'print "\n#########################################################################\n"
'print "! Trying to connect to an unconfigured connectinon using ODBC::Connect"
'print "\n#########################################################################\n"
'print
'
'on error goto ErrorHappened2
'print "> DB_N = ODBC::Connect(\"DSN_not_in_config\")\n"
'DB_N = ODBC::Connect("DSN_not_in_config")
'
' *************************************************************************
' END OF CODE CAUSING SERIOUS ERROR
' *************************************************************************
print
print "\n#########################################################################\n"
print "! Trying to connect to an unconfigured connectinon using ODBC::RealConnect"
print "\n#########################################################################\n"
print
on error goto ErrorHappened2
print "> DB_N = ODBC::RealConnect(\"DSN_not_in_config\", \"user\", \"pass\")\n"
DB_N = ODBC::RealConnect("DSN_not_in_config", "user", "pass")
print
print "\n#########################################################################\n"
print "! Trying to connect to badly configured connectinon using ODBC::Connect"
print "\n! The resource is not registered in the ODBC Driver Manager "
print "\n#########################################################################\n"
print
on error goto ErrorHappened2
print "> DB_N = ODBC::Connect(\"badodbctest\")\n"
DB_N = ODBC::Connect("badodbctest")
' *************************************************************************
' THE FOLLOWING CODE CAUSES A SERIOUS ERROR
' (scriba.exe is terminated by the OS)
' *************************************************************************
'
'print
'print "\n#########################################################################\n"
'print "! Trying to connect to badly configured connectinon using ODBC::Connect"
'print "\n! The resource configuration is not valid in scriba.conf "
'print "\n#########################################################################\n"
'print
'on error goto ErrorHappened2
'print "> DB_N = ODBC::Connect(\"badodbctest2\")\n"
'DB_N = ODBC::Connect("badodbctest2")
'
' *************************************************************************
' END OF CODE CAUSING SERIOUS ERROR
' *************************************************************************
print
print "\n#########################################################################\n"
print "! Testing query execution error on all connceted resources (1)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"CREATE LIGHT\"\n"
ODBC::Query DB[i],"CREATE LIGHT"
NEXT
print
print "\n#########################################################################\n"
print "! Testing query execution error on all connceted resources (2)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"SELECT nice_girls FROM Person WHERE Age>=18 AND Age<=22\"\n"
ODBC::Query DB[i],"SELECT nice_girls FROM Person WHERE Age>=18 AND Age<=22"
NEXT
print
print "\n#########################################################################\n"
print "! Trying to call FetchArray with an argument that does not evaluate to lvalue."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::FetchArray(DB[i], 1)\n"
ODBC::FetchArray(DB[i], 1)
NEXT
print
print "\n#########################################################################\n"
print "! Trying to call FetchHash with an argument that does not evaluate to lvalue."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::FetchHash(DB[i], 1)\n"
ODBC::FetchHash(DB[i], 1)
NEXT
print
print "\n#########################################################################\n"
print "! Closing data sources... (We will reconnect to them.)"
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print ">ODBC::Close DB[",i,"]\n"
ODBC::Close DB[i]
NEXT
print
print "\n#########################################################################\n"
print "! Reconnecting to ODBC data sourcees using ODBC::Connect..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> DB[",i,"] = ODBC::Connect(DSN[",i,"])\n"
DB[i] = ODBC::Connect(DSN[i])
print "DB[",i,"] = ",DB[i],"\n"
NEXT
print
print "\n#########################################################################\n"
print "! Trying to call FetchArray without a preceeding query execution."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::FetchArray(DB[i],arr)\n"
ODBC::FetchArray(DB[i],arr)
NEXT
print
print "\n#########################################################################\n"
print "! Trying to call FetchHash without a preceeding query execution."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::FetchHash(DB[i],arr)\n"
ODBC::FetchHash(DB[i],arr)
NEXT
print
print "\n#########################################################################\n"
print "! END OF ERROR CODE TESTING"
print "\n#########################################################################\n"
print
print
print "\n#########################################################################\n"
print "! Dropping table Person in all data sources..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"DROP TABLE Person\"\n"
ODBC::Query DB[i],"DROP TABLE Person"
NEXT
print
print "\n#########################################################################\n"
print "! Dropping table Phone in all data sources..."
print "\n#########################################################################\n"
print
FOR i=1 TO NUM_OF_DATA_SOURCES STEP 1
on error goto ErrorHappened
print "> ODBC::Query DB[",i,"],\"DROP TABLE Phone\"\n"
ODBC::Query DB[i],"DROP TABLE Phone"
NEXT
' *************************************************************************
' THE FOLLOWING CODE CAUSES A SERIOUS ERROR
' (scriba.exe is terminated by the OS)
' *************************************************************************
'
'print
'print "\n#########################################################################\n"
'print "! Trying to query a closed connection"
'print "\n#########################################################################\n"
'print
'on error goto ErrorHappened
'print "> ODBC::Query 1,\"DROP TABLE Person\"\n"
'ODBC::Query 1,"DROP TABLE Person"
'
' *************************************************************************
' END OF CODE CAUSING SERIOUS ERROR
' *************************************************************************
print
print "\n#########################################################################\n"
print "! END OF SCRIPTBASIC ODBC MODULE TEST PROGRAM"
print "\n#########################################################################\n"
print
print "I suggest you redirect the output of this program to a text file \n"
print "for easier examination.\n"
print "To do so run the following command:\n"
print "scriba odbctest.bas > odbctest_result.txt\n"
END
'-------------------------------------------------------------------------
' END OF MAIN CODE
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' ERROR HANDLER
'-------------------------------------------------------------------------
ErrorHappened:
print "\n*************************************************************************\n"
print "An error occured.\n"
print "Error code: 0x",hex(error()),"\n"
FOR error_index=1 TO NUM_OF_DATA_SOURCES STEP 1
If DB[error_index] <> undef then
print chomp(ODBC::Error(DB[error_index])),"\n"
End If
NEXT
print "*************************************************************************\n"
Resume next
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' ERROR HANDLER FOR TESTING ERROR CODES ON CONNECTION "DB_N"
'-------------------------------------------------------------------------
ErrorHappened2:
print "\n*************************************************************************\n"
print "An error occured.\n"
print "Error code: 0x",hex(error()),"\n"
If DB_N <> undef then
print chomp(ODBC::Error(DB_N)),"\n"
End If
print "*************************************************************************\n"
Resume next
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' SUB PrintTable(DB) prints out the result of a select statement
'-------------------------------------------------------------------------
SUB PrintTable(DB)
local arr
local R
local i
local u
local column
R = ODBC::FetchHash(DB,arr)
If (R = 0) then
print "No result.\n"
Else
'getting column names
u = ubound(arr)
FOR i = 0 TO u STEP 2
column[i/2] = arr[i]
NEXT
'printing header
print "-------------------------------------------------------------------------\n"
u = ubound(column)
FOR i = 0 TO u-1 STEP 1
print column[i], " | "
NEXT
print column[u], "\n"
print "-------------------------------------------------------------------------\n"
'printing first raw
u = ubound(column)
FOR i = 0 TO u-1 STEP 1
print arr{column[i]}, " | "
NEXT
print arr{column[u]}, "\n"
'printing all other raws using ODBC::FetchArray(DB,arr)
Do While ODBC::FetchArray(DB,arr)
print join(" | ",arr),"\n"
Loop
End If
print "-------------------------------------------------------------------------\n\n"
END SUB