//***************************************************************************** //*** CLI.PKG *** //*** *** //*** Author: Ben Weijers *** //*** Data Access Nederland *** //*** 10 September 1998 *** //*** *** //*** Purpose: *** //*** CLI specific functionality. There are several connectivity kits *** //*** based on SQL/92 CLI. Those are: *** //*** - ODBC_DRV The Data Access CK for ODBC *** //*** - DB2_DRV The Data Access CK for DB2 *** //*** - MSSQLDRV The Data Access CK for Microsoft SQL Server *** //*** *** //*** This package defines the common functionality for all CLI based *** //*** drivers. *** //***************************************************************************** //*** We are not using ifndef below becuase that is not supported in Character Mode //*** Driver attributes #IFDEF DF_FILE_TABLE_CHARACTER_FORMAT #ELSE #REPLACE DF_FILE_TABLE_CHARACTER_FORMAT |CI601 #ENDIF #IFDEF DF_FILE_MAX_ROWS_FETCHED #ELSE #REPLACE DF_FILE_MAX_ROWS_FETCHED |CI602 #ENDIF #IFDEF DF_FILE_PRIMARY_INDEX_TRIGGER #ELSE #REPLACE DF_FILE_PRIMARY_INDEX_TRIGGER |CI604 //*** Replaced by DF_FILE_GENERATE_RECORD_ID_METHOD ! #ENDIF #IFDEF DF_FILE_TRANSLATE_OEM_TO_ANSI #ELSE #REPLACE DF_FILE_TRANSLATE_OEM_TO_ANSI |CI606 //*** Deprecated !!! Only defined for decent error reporting #ENDIF #IFDEF DF_FILE_REFIND_AFTER_SAVE #ELSE #REPLACE DF_FILE_REFIND_AFTER_SAVE |CI608 #ENDIF #IFDEF DF_FILE_TABLE_NAME #ELSE #REPLACE DF_FILE_TABLE_NAME |CI609 #ENDIF #IFDEF DF_FILE_GET_RID_AFTER_CREATE #ELSE #REPLACE DF_FILE_GET_RID_AFTER_CREATE |CI610 #ENDIF #IFDEF DF_FILE_SQL_FILTER #ELSE #REPLACE DF_FILE_SQL_FILTER |CI611 #ENDIF #IFDEF DF_FILE_USE_DUMMY_ZERO_DATE #ELSE #REPLACE DF_FILE_USE_DUMMY_ZERO_DATE |CI612 #ENDIF #IFDEF DF_FILE_GENERATE_RECORD_ID_METHOD #ELSE #REPLACE DF_FILE_GENERATE_RECORD_ID_METHOD |CI614 #ENDIF #IFDEF DF_FILE_DUMMY_UPDATE_COLUMN #ELSE #REPLACE DF_FILE_DUMMY_UPDATE_COLUMN |CI616 #ENDIF #IFDEF DF_FILE_FETCH_ALL_COLUMNS #ELSE #REPLACE DF_FILE_FETCH_ALL_COLUMNS |CI620 #ENDIF #IFDEF DF_FILE_DATABASE_ID #ELSE #REPLACE DF_FILE_DATABASE_ID |CI622 #ENDIF #IFDEF DF_FILE_SQL_FILTER_ACTIVE #ELSE #REPLACE DF_FILE_SQL_FILTER_ACTIVE |CI624 #ENDIF #IFDEF DF_FILE_NUMBER_SQL_RELATIONS #ELSE #REPLACE DF_FILE_NUMBER_SQL_RELATIONS |CI626 #ENDIF #IFDEF DF_FIELD_STORE_TIME #ELSE #REPLACE DF_FIELD_STORE_TIME |CI702 #ENDIF #IFDEF DF_FIELD_TIME #ELSE #REPLACE DF_FIELD_TIME |CI703 #ENDIF #IFDEF DF_FIELD_IS_NULL #ELSE #REPLACE DF_FIELD_IS_NULL |CI704 #ENDIF #IFDEF DF_FIELD_NULL_ALLOWED #ELSE #REPLACE DF_FIELD_NULL_ALLOWED |CI706 #ENDIF #IFDEF DF_FIELD_DEFAULT_VALUE #ELSE #REPLACE DF_FIELD_DEFAULT_VALUE |CI707 #ENDIF #IFDEF DF_FIELD_FETCH_STATE #ELSE #REPLACE DF_FIELD_FETCH_STATE |CI708 #ENDIF #IFDEF DF_FIELD_READ_ONLY #ELSE #REPLACE DF_FIELD_READ_ONLY |CI710 #ENDIF #IFDEF DF_FIELD_NATIVE_TYPE_NAME #ELSE #REPLACE DF_FIELD_NATIVE_TYPE_NAME |CI711 #ENDIF #IFDEF DF_FIELD_NATIVE_TYPE #ELSE #REPLACE DF_FIELD_NATIVE_TYPE |CI712 #ENDIF #IFDEF DF_FIELD_NO_OEM_ANSI_TRANSLATE #ELSE #REPLACE DF_FIELD_NO_OEM_ANSI_TRANSLATE |CI714 #ENDIF #IFDEF DF_SQL_RELATION_COLUMN #ELSE #REPLACE DF_SQL_RELATION_COLUMN |CI716 #ENDIF #IFDEF DF_SQL_RELATION_RELATED_SCHEMA #ELSE #REPLACE DF_SQL_RELATION_RELATED_SCHEMA |CI717 #ENDIF #IFDEF DF_SQL_RELATION_RELATED_TABLE #ELSE #REPLACE DF_SQL_RELATION_RELATED_TABLE |CI719 #ENDIF #IFDEF DF_SQL_RELATION_RELATED_COLUMN #ELSE #REPLACE DF_SQL_RELATION_RELATED_COLUMN |CI721 #ENDIF #IFDEF DF_INDEX_NAME #ELSE #REPLACE DF_INDEX_NAME |CI801 #ENDIF #IFDEF DF_INDEX_UNIQUE #ELSE #REPLACE DF_INDEX_UNIQUE |CI802 #ENDIF #IFDEF DF_INDEX_ON_BACKEND #ELSE #REPLACE DF_INDEX_ON_BACKEND |CI804 #ENDIF #IFDEF DF_DATABASE_ID #ELSE #REPLACE DF_DATABASE_ID |CI1002 #ENDIF #IFDEF DF_DATABASE_NUMBER_TYPES #ELSE #REPLACE DF_DATABASE_NUMBER_TYPES |CI1004 #ENDIF #IFDEF DF_DATABASE_TYPE_NAME #ELSE #REPLACE DF_DATABASE_TYPE_NAME |CI1005 #ENDIF #IFDEF DF_DATABASE_TYPE_ID #ELSE #REPLACE DF_DATABASE_TYPE_ID |CI1006 #ENDIF #IFDEF DF_DATABASE_TYPE_AUTOINC #ELSE #REPLACE DF_DATABASE_TYPE_AUTOINC |CI1008 #ENDIF //*** Replacement for logical column number that indicates all columns #REPLACE DF_ALL_COLUMNS -1 //*** Possible DF_FILE_GENERATE_RECORD_ID_METHOD values #REPLACE RIM_NONE 0 #REPLACE RIM_IDENTITY_COLUMN 1 #REPLACE RIM_DISPENSER_TABLE 2 #REPLACE RIM_EXTERNAL 3 //*** Possible DF_FIELD_READ_ONLY values #REPLACE RO_NO 0 #REPLACE RO_IGNORECHANGE 1 #REPLACE RO_ACCEPTCHANGE 2 #REPLACE RO_ERRORONCHANGE 3 //*** Possible SQL Column type values Define SQL_UNKNOWN_TYPE For 0 Define SQL_CHAR For 1 Define SQL_NUMERIC For 2 Define SQL_DECIMAL For 3 Define SQL_INTEGER For 4 Define SQL_SMALLINT For 5 Define SQL_FLOAT For 6 Define SQL_REAL For 7 Define SQL_DOUBLE For 8 Define SQL_DATETIME For 9 Define SQL_VARCHAR For 12 Define SQL_TYPE_DATE For 91 Define SQL_TYPE_TIME For 92 Define SQL_TYPE_TIMESTAMP For 93 Define SQL_DATE For 9 Define SQL_INTERVAL For 10 Define SQL_TIME For 10 Define SQL_TIMESTAMP For 11 Define SQL_LONGVARCHAR For (-1) Define SQL_BINARY For (-2) Define SQL_VARBINARY For (-3) Define SQL_LONGVARBINARY For (-4) Define SQL_BIGINT For (-5) Define SQL_TINYINT For (-6) Define SQL_BIT For (-7) Define SQL_WCHAR For (-8) Define SQL_WVARCHAR For (-9) Define SQL_WLONGVARCHAR For (-10) Define SQL_GUID For (-11) //*** Driver level attributes #REPLACE DRVR_TOKEN_BASE |CI1000 #REPLACE DRVR_ATTRIBUTE_START (DRVR_TOKEN_BASE + |CI19) #REPLACE DRVR_DEFAULT_NULLABLE_ASCII (DRVR_ATTRIBUTE_START) #REPLACE DRVR_DEFAULT_NULLABLE_NUMERIC (DRVR_ATTRIBUTE_START + 1) #REPLACE DRVR_DEFAULT_NULLABLE_DATE (DRVR_ATTRIBUTE_START + 2) #REPLACE DRVR_DEFAULT_NULLABLE_TEXT (DRVR_ATTRIBUTE_START + 3) #REPLACE DRVR_DEFAULT_NULLABLE_BINARY (DRVR_ATTRIBUTE_START + 4) #REPLACE DRVR_DEFAULT_DEFAULT_ASCII (DRVR_ATTRIBUTE_START + 5) #REPLACE DRVR_DEFAULT_DEFAULT_NUMERIC (DRVR_ATTRIBUTE_START + 6) #REPLACE DRVR_DEFAULT_DEFAULT_DATE (DRVR_ATTRIBUTE_START + 7) #REPLACE DRVR_DEFAULT_DEFAULT_TEXT (DRVR_ATTRIBUTE_START + 8) #REPLACE DRVR_DEFAULT_DEFAULT_BINARY (DRVR_ATTRIBUTE_START + 9) #REPLACE DRVR_MAX_ACTIVE_STATEMENTS (DRVR_ATTRIBUTE_START + 10) #REPLACE DRVR_ERROR_DEBUG_MODE (DRVR_ATTRIBUTE_START + 11) #REPLACE DRVR_DRIVER_DECIMAL_SEPARATOR (DRVR_ATTRIBUTE_START + 12) #REPLACE DRVR_DRIVER_THOUSANDS_SEPARATOR (DRVR_ATTRIBUTE_START + 13) #REPLACE DRVR_DRIVER_DATE_FORMAT (DRVR_ATTRIBUTE_START + 14) #REPLACE DRVR_DRIVER_DATE_SEPARATOR (DRVR_ATTRIBUTE_START + 15) #REPLACE DRVR_USE_CACHE (DRVR_ATTRIBUTE_START + 16) #REPLACE DRVR_REPORT_CACHE_ERRORS (DRVR_ATTRIBUTE_START + 17) #REPLACE DRVR_CACHE_PATH (DRVR_ATTRIBUTE_START + 18) #REPLACE DRVR_USE_CACHE_EXPIRATION (DRVR_ATTRIBUTE_START + 19) #REPLACE DRVR_DEFAULT_TABLE_CHARACTER_FORMAT (DRVR_ATTRIBUTE_START + 20) #REPLACE DRVR_APPLICATION_CHARACTER_FORMAT (DRVR_ATTRIBUTE_START + 21) #REPLACE DRVR_DUMMY_ZERO_DATE_VALUE (DRVR_ATTRIBUTE_START + 22) #REPLACE DRVR_DEFAULT_USE_DUMMY_ZERO_DATE (DRVR_ATTRIBUTE_START + 23) #REPLACE DRVR_IGNORE_UCASE_SUPPORT (DRVR_ATTRIBUTE_START + 24) #REPLACE DRVR_LASTERRORTEXTLENGTH (DRVR_ATTRIBUTE_START + 25) #REPLACE DRVR_LASTERRORTEXT (DRVR_ATTRIBUTE_START + 26) #REPLACE DRVR_DEFAULTRECORDIDHIDING (DRVR_ATTRIBUTE_START + 35) #REPLACE DRVR_REPORTACTIVECOLUMNERRORS (DRVR_ATTRIBUTE_START + 36) //*** Error number constants #REPLACE CLIERR_GENERAL_ERROR 12289 #REPLACE CLIERR_CANT_INITIALIZE 12290 #REPLACE CLIERR_CANT_DEINITIALIZE 12291 #REPLACE CLIERR_BAD_OR_NO_PRIMARY_INDEX_SPECIFIED 12292 #REPLACE CLIERR_LOGIN_UNSUCCESSFUL 12293 #REPLACE CLIERR_LOGOUT_UNSUCCESSFUL 12294 #REPLACE CLIERR_TABLE_NOT_IN_CONNECTION 12295 #REPLACE CLIERR_NULL_VALUE_NOT_ALLOWED 12296 #REPLACE CLIERR_SEGMENT_NUMBER_RANGE 12297 #REPLACE CLIERR_INDEX_NUMBER_RANGE 12298 #REPLACE CLIERR_LOGIN_ATTRIBUTE_MUST_BE_SET 12299 #REPLACE CLIERR_PHYSICAL_NAME_MUST_BE_SET 12300 #REPLACE CLIERR_INVALID_REGISTRATION_FILE 12301 #REPLACE CLIERR_LICENSE_EXPIRED 12302 #REPLACE CLIERR_DEADLOCK_OR_TIMEOUT 12303 #REPLACE CLIERR_SQL_ERROR 12304 #REPLACE CLIERR_SQLINVALID_CLI_STMT_HANDLE 12305 #REPLACE CLIERR_SQLINVALID_CLI_CONN_HANDLE 12306 #REPLACE CLIERR_SQLINVALID_DRIVER_ID 12307 #REPLACE CLIERR_SQLINVALID_BIND_FILE 12308 #REPLACE CLIERR_SQLINVALID_COLUMN 12309 #REPLACE CLIERR_SQLINVALID_ATTRIBUTE 12310 #REPLACE CLIERR_SQLINVALID_BUFFER 12311 #REPLACE CLIERR_INVALID_CONFIGURATION_KEYWORD 12312 #REPLACE CLIERR_NOUNIQUEINDEX 12313 #REPLACE CLIERR_UCSEGMENT_NOT_SUPPORTED 12314 #REPLACE CLIERR_FIELDREADONLY 12315 #REPLACE CLIERR_DBPROPERROR 12316 #REPLACE CLIERR_CANTSETRECNUMINACTIVE 12317 #REPLACE CLIERR_CANTCHANGEINACTIVECOLUMN 12318 #REPLACE CLIERR_FIELDISINACTIVE 12319 #REPLACE CLIERR_NOT_INSTALLED 12320 #REPLACE CLIERR_CANT_FIND_TERMLIST 12321 #REPLACE CLIERR_CANT_READ_TERMLIST 12322 #REPLACE CLIERR_MAX_USERS_EXCEEDED 12323 #REPLACE CLIERR_USER_COUNT_FILE_ERROR 12324 #REPLACE CLIERR_CANT_INIT_USER_COUNT 12325 #REPLACE CLIERR_USER_COUNT_FILE_NOT_FOUND 12326 #REPLACE CLIERR_USER_COUNT_FILE_CANT_READ 12327 #REPLACE CLIERR_USER_COUNT_FILE_CANT_DECRYPT 12328 #REPLACE CLIERR_USER_COUNT_FILE_BAD_VERSION 12329 #REPLACE CLIERR_CANTCREATE_RECNUMISZERO 12330 //*** Call driver function identifiers #REPLACE CLI_CONSTRAINT 10000 #REPLACE CLI_SETDRIVERATTRIBUTE 10001 #REPLACE CLI_GETDRIVERATTRIBUTE 10002 #REPLACE CLI_BROWSECONNECT 10003 #REPLACE CLI_DATASOURCES 10004 #REPLACE CLI_CKREVISION 10005 #REPLACE CLI_INITDATASOURCES 10006 #Replace CLI_ENUMERATE_TABLES 10007 #Replace CLI_TABLENAME 10008 #Replace CLI_TABLESCHEMA 10009 #Replace CLI_TABLETYPE 10010 #Replace CLI_TABLECOMMENT 10011 #Replace CLI_ENUMERATE_COLUMNS 10012 #Replace CLI_COLUMNNAME 10013 #Replace CLI_DUMPSTATUS 10014 #Replace CLI_READCONFIGURATION 10015 #Replace CLI_GETDBATTRIBUTE0 10016 #Replace CLI_GETDBATTRIBUTE 10017 #Replace CLI_GETREGNAME 10018 #Replace CLI_GETSERIALNUM 10019 #Replace CLI_GETMAXUSERS 10020 #Replace CLI_BCP 10021 #Replace CLI_DROPINDICES 10022 #Replace CLI_CREATEINDICES 10023 //*** Init data source types #REPLACE SQL_FETCH_ALL 2 #REPLACE SQL_FETCH_USER 31 #REPLACE SQL_FETCH_SYSTEM 32 //*** Dummy strings used in the commands #IFDEF CLI$StrDummy #ELSE String CLI$StrDummy 255 Integer CLI$IntDummy #ENDIF //***************************************************************************** //*** CLI_SetConstraint *** //*** *** //*** Setup a constraint for a file. *** //***************************************************************************** #COMMAND CLI_SetConstraint R R R . Call_driver !1 !3 Function CLI_Constraint Callback 0 Passing !2 CLI$StrDummy CLI$IntDummy Result CLI$IntDummy #ENDCOMMAND //***************************************************************************** //*** CLI_Set_Driver_Atrtribute / CLI_Get_Driver_Attribute *** //*** *** //*** Set or get an attribute at driver level. These attributes, when set, *** //*** will be set for the remainder of the session or until set again. To *** //*** permanently set driver level attributes change the driver *** //*** configuration file. *** //***************************************************************************** #COMMAND CLI_Get_Driver_Attribute R R "TO" R . Move (Repeat(Character(" "), 255)) To CLI$StrDummy Call_driver 0 !1 Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing CLI$StrDummy CLI$IntDummy !2 Result CLI$IntDummy Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !4 #ENDCOMMAND #COMMAND CLI_Set_Driver_Attribute R R "TO" R . Call_driver 0 !1 Function CLI_SETDRIVERATTRIBUTE Callback 0 Passing !4 CLI$StrDummy !2 Result CLI$IntDummy #ENDCOMMAND #COMMAND CLI_Get_Database_Attribute R R R #IFSAME !4 TO Move (Repeat(Character(" "), 255)) To CLI$StrDummy Call_driver 0 !1 Function CLI_GETDBATTRIBUTE Callback 0 Passing CLI$StrDummy !3 !2 Result CLI$IntDummy Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !5 #ELSE IFSAME !5 TO Move "" To CLI$StrDummy Call_driver 0 !1 Function CLI_GETDBATTRIBUTE0 Callback 0 Passing CLI$StrDummy CLI$StrDummy !4 Result CLI$IntDummy Move (Repeat(Character(" "), 255)) To CLI$StrDummy Call_driver 0 !1 Function CLI_GETDBATTRIBUTE Callback 0 Passing CLI$StrDummy !3 !2 Result CLI$IntDummy Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !6 #ENDIF #ENDCOMMAND //***************************************************************************** //*** Class : cCLIHandler *** //*** Purpose: An instance of this class can be used as a broker object to *** //*** call several CLI releated methods. *** //***************************************************************************** //Doc/ ClassLibrary=Common Class cCLIHandler Is An Array Procedure Construct_Object Integer iImage Forward Send Construct_object iImage //Doc/ Interface=Public Property String psDriverID Public "" End_Procedure // Construct_Object //*** //*** Fucntion: CKRevsion //*** Purpose : The revsion of a CLI Connectivity Kit //*** //Doc/ Interface=Public Function CKRevision Returns String Local String sDriverID Local String sRevision Local String sVoid Local Integer iRetval Get psDriverID To sDriverID If (sDRiverID <> "") Begin Move (Repeat(" ", 255)) To sRevision Call_Driver 0 sDRiverID Function CLI_CKREVISION Callback 0 Passing sRevision sVoid 0 Result iRetval End Function_Return sRevision End_Function // CKRevision //*** //*** Function: ExtractPartFromRevision //*** Purpose : Extarct the Nth part of a a.b.c.d revsion string. //*** //*** Returns : The part version number or -1 if there is no such part number. //*** //Doc/ Interface=Private Function ExtractPartFromRevision Integer iPartNum String sRevision Returns Integer Local Integer iPartRev Local Integer iCurrentPart Local Integer iSeparatorPos If (iPartNum > 4) ; Function_Return -1 Move 0 To iCurrentPart Repeat Move (Pos(".", sRevision)) To iSeparatorPos If (iSeparatorPos > 0) Begin Move (Left(sRevision, iSeparatorPos - 1)) To iPartRev Move (Right(sRevision, Length(sRevision) - iSeparatorPos)) To sRevision Increment iCurrentPart End Else If (sRevision <> "") Begin Move sRevision To iPartRev Move "" To sRevision Increment iCurrentPart End Else ; Move -1 To iPartRev Until (iCurrentPart >= iPartNum Or iPartRev = -1) Function_Return iPartRev End_Function // EcxtractPartFromRevision //*** //*** Function: CKMajorRevision //*** Purpose : Returns the major revision of the CK //*** //Doc/ Interface=Public Function CKMajorRevision Returns Integer Function_Return (ExtractPartFromRevision (Current_Object, 1, CKRevision(Current_Object))) End_Function // CKMajorRevision //*** //*** Function: CKMinorRevision //*** Purpose : Returns the minor revision of the CK //*** //Doc/ Interface=Public Function CKMinorRevision Returns Integer Function_Return (ExtractPartFromRevision (Current_Object, 2, CKRevision(Current_Object))) End_Function // CKMinorRevision //*** //*** Function: CKReleaseRevision //*** Purpose : Returns the release revision of the CK //*** //Doc/ Interface=Public Function CKReleaseRevision Returns Integer Function_Return (ExtractPartFromRevision (Current_Object, 3, CKRevision(Current_Object))) End_Function // CKReleaseRevision //*** //*** Function: CKBuildRevision //*** Purpose : Returns the major revision of the CK //*** //Doc/ Interface=Public Function CKBuildRevision Returns Integer Function_Return (ExtractPartFromRevision (Current_Object, 4, CKRevision(Current_Object))) End_Function // CKBuildRevision //*** //*** Function: IsMinimalRevision //*** Purpose : Determines if the CK conforms to a passed minimal revsion. //*** //Doc/ Interface=Public Function IsMinimalRevision Integer iMajor Integer iMinor Integer iRelease Integer iBuild Returns Integer If (iMajor < CKMajorRevision(Current_object)) ; Function_return (TRUE) Else If (iMajor = CKMajorRevision(Current_object)) Begin If (iMinor < CKMinorRevision(Current_object)) ; Function_return (TRUE) Else If (iMinor = CKMinorRevision(Current_object)) Begin If (iRelease < CKReleaseRevision(Current_object)) ; Function_return (TRUE) Else If (iRelease = CKReleaseRevision(Current_object) And iBuild <= CKBuildRevision(Current_object)) ; Function_return (TRUE) End End Function_Return (FALSE) End_Function // IsMinimalRevision //*** //*** Function: RegistrationName //*** Purpose : Returns the Connectiivty Kit registration name. //*** //Doc/ Interface=Public Function RegistrationName Returns String Local String sRegistration Local String sDRiverId Local String sVoid Local Integer iRetval Get psDriverID To sDriverID If (sDRiverID <> "") Begin Move (Repeat(" ", 255)) To sRegistration Call_Driver 0 sDRiverID Function CLI_GETREGNAME Callback 0 Passing sRegistration sVoid 0 Result iRetval End Function_Return sRegistration End_Function // RegistrationName //*** //*** Function: SerialNumber //*** Purpose : Returns the Connectiivty Kit serial number. //*** //Doc/ Interface=Public Function SerialNumber Returns Integer Local String sDRiverId Local String sVoid Local Integer iRetval Get psDriverID To sDriverID If (sDRiverID <> "") Begin Call_Driver 0 sDRiverID Function CLI_GETSERIALNUM Callback 0 Passing sVoid sVoid 0 Result iRetval End Function_Return iRetval End_Function // SerialNumber //*** //*** Function: MaxUsers //*** Purpose : Returns the Connectiivty Kit maximum number of users. //*** //Doc/ Interface=Public Function MaxUsers Returns Integer Local String sDRiverId Local String sVoid Local Integer iRetval Get psDriverID To sDriverID If (sDRiverID <> "") Begin Call_Driver 0 sDRiverID Function CLI_GETMAXUSERS Callback 0 Passing sVoid sVoid 0 Result iRetval End Function_Return iRetval End_Function // MaxUsers //*** //*** Procedure: DumpStatus //*** Purpose : Dump the current status of the drver in the passed disk file. //*** //Doc/ Interface=Public Procedure DumpStatus String sFileName Local String sVoid Local String sDriverID Local Integer iVoid Get psDriverID To sDriverID If (sDriverID <> "") ; Call_driver 0 sDriverID Function CLI_DUMPSTATUS Callback 0 Passing sFileName sVoid iVoid Result iVoid End_Procedure // DumpStatus //*** //*** Procedure: ReadConfiguration //*** Purpose : Reset all driver level configurable attributes to the //*** default value and then reread the configuration. //*** //Doc/ Interface=Public Procedure ReadConfiguration Local String sVoid Local String sDriverID Local Integer iVoid Get psDriverID To sDriverID If (sDriverID <> "") ; Call_driver 0 sDriverID Function CLI_READCONFIGURATION Callback 0 Passing sVoid sVoid iVoid Result iVoid End_Procedure // ReadConfiguration //*** //*** Function: TextToRIMValue //*** Purpose : Convert a text to the corresponding //*** Generate_Record_ID_Method attribute value //*** //Doc/ Interface=Public Function TextToRIMValue String sText Returns Integer If (sText = "None") ; Function_return RIM_NONE Else If (sText = "Identity Column") ; Function_return RIM_IDENTITY_COLUMN Else If (sText = "Dispenser Table") ; Function_return RIM_DISPENSER_TABLE Else If (sText = "External") ; Function_return RIM_EXTERNAL End_Function // TextToRIMValue //*** //*** Function: RIMValueTotext //*** Purpose : Convert a Generate_Record_ID_Method attribute value to the //*** corresponding text. //*** //Doc/ Interface=Public Function RIMValueToText Integer iAttrValue Returns String If (iAttrValue = RIM_NONE) ; Function_return "None" Else If (iAttrValue = RIM_IDENTITY_COLUMN) ; Function_return "Identity Column" Else If (iAttrValue = RIM_DISPENSER_TABLE) ; Function_return "Dispenser Table" Else If (iAttrValue = RIM_EXTERNAL) ; Function_return "External" End_Function // RIMValueToText //*** //*** Function: TextToROValue //*** Purpose : Convert a text to the corresponding //*** Generate_Record_ID_Method attribute value //*** //Doc/ Interface=Public Function TextToROValue String sText Returns Integer If (sText = "No") ; Function_return RO_NO Else If (sText = "Ignore Change") ; Function_return RO_IGNORECHANGE Else If (sText = "Accept Change") ; Function_return RO_ACCEPTCHANGE Else If (sText = "Error On Change") ; Function_return RO_ERRORONCHANGE End_Function // TextToRIMValue //*** //*** Function: ROValueTotext //*** Purpose : Convert a Generate_Record_ID_Method attribute value to the //*** corresponding text. //*** //Doc/ Interface=Public Function ROValueToText Integer iAttrValue Returns String If (iAttrValue = RO_NO) ; Function_return "No" Else If (iAttrValue = RO_IGNORECHANGE) ; Function_return "Ignore Change" Else If (iAttrValue = RO_ACCEPTCHANGE) ; Function_return "Accept Change" Else If (iAttrValue = RO_ERRORONCHANGE) ; Function_return "Error On Change" End_Function // RIMValueToText //*** //*** Function: LastDriverError //*** Purpose : Return the text f the last error geneated by the driver. //*** //Doc/ Interface=Public Function LastDriverError Returns String Local String sDriverID Local String sLastError Local String sLastErrorLength Local Integer iLastErrorLength Local Integer iVoid //*** Initialize Move "" To sLastError Get psDriverID To sDriverID If (sDriverID <> "") Begin //*** Get the text of the last error Move (Repeat(Character(" "), 14)) To sLastErrorlength Call_driver 0 sDriverID Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing sLastErrorLength iVoid DRVR_LASTERRORTEXTLENGTH Result iVoid Move (Left(sLastErrorLength, Pos(Character(0), sLastErrorLength) - 1)) To iLastErrorLength If (iLastErrorLength > 0) Begin Move (Repeat(Character(" "), iLastErrorLength + 1)) To sLastError Call_driver 0 sDriverID Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing sLastError iVoid DRVR_LASTERRORTEXT Result iVoid Move (Left(sLastError, Pos(Character(0), sLastError) - 1)) To sLastError End End Function_Return sLastError End_Function // LastDriverError //*** //*** Function: EnumerateTables //*** Purpose : Enumerate the tables in a database //*** //Doc/ Interface=Public Function EnumerateTables String sLogin Returns Integer Local String sDriver Local String sVoid Local Integer iNumTables Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") ; Call_driver 0 sDriver Function CLI_ENUMERATE_TABLES Callback 0 Passing sLogin sVoid iVoid Result iNumTables Function_Return iNumTables End_Function // EnumerateTables //*** //*** Function: TableName //*** Purpose : Returns the name of the table enumerated at the given position //*** //Doc/ Interface=Public Function TableName Integer iIndex Returns String Local String sDriver Local String sTableName Local String sVoid Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") Begin Move (Repeat(" ", 255)) To sTableName Call_driver 0 sDriver Function CLI_TABLENAME Callback 0 Passing sTableName sVoid iIndex Result iVoid End Function_Return sTableName End_Function // TableName //*** //*** Function: SchemaName //*** Purpose : Returns the name of the schema of the table enumerated at the given position //*** //Doc/ Interface=Public Function SchemaName Integer iIndex Returns String Local String sDriver Local String sSchemaName Local String sVoid Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") Begin Move (Repeat(" ", 255)) To sSchemaName Call_driver 0 sDriver Function CLI_TABLESCHEMA Callback 0 Passing sSchemaName sVoid iIndex Result iVoid End Function_Return sSchemaName End_Function // SchemaName //*** //*** Function: TableType //*** Purpose : Returns the type of the table enumerated at the given position. //*** Types can be "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", //*** "LOCAL TEMPORARY", "ALIAS", "SYNONYM" //*** //Doc/ Interface=Public Function TableType Integer iIndex Returns String Local String sDriver Local String sTableType Local String sVoid Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") Begin Move (Repeat(" ", 25)) To sTableType Call_driver 0 sDriver Function CLI_TABLETYPE Callback 0 Passing sTableType sVoid iIndex Result iVoid End Function_Return sTableType End_Function // TableType //*** //*** Function: TableComment //*** Purpose : Returns the comment of the table enumerated at the given position //*** //Doc/ Interface=Public Function TableComment Integer iIndex Returns String Local String sDriver Local String sTableComment Local String sVoid Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") Begin Move (Repeat(" ", 255)) To sTableComment Call_driver 0 sDriver Function CLI_TABLECOMMENT Callback 0 Passing sTableComment sVoid iIndex Result iVoid End Function_Return sTableComment End_Function // TableComment //*** //*** Function: EnumerateColumns //*** Purpose : Enumerate the columns in a table //*** //Doc/ Interface=Public Function EnumerateColumns String sLogin String sTableName Returns Integer Local String sDriver Local Integer iNumColumns Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") ; Call_driver 0 sDriver Function CLI_ENUMERATE_COLUMNS Callback 0 Passing sLogin sTablename iVoid Result iNumColumns Function_Return iNumColumns End_Function // EnumerateColumns //*** //*** Function: ColumnName //*** Purpose : Returns the name of the column enumerated at the given position //*** //Doc/ Interface=Public Function ColumnName Integer iIndex Returns String Local String sDriver Local String sColumnName Local String sVoid Local Integer iVoid Get psDriverID To sDriver If (sDriver <> "") Begin Move (Repeat(" ", 255)) To sColumnName Call_driver 0 sDriver Function CLI_COLUMNNAME Callback 0 Passing sColumnName sVoid iIndex Result iVoid End Function_Return sColumnName End_Function // ColumnName //*** //*** Function: CLIDFDateToSQLDate //*** Purpose : Convert a DataFlex date to a SQL date using the dummy zero date value. //*** //Doc/ Interface=Private Function CLIDFDateToSQLDate String sDRiver Date dDFDate Returns String Local String sSQLDate Local Integer iOrgDateFmt Local Integer iOrgDateSep //*** Change date format to military, SQL dates are military dates Get_Attribute DF_DATE_FORMAT To iOrgDateFmt Get_Attribute DF_DATE_SEPARATOR To iOrgDateSep Set_Attribute DF_DATE_FORMAT To DF_DATE_MILITARY Set_Attribute DF_DATE_SEPARATOR To (Ascii('-')) //*** We only need to convert if the date is 0 If (Integer(dDFDate = 0)) ; CLI_Get_Driver_Attribute sDRiver DRVR_DUMMY_ZERO_DATE_VALUE To sSQLDate Else ; Move dDFDate To sSQLDate //*** Change date format back to original Set_Attribute DF_DATE_FORMAT To iOrgDateFmt Set_Attribute DF_DATE_SEPARATOR To iOrgDateSep Function_Return sSQLDate End_Function // CLIDFDateToSQLDate //*** //*** Function: CLISQLDateToDFDate //*** Purpose : Convert a SQL date to a DataFlex date using the dummy zero date value. //*** //Doc/ Interface=Private Function CLISQLDateToDFDate String sDRiver String sSQLDate Returns Date Local Date dDFDate Local String sDummyDateValue Local Integer iOrgDateFmt Local Integer iOrgDateSep //*** Change date format to military, SQL dates are military dates Get_Attribute DF_DATE_FORMAT To iOrgDateFmt Get_Attribute DF_DATE_SEPARATOR To iOrgDateSep Set_Attribute DF_DATE_FORMAT To DF_DATE_MILITARY Set_Attribute DF_DATE_SEPARATOR To (Ascii('-')) //*** We only need to convert if the date is the dummy zero date value CLI_Get_Driver_Attribute sDRiver DRVR_DUMMY_ZERO_DATE_VALUE To sDummyDateValue If (sDummyDateValue = sSQLDate) ; Move 0 To dDFDate Else ; Move sSQLDate To dDFDate //*** Change date format back to original Set_Attribute DF_DATE_FORMAT To iOrgDateFmt Set_Attribute DF_DATE_SEPARATOR To iOrgDateSep Function_Return dDFDate End_Function // CLISQLDateToDFDate End_Class // cCLIHandler