Module cli.pkg

     1//*****************************************************************************
     2//*** CLI.PKG                                                               ***
     3//***                                                                       ***
     4//*** Author: Ben Weijers                                                   ***
     5//***         Data Access Nederland                                         ***
     6//***         10 September 1998                                             ***
     7//***                                                                       ***
     8//*** Purpose:                                                              ***
     9//***   CLI specific functionality. There are several connectivity kits     ***
    10//***   based on  SQL/92 CLI. Those are:                                    ***
    11//***    - ODBC_DRV  The Data Access CK for ODBC                            ***
    12//***    - DB2_DRV   The Data Access CK for DB2                             ***
    13//***    - MSSQLDRV  The Data Access CK for Microsoft SQL Server            ***
    14//***                                                                       ***
    15//***   This package defines the common functionality for all CLI based     ***
    16//***   drivers.                                                            ***
    17//***                                                                       ***
    18//***   Updated:  May 23rd 2008 (Current CK build: 5.0.0.53 )               ***
    19//***             Added NULLABLE and DEFAULT attributes for DATETIME type   ***
    20//***   Updated:  Apr  6th 2009 (Current CK build: 5.0.0.61 )               ***
    21//***             Added DF_DRIVER_MATCH_CLIENT_SERVER_VERSION attribute     ***
    22//***                   DF_DRIVER_SQLSERVER_CLIENT_VERSION    attribute     ***
    23//*****************************************************************************
    24
    25
    26//*** We are not using ifndef below becuase that is not supported in Character Mode
    27//*** Driver attributes
    28#IFDEF DF_FILE_TABLE_CHARACTER_FORMAT
    29#ELSE
    30    #REPLACE DF_FILE_TABLE_CHARACTER_FORMAT    |CI601
    31#ENDIF
    32#IFDEF DF_FILE_MAX_ROWS_FETCHED
    33#ELSE
    34    #REPLACE DF_FILE_MAX_ROWS_FETCHED          |CI602
    35#ENDIF
    36#IFDEF DF_FILE_PRIMARY_INDEX_TRIGGER
    37#ELSE
    38    #REPLACE DF_FILE_PRIMARY_INDEX_TRIGGER     |CI604      //*** Replaced by DF_FILE_GENERATE_RECORD_ID_METHOD !
    39#ENDIF
    40#IFDEF DF_FILE_TRANSLATE_OEM_TO_ANSI
    41#ELSE
    42    #REPLACE DF_FILE_TRANSLATE_OEM_TO_ANSI     |CI606      //*** Deprecated !!! Only defined for decent error reporting
    43#ENDIF
    44#IFDEF DF_FILE_REFIND_AFTER_SAVE
    45#ELSE
    46    #REPLACE DF_FILE_REFIND_AFTER_SAVE         |CI608
    47#ENDIF
    48#IFDEF DF_FILE_TABLE_NAME
    49#ELSE
    50    #REPLACE DF_FILE_TABLE_NAME                |CI609
    51#ENDIF
    52#IFDEF DF_FILE_GET_RID_AFTER_CREATE
    53#ELSE
    54    #REPLACE DF_FILE_GET_RID_AFTER_CREATE      |CI610
    55#ENDIF
    56#IFDEF DF_FILE_SQL_FILTER
    57#ELSE
    58    #REPLACE DF_FILE_SQL_FILTER                |CI611
    59#ENDIF
    60#IFDEF DF_FILE_USE_DUMMY_ZERO_DATE
    61#ELSE
    62    #REPLACE DF_FILE_USE_DUMMY_ZERO_DATE       |CI612
    63#ENDIF
    64#IFDEF DF_FILE_GENERATE_RECORD_ID_METHOD
    65#ELSE
    66    #REPLACE DF_FILE_GENERATE_RECORD_ID_METHOD |CI614
    67#ENDIF
    68#IFDEF DF_FILE_DUMMY_UPDATE_COLUMN
    69#ELSE
    70    #REPLACE DF_FILE_DUMMY_UPDATE_COLUMN       |CI616
    71#ENDIF
    72#IFDEF DF_FILE_FETCH_ALL_COLUMNS
    73#ELSE
    74    #REPLACE DF_FILE_FETCH_ALL_COLUMNS         |CI620
    75#ENDIF
    76#IFDEF DF_FILE_DATABASE_ID
    77#ELSE
    78    #REPLACE DF_FILE_DATABASE_ID               |CI622
    79#ENDIF
    80#IFDEF DF_FILE_SQL_FILTER_ACTIVE
    81#ELSE
    82    #REPLACE DF_FILE_SQL_FILTER_ACTIVE         |CI624
    83#ENDIF
    84#IFDEF DF_FILE_NUMBER_SQL_RELATIONS
    85#ELSE
    86    #REPLACE DF_FILE_NUMBER_SQL_RELATIONS      |CI626
    87#ENDIF
    88#IFDEF DF_FILE_BLOCK_SIZE
    89#ELSE
    90    #REPLACE DF_FILE_BLOCK_SIZE                |CI628
    91#ENDIF
    92#IFDEF DF_FILE_JIT_BINDING
    93#ELSE
    94    #REPLACE DF_FILE_JIT_BINDING               |CI630
    95#ENDIF
    96#IFDEF DF_FILE_FINDCACHE_HITS
    97#ELSE
    98    #REPLACE DF_FILE_FINDCACHE_HITS            |CI632
    99#ENDIF
   100#IFDEF DF_FILE_FINDCACHE_TIMEOUTS
   101#ELSE
   102    #REPLACE DF_FILE_FINDCACHE_TIMEOUTS        |CI634
   103#ENDIF
   104
   105
   106#IFDEF DF_FIELD_STORE_TIME
   107#ELSE
   108    #REPLACE DF_FIELD_STORE_TIME               |CI702
   109#ENDIF
   110#IFDEF DF_FIELD_TIME
   111#ELSE
   112    #REPLACE DF_FIELD_TIME                     |CI703
   113#ENDIF
   114#IFDEF DF_FIELD_IS_NULL
   115#ELSE
   116    #REPLACE DF_FIELD_IS_NULL                  |CI704
   117#ENDIF
   118#IFDEF DF_FIELD_NULL_ALLOWED
   119#ELSE
   120    #REPLACE DF_FIELD_NULL_ALLOWED             |CI706
   121#ENDIF
   122#IFDEF DF_FIELD_DEFAULT_VALUE
   123#ELSE
   124    #REPLACE DF_FIELD_DEFAULT_VALUE            |CI707
   125#ENDIF
   126#IFDEF DF_FIELD_FETCH_STATE
   127#ELSE
   128    #REPLACE DF_FIELD_FETCH_STATE              |CI708
   129#ENDIF
   130#IFDEF DF_FIELD_READ_ONLY
   131#ELSE
   132    #REPLACE DF_FIELD_READ_ONLY                |CI710
   133#ENDIF
   134#IFDEF DF_FIELD_NATIVE_TYPE_NAME
   135#ELSE
   136    #REPLACE DF_FIELD_NATIVE_TYPE_NAME         |CI711
   137#ENDIF
   138#IFDEF DF_FIELD_NATIVE_TYPE
   139#ELSE
   140    #REPLACE DF_FIELD_NATIVE_TYPE              |CI712
   141#ENDIF
   142#IFDEF DF_FIELD_NO_OEM_ANSI_TRANSLATE
   143#ELSE
   144    #REPLACE DF_FIELD_NO_OEM_ANSI_TRANSLATE    |CI714
   145#ENDIF
   146#IFDEF DF_SQL_RELATION_COLUMN
   147#ELSE
   148    #REPLACE DF_SQL_RELATION_COLUMN            |CI716
   149#ENDIF
   150#IFDEF DF_SQL_RELATION_RELATED_SCHEMA
   151#ELSE
   152    #REPLACE DF_SQL_RELATION_RELATED_SCHEMA    |CI717
   153#ENDIF
   154#IFDEF DF_FIELD_NATIVE_SIZE
   155#ELSE
   156    #REPLACE DF_FIELD_NATIVE_SIZE              |CI718
   157#ENDIF
   158#IFDEF DF_SQL_RELATION_RELATED_TABLE
   159#ELSE
   160    #REPLACE DF_SQL_RELATION_RELATED_TABLE     |CI719
   161#ENDIF
   162#IFDEF DF_SQL_RELATION_RELATED_COLUMN
   163#ELSE
   164    #REPLACE DF_SQL_RELATION_RELATED_COLUMN    |CI721
   165#ENDIF
   166
   167
   168#IFDEF DF_INDEX_NAME
   169#ELSE
   170    #REPLACE DF_INDEX_NAME                              |CI801
   171#ENDIF
   172#IFDEF DF_INDEX_UNIQUE
   173#ELSE
   174    #REPLACE DF_INDEX_UNIQUE                            |CI802
   175#ENDIF
   176#IFDEF DF_INDEX_ON_BACKEND
   177#ELSE
   178    #REPLACE DF_INDEX_ON_BACKEND                        |CI804
   179#ENDIF
   180
   181#IFDEF DF_DATABASE_LOCK_STATE
   182#ELSE
   183    #REPLACE DF_DATABASE_LOCK_STATE                     |CI1001
   184#ENDIF
   185#IFDEF DF_DATABASE_ID
   186#ELSE
   187    #REPLACE DF_DATABASE_ID                             |CI1002
   188#ENDIF
   189#IFDEF DF_DATABASE_MYSQLTABLETYPE
   190#ELSE
   191    #REPLACE DF_DATABASE_MYSQLTABLETYPE                 |CI1003
   192#ENDIF
   193#IFDEF DF_DATABASE_NUMBER_TYPES
   194#ELSE
   195    #REPLACE DF_DATABASE_NUMBER_TYPES                   |CI1004
   196#ENDIF
   197#IFDEF DF_DATABASE_TYPE_NAME
   198#ELSE
   199    #REPLACE DF_DATABASE_TYPE_NAME                      |CI1005
   200#ENDIF
   201#IFDEF DF_DATABASE_TYPE_ID
   202#ELSE
   203    #REPLACE DF_DATABASE_TYPE_ID                        |CI1006
   204#ENDIF
   205#IFDEF DF_DATABASE_TYPE_CREATE_PARAMS
   206#ELSE
   207    #REPLACE DF_DATABASE_TYPE_CREATE_PARAMS             |CI1007
   208#ENDIF
   209#IFDEF DF_DATABASE_TYPE_AUTOINC
   210#ELSE
   211    #REPLACE DF_DATABASE_TYPE_AUTOINC                   |CI1008
   212#ENDIF
   213#IFDEF DF_DATABASE_DEFAULT_DEFAULT_ASCII
   214#ELSE
   215    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_ASCII          |CI1009
   216#ENDIF
   217#IFDEF DF_DATABASE_TYPE_UNSIGNED
   218#ELSE
   219    #REPLACE DF_DATABASE_TYPE_UNSIGNED                  |CI1010
   220#ENDIF
   221#IFDEF DF_DATABASE_DEFAULT_DEFAULT_NUMERIC
   222#ELSE
   223    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_NUMERIC        |CI1011
   224#ENDIF
   225#IFDEF DF_DATABASE_TYPE_MAXSIZE
   226#ELSE
   227    #REPLACE DF_DATABASE_TYPE_MAXSIZE                   |CI1012
   228#ENDIF
   229#IFDEF DF_DATABASE_DEFAULT_DEFAULT_DATE
   230#ELSE
   231    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_DATE           |CI1013
   232#ENDIF
   233#IFDEF DF_DATABASE_DEFAULT_NULLABLE_ASCII
   234#ELSE
   235    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_ASCII         |CI1014
   236#ENDIF
   237#IFDEF DF_DATABASE_DEFAULT_DEFAULT_TEXT
   238#ELSE
   239    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_TEXT           |CI1015
   240#ENDIF
   241#IFDEF DF_DATABASE_DEFAULT_NULLABLE_NUMERIC
   242#ELSE
   243    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_NUMERIC       |CI1016
   244#ENDIF
   245#IFDEF DF_DATABASE_DEFAULT_DEFAULT_BINARY
   246#ELSE
   247    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_BINARY         |CI1017
   248#ENDIF
   249#IFDEF DF_DATABASE_DEFAULT_NULLABLE_DATE
   250#ELSE
   251    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_DATE          |CI1018
   252#ENDIF
   253#IFDEF DF_DATABASE_DUMMY_ZERO_DATE_VALUE
   254#ELSE
   255    #REPLACE DF_DATABASE_DUMMY_ZERO_DATE_VALUE          |CI1019
   256#ENDIF
   257#IFDEF DF_DATABASE_DEFAULT_NULLABLE_TEXT
   258#ELSE
   259    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_TEXT          |CI1020
   260#ENDIF
   261#IFDEF DF_DATABASE_DUPREC_STATE
   262#ELSE
   263    #REPLACE DF_DATABASE_DUPREC_STATE                   |CI1021
   264#ENDIF
   265#IFDEF DF_DATABASE_DEFAULT_NULLABLE_BINARY
   266#ELSE
   267    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_BINARY        |CI1022
   268#ENDIF
   269#IFDEF DF_DATABASE_MAX_ACTIVE_STATEMENTS
   270#ELSE
   271    #REPLACE DF_DATABASE_MAX_ACTIVE_STATEMENTS          |CI1024
   272#ENDIF
   273#IFDEF DF_DATABASE_DRIVER_DECIMAL_SEPARATOR
   274#ELSE
   275    #REPLACE DF_DATABASE_DRIVER_DECIMAL_SEPARATOR       |CI1026
   276#ENDIF
   277#IFDEF DF_DATABASE_DRIVER_THOUSANDS_SEPARATOR
   278#ELSE
   279    #REPLACE DF_DATABASE_DRIVER_THOUSANDS_SEPARATOR     |CI1028
   280#ENDIF
   281#IFDEF DF_DATABASE_DRIVER_DATE_FORMAT
   282#ELSE
   283    #REPLACE DF_DATABASE_DRIVER_DATE_FORMAT             |CI1030
   284#ENDIF
   285#IFDEF DF_DATABASE_DRIVER_DATE_SEPARATOR
   286#ELSE
   287    #REPLACE DF_DATABASE_DRIVER_DATE_SEPARATOR          |CI1032
   288#ENDIF
   289#IFDEF DF_DATABASE_IGNORE_UCASE_SUPPORT
   290#ELSE
   291    #REPLACE DF_DATABASE_IGNORE_UCASE_SUPPORT           |CI1034
   292#ENDIF
   293#IFDEF #IFDEF DF_DATABASE_INDEX_CREATE
   294#ELSE
   295    #REPLACE DF_DATABASE_INDEX_CREATE                   |CI1036
   296#ENDIF
   297#IFDEF DF_DATABASE_INDEX_DROP
   298#ELSE
   299    #REPLACE DF_DATABASE_INDEX_DROP                     |CI1038
   300#ENDIF
   301#IFDEF DF_DATABASE_INDEX_ASC
   302#ELSE
   303    #REPLACE DF_DATABASE_INDEX_ASC                      |CI1040
   304#ENDIF
   305#IFDEF DF_DATABASE_INDEX_DESC
   306#ELSE
   307    #REPLACE DF_DATABASE_INDEX_DESC                     |CI1042
   308#ENDIF
   309#IFDEF DF_DATABASE_COLUMN_CREATE_DEFAULTCLAUSE
   310#ELSE
   311    #REPLACE DF_DATABASE_COLUMN_CREATE_DEFAULTCLAUSE    |CI1044
   312#ENDIF
   313#IFDEF DF_DATABASE_DUPREC_ERRORNUMBER
   314#ELSE
   315    #REPLACE DF_DATABASE_DUPREC_ERRORNUMBER             |CI1046
   316#ENDIF
   317#IFDEF DF_DATABASE_USE_IDENTITY_TYPE
   318#ELSE
   319    #REPLACE DF_DATABASE_USE_IDENTITY_TYPE              |CI1048
   320#ENDIF
   321#IFDEF DF_DATABASE_NUMBER_NATIVE_LOCKERRORS
   322#ELSE
   323    #REPLACE DF_DATABASE_NUMBER_NATIVE_LOCKERRORS       |CI1050
   324#ENDIF
   325#IFDEF DF_DATABASE_NATIVE_LOCKERROR
   326#ELSE
   327    #REPLACE DF_DATABASE_NATIVE_LOCKERROR               |CI1052
   328#ENDIF
   329#IFDEF DF_DATABASE_DEFAULT_MAX_ROWS
   330#ELSE
   331    #REPLACE DF_DATABASE_DEFAULT_MAX_ROWS               |CI1054
   332#ENDIF
   333#IFDEF DF_DATABASE_IGNORE_WARNINGS
   334#ELSE
   335    #REPLACE DF_DATABASE_IGNORE_WARNINGS                |CI1056
   336#ENDIF
   337#IFDEF DF_DATABASE_USE_DF_LOCKERROR
   338#ELSE
   339    #REPLACE DF_DATABASE_USE_DF_LOCKERROR               |CI1058
   340#ENDIF
   341#IFDEF DF_DATABASE_FIND_CACHE_TIMEOUT
   342#ELSE
   343    #REPLACE DF_DATABASE_FIND_CACHE_TIMEOUT             |CI1060
   344#ENDIF
   345#IFDEF DF_DATABASE_JIT_TRESHOLD
   346#ELSE
   347    #REPLACE DF_DATABASE_JIT_TRESHOLD                   |CI1062
   348#ENDIF
   349#IFDEF DF_DATABASE_TRUNCATE_BINARY_ZEROES
   350#ELSE
   351    #REPLACE DF_DATABASE_TRUNCATE_BINARY_ZEROES         |CI1064
   352#ENDIF
   353#IFDEF DF_DATABASE_DEFAULT_DEFAULT_DATETIME
   354#ELSE
   355    #REPLACE DF_DATABASE_DEFAULT_DEFAULT_DATETIME       |CI1065
   356#ENDIF
   357#IFDEF DF_DATABASE_DEFAULT_NULLABLE_DATETIME
   358#ELSE
   359    #REPLACE DF_DATABASE_DEFAULT_NULLABLE_DATETIME      |CI1066
   360#ENDIF
   361//-------------------------------------
   362#IFDEF DF_DRIVER_DEFAULT_DEFAULT_ASCII
   363#ELSE
   364    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_ASCII            |CI1101
   365#ENDIF
   366#IFDEF DF_DRIVER_DEFAULT_NULLABLE_ASCII
   367#ELSE
   368    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_ASCII           |CI1102
   369#ENDIF
   370#IFDEF DF_DRIVER_DEFAULT_DEFAULT_NUMERIC
   371#ELSE
   372    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_NUMERIC          |CI1103
   373#ENDIF
   374#IFDEF DF_DRIVER_DEFAULT_NULLABLE_NUMERIC
   375#ELSE
   376    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_NUMERIC         |CI1104
   377#ENDIF
   378#IFDEF DF_DRIVER_DEFAULT_DEFAULT_DATE
   379#ELSE
   380    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_DATE             |CI1105
   381#ENDIF
   382#IFDEF DF_DRIVER_DEFAULT_NULLABLE_DATE
   383#ELSE
   384    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_DATE            |CI1106
   385#ENDIF
   386#IFDEF DF_DRIVER_DEFAULT_DEFAULT_TEXT
   387#ELSE
   388    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_TEXT             |CI1107
   389#ENDIF
   390#IFDEF DF_DRIVER_DEFAULT_NULLABLE_TEXT
   391#ELSE
   392    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_TEXT            |CI1108
   393#ENDIF
   394#IFDEF DF_DRIVER_DEFAULT_DEFAULT_BINARY
   395#ELSE
   396    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_BINARY           |CI1109
   397#ENDIF
   398#IFDEF DF_DRIVER_DEFAULT_NULLABLE_BINARY
   399#ELSE
   400    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_BINARY          |CI1110
   401#ENDIF
   402#IFDEF DF_DRIVER_DUMMY_ZERO_DATE_VALUE
   403#ELSE
   404    #REPLACE DF_DRIVER_DUMMY_ZERO_DATE_VALUE            |CI1111
   405#ENDIF
   406#IFDEF DF_DRIVER_MAX_ACTIVE_STATEMENTS
   407#ELSE
   408    #REPLACE DF_DRIVER_MAX_ACTIVE_STATEMENTS            |CI1112
   409#ENDIF
   410#IFDEF DF_DRIVER_CACHE_PATH
   411#ELSE
   412    #REPLACE DF_DRIVER_CACHE_PATH                       |CI1113
   413#ENDIF
   414#IFDEF DF_DRIVER_DRIVER_DECIMAL_SEPARATOR
   415#ELSE
   416    #REPLACE DF_DRIVER_DRIVER_DECIMAL_SEPARATOR         |CI1114
   417#ENDIF
   418#IFDEF DF_DRIVER_DEFAULT_TABLE_CHARACTER_FORMAT
   419#ELSE
   420    #REPLACE DF_DRIVER_DEFAULT_TABLE_CHARACTER_FORMAT   |CI1115
   421#ENDIF
   422#IFDEF DF_DRIVER_DRIVER_THOUSANDS_SEPARATOR
   423#ELSE
   424    #REPLACE DF_DRIVER_DRIVER_THOUSANDS_SEPARATOR       |CI1116
   425#ENDIF
   426#IFDEF DF_DRIVER_APPLICATION_CHARACTER_FORMAT
   427#ELSE
   428    #REPLACE DF_DRIVER_APPLICATION_CHARACTER_FORMAT     |CI1117
   429#ENDIF
   430#IFDEF DF_DRIVER_DRIVER_DATE_FORMAT
   431#ELSE
   432    #REPLACE DF_DRIVER_DRIVER_DATE_FORMAT               |CI1118
   433#ENDIF
   434#IFDEF DF_DRIVER_LAST_ERROR_TEXT
   435#ELSE
   436    #REPLACE DF_DRIVER_LAST_ERROR_TEXT                  |CI1119
   437#ENDIF
   438#IFDEF DF_DRIVER_DRIVER_DATE_SEPARATOR
   439#ELSE
   440    #REPLACE DF_DRIVER_DRIVER_DATE_SEPARATOR            |CI1120
   441#ENDIF
   442#IFDEF DF_DRIVER_CONNECTION_ID
   443#ELSE
   444    #REPLACE DF_DRIVER_CONNECTION_ID                    |CI1121
   445#ENDIF
   446#IFDEF DF_DRIVER_IGNORE_UCASE_SUPPORT
   447#ELSE
   448    #REPLACE DF_DRIVER_IGNORE_UCASE_SUPPORT             |CI1122
   449#ENDIF
   450#IFDEF DF_DRIVER_CONNECTION_ID_STRING
   451#ELSE
   452    #REPLACE DF_DRIVER_CONNECTION_ID_STRING             |CI1123
   453#ENDIF
   454#IFDEF DF_DRIVER_IGNORE_WARNINGS
   455#ELSE
   456    #REPLACE DF_DRIVER_IGNORE_WARNINGS                  |CI1124
   457#ENDIF
   458#IFDEF DF_DRIVER_USE_DF_LOCKERROR
   459#ELSE
   460    #REPLACE DF_DRIVER_USE_DF_LOCKERROR                 |CI1126
   461#ENDIF
   462#IFDEF DF_DRIVER_FIND_CACHE_TIMEOUT
   463#ELSE
   464    #REPLACE DF_DRIVER_FIND_CACHE_TIMEOUT               |CI1128
   465#ENDIF
   466#IFDEF DF_DRIVER_JIT_TRESHOLD
   467#ELSE
   468    #REPLACE DF_DRIVER_JIT_TRESHOLD                     |CI1130
   469#ENDIF
   470#IFDEF DF_DRIVER_TRUNCATE_BINARY_ZEROES
   471#ELSE
   472    #REPLACE DF_DRIVER_TRUNCATE_BINARY_ZEROES           |CI1132
   473#ENDIF
   474#IFDEF DF_DRIVER_ERROR_DEBUG_MODE
   475#ELSE
   476    #REPLACE DF_DRIVER_ERROR_DEBUG_MODE                 |CI1134
   477#ENDIF
   478#IFDEF DF_DRIVER_USE_CACHE
   479#ELSE
   480    #REPLACE DF_DRIVER_USE_CACHE                        |CI1136
   481#ENDIF
   482#IFDEF DF_DRIVER_REPORT_CACHE_ERRORS
   483#ELSE
   484    #REPLACE DF_DRIVER_REPORT_CACHE_ERRORS              |CI1138
   485#ENDIF
   486#IFDEF DF_DRIVER_USE_CACHE_EXPIRATION
   487#ELSE
   488    #REPLACE DF_DRIVER_USE_CACHE_EXPIRATION             |CI1140
   489#ENDIF
   490#IFDEF DF_DRIVER_DEFAULT_USE_DUMMY_ZERO_DATE
   491#ELSE
   492    #REPLACE DF_DRIVER_DEFAULT_USE_DUMMY_ZERO_DATE      |CI1142
   493#ENDIF
   494#IFDEF DF_DRIVER_DEFAULT_RECORD_IDENTITY_HIDING
   495#ELSE
   496    #REPLACE DF_DRIVER_DEFAULT_RECORD_IDENTITY_HIDING   |CI1144
   497#ENDIF
   498#IFDEF DF_DRIVER_REPORT_ACTIVE_COLUMN_ERRORS
   499#ELSE
   500    #REPLACE DF_DRIVER_REPORT_ACTIVE_COLUMN_ERRORS      |CI1146
   501#ENDIF
   502#IFDEF DF_DRIVER_SILENT_LOGIN
   503#ELSE
   504    #REPLACE DF_DRIVER_SILENT_LOGIN                     |CI1148
   505#ENDIF
   506#IFDEF DF_DRIVER_DEFAULT_MAP_TO_RECNUM
   507#ELSE
   508    #REPLACE DF_DRIVER_DEFAULT_MAP_TO_RECNUM            |CI1150
   509#ENDIF
   510#IFDEF DF_DRIVER_CONNECTION_ID_OPTIONS
   511#ELSE
   512    #REPLACE DF_DRIVER_CONNECTION_ID_OPTIONS            |CI1152
   513#ENDIF
   514#IFDEF DF_DRIVER_NUMBER_CONNECTION_IDS
   515#ELSE
   516    #REPLACE DF_DRIVER_NUMBER_CONNECTION_IDS            |CI1154
   517#ENDIF
   518#IFDEF DF_DRIVER_DEFAULT_DEFAULT_DATETIME
   519#ELSE
   520    #REPLACE DF_DRIVER_DEFAULT_DEFAULT_DATETIME         |CI1155
   521#ENDIF
   522#IFDEF DF_DRIVER_DEFAULT_NULLABLE_DATETIME
   523#ELSE
   524    #REPLACE DF_DRIVER_DEFAULT_NULLABLE_DATETIME        |CI1156
   525#ENDIF
   526#IFDEF DF_DRIVER_MATCH_CLIENT_SERVER_VERSION
   527#ELSE
   528    #REPLACE DF_DRIVER_MATCH_CLIENT_SERVER_VERSION      |CI1158
   529#ENDIF
   530#IFDEF DF_DRIVER_SQLSERVER_CLIENT_VERSION
   531#ELSE
   532    #REPLACE DF_DRIVER_SQLSERVER_CLIENT_VERSION         |CI1160
   533#ENDIF
   534
   535//*** Replacement for logical column number that indicates all columns
   536#REPLACE DF_ALL_COLUMNS -1
   537
   538//*** Possible DF_FILE_GENERATE_RECORD_ID_METHOD values
   539#REPLACE RIM_NONE            0
   540#REPLACE RIM_IDENTITY_COLUMN 1
   541#REPLACE RIM_DISPENSER_TABLE 2
   542#REPLACE RIM_EXTERNAL        3
   543
   544//*** Possible DF_FIELD_READ_ONLY values
   545#REPLACE RO_NO            0
   546#REPLACE RO_IGNORECHANGE  1
   547#REPLACE RO_ACCEPTCHANGE  2
   548#REPLACE RO_ERRORONCHANGE 3
   549
   550//*** Possible DF_DRIVER_SQLSERVER_CLIENT_VERSION values
   551#REPLACE SQLSERVERUNKNOWNCLIENT  0
   552#REPLACE SQLSERVER2000CLIENT     8          //   "SQL Server"
   553#REPLACE SQLSERVER2005CLIENT     9          //   "SQL Native Client"
   554#REPLACE SQLSERVER2008CLIENT    10          //   "SQL Server Native Client 10.0"
   555
   556//*** Possible SQL Column type values
   557Define SQL_UNKNOWN_TYPE   For    0
   558Define SQL_CHAR           For    1
   559Define SQL_NUMERIC        For    2
   560Define SQL_DECIMAL        For    3
   561Define SQL_INTEGER        For    4
   562Define SQL_SMALLINT       For    5
   563Define SQL_FLOAT          For    6
   564Define SQL_REAL           For    7
   565Define SQL_DOUBLE         For    8
   566Define SQL_DATETIME       For    9
   567Define SQL_VARCHAR        For   12
   568Define SQL_TYPE_DATE      For   91
   569Define SQL_TYPE_TIME      For   92
   570Define SQL_TYPE_TIMESTAMP For   93
   571
   572Define SQL_DATE           For    9
   573Define SQL_INTERVAL       For   10
   574Define SQL_TIME           For   10
   575Define SQL_TIMESTAMP      For   11
   576Define SQL_LONGVARCHAR    For  (-1)
   577Define SQL_BINARY         For  (-2)
   578Define SQL_VARBINARY      For  (-3)
   579Define SQL_LONGVARBINARY  For  (-4)
   580Define SQL_BIGINT         For  (-5)
   581Define SQL_TINYINT        For  (-6)
   582Define SQL_BIT            For  (-7)
   583Define SQL_WCHAR          For  (-8)
   584Define SQL_WVARCHAR       For  (-9)
   585Define SQL_WLONGVARCHAR   For (-10)
   586Define SQL_GUID           For (-11)
   587
   588//*** Driver level attributes
   589#REPLACE DRVR_TOKEN_BASE                        |CI1000
   590#REPLACE DRVR_ATTRIBUTE_START                   (DRVR_TOKEN_BASE + |CI19)
   591#REPLACE DRVR_DEFAULT_NULLABLE_ASCII            (DRVR_ATTRIBUTE_START)
   592#REPLACE DRVR_DEFAULT_NULLABLE_NUMERIC          (DRVR_ATTRIBUTE_START +  1)
   593#REPLACE DRVR_DEFAULT_NULLABLE_DATE             (DRVR_ATTRIBUTE_START +  2)
   594#REPLACE DRVR_DEFAULT_NULLABLE_TEXT             (DRVR_ATTRIBUTE_START +  3)
   595#REPLACE DRVR_DEFAULT_NULLABLE_BINARY           (DRVR_ATTRIBUTE_START +  4)
   596#REPLACE DRVR_DEFAULT_DEFAULT_ASCII             (DRVR_ATTRIBUTE_START +  5)
   597#REPLACE DRVR_DEFAULT_DEFAULT_NUMERIC           (DRVR_ATTRIBUTE_START +  6)
   598#REPLACE DRVR_DEFAULT_DEFAULT_DATE              (DRVR_ATTRIBUTE_START +  7)
   599#REPLACE DRVR_DEFAULT_DEFAULT_TEXT              (DRVR_ATTRIBUTE_START +  8)
   600#REPLACE DRVR_DEFAULT_DEFAULT_BINARY            (DRVR_ATTRIBUTE_START +  9)
   601#REPLACE DRVR_MAX_ACTIVE_STATEMENTS             (DRVR_ATTRIBUTE_START + 10)
   602#REPLACE DRVR_ERROR_DEBUG_MODE                  (DRVR_ATTRIBUTE_START + 11)
   603#REPLACE DRVR_DRIVER_DECIMAL_SEPARATOR          (DRVR_ATTRIBUTE_START + 12)
   604#REPLACE DRVR_DRIVER_THOUSANDS_SEPARATOR        (DRVR_ATTRIBUTE_START + 13)
   605#REPLACE DRVR_DRIVER_DATE_FORMAT                (DRVR_ATTRIBUTE_START + 14)
   606#REPLACE DRVR_DRIVER_DATE_SEPARATOR             (DRVR_ATTRIBUTE_START + 15)
   607#REPLACE DRVR_USE_CACHE                         (DRVR_ATTRIBUTE_START + 16)
   608#REPLACE DRVR_REPORT_CACHE_ERRORS               (DRVR_ATTRIBUTE_START + 17)
   609#REPLACE DRVR_CACHE_PATH                        (DRVR_ATTRIBUTE_START + 18)
   610#REPLACE DRVR_USE_CACHE_EXPIRATION              (DRVR_ATTRIBUTE_START + 19)
   611#REPLACE DRVR_DEFAULT_TABLE_CHARACTER_FORMAT    (DRVR_ATTRIBUTE_START + 20)
   612#REPLACE DRVR_APPLICATION_CHARACTER_FORMAT      (DRVR_ATTRIBUTE_START + 21)
   613#REPLACE DRVR_DUMMY_ZERO_DATE_VALUE             (DRVR_ATTRIBUTE_START + 22)
   614#REPLACE DRVR_DEFAULT_USE_DUMMY_ZERO_DATE       (DRVR_ATTRIBUTE_START + 23)
   615#REPLACE DRVR_IGNORE_UCASE_SUPPORT              (DRVR_ATTRIBUTE_START + 24)
   616#REPLACE DRVR_LASTERRORTEXTLENGTH               (DRVR_ATTRIBUTE_START + 25)
   617#REPLACE DRVR_LASTERRORTEXT                     (DRVR_ATTRIBUTE_START + 26)
   618#REPLACE DRVR_DEFAULTRECORDIDHIDING             (DRVR_ATTRIBUTE_START + 35)
   619#REPLACE DRVR_REPORTACTIVECOLUMNERRORS          (DRVR_ATTRIBUTE_START + 36)
   620
   621
   622//*** Error number constants
   623#REPLACE CLIERR_GENERAL_ERROR                         12289
   624#REPLACE CLIERR_CANT_INITIALIZE                       12290
   625#REPLACE CLIERR_CANT_DEINITIALIZE                     12291
   626#REPLACE CLIERR_BAD_OR_NO_PRIMARY_INDEX_SPECIFIED     12292
   627#REPLACE CLIERR_LOGIN_UNSUCCESSFUL                    12293
   628#REPLACE CLIERR_LOGOUT_UNSUCCESSFUL                   12294
   629#REPLACE CLIERR_TABLE_NOT_IN_CONNECTION               12295
   630#REPLACE CLIERR_NULL_VALUE_NOT_ALLOWED                12296
   631#REPLACE CLIERR_SEGMENT_NUMBER_RANGE                  12297
   632#REPLACE CLIERR_INDEX_NUMBER_RANGE                    12298
   633#REPLACE CLIERR_LOGIN_ATTRIBUTE_MUST_BE_SET           12299
   634#REPLACE CLIERR_PHYSICAL_NAME_MUST_BE_SET             12300
   635#REPLACE CLIERR_INVALID_REGISTRATION_FILE             12301
   636#REPLACE CLIERR_LICENSE_EXPIRED                       12302
   637#REPLACE CLIERR_DEADLOCK_OR_TIMEOUT                   12303
   638#REPLACE CLIERR_SQL_ERROR                             12304
   639#REPLACE CLIERR_SQLINVALID_CLI_STMT_HANDLE            12305
   640#REPLACE CLIERR_SQLINVALID_CLI_CONN_HANDLE            12306
   641#REPLACE CLIERR_SQLINVALID_DRIVER_ID                  12307
   642#REPLACE CLIERR_SQLINVALID_BIND_FILE                  12308
   643#REPLACE CLIERR_SQLINVALID_COLUMN                     12309
   644#REPLACE CLIERR_SQLINVALID_ATTRIBUTE                  12310
   645#REPLACE CLIERR_SQLINVALID_BUFFER                     12311
   646#REPLACE CLIERR_INVALID_CONFIGURATION_KEYWORD         12312
   647#REPLACE CLIERR_NOUNIQUEINDEX                         12313
   648#REPLACE CLIERR_UCSEGMENT_NOT_SUPPORTED               12314
   649#REPLACE CLIERR_FIELDREADONLY                         12315
   650#REPLACE CLIERR_DBPROPERROR                           12316
   651#REPLACE CLIERR_CANTSETRECNUMINACTIVE                 12317
   652#REPLACE CLIERR_CANTCHANGEINACTIVECOLUMN              12318
   653#REPLACE CLIERR_FIELDISINACTIVE                       12319
   654#REPLACE CLIERR_NOT_INSTALLED                         12320
   655#REPLACE CLIERR_CANT_FIND_TERMLIST                    12321
   656#REPLACE CLIERR_CANT_READ_TERMLIST                    12322
   657#REPLACE CLIERR_MAX_USERS_EXCEEDED                    12323
   658#REPLACE CLIERR_USER_COUNT_FILE_ERROR                 12324
   659#REPLACE CLIERR_CANT_INIT_USER_COUNT                  12325
   660#REPLACE CLIERR_USER_COUNT_FILE_NOT_FOUND             12326
   661#REPLACE CLIERR_USER_COUNT_FILE_CANT_READ             12327
   662#REPLACE CLIERR_USER_COUNT_FILE_CANT_DECRYPT          12328
   663#REPLACE CLIERR_USER_COUNT_FILE_BAD_VERSION           12329
   664#REPLACE CLIERR_CANTCREATE_RECNUMISZERO               12330
   665#REPLACE CLIERR_CANTGETCOLUMNINFO                     12331
   666#REPLACE CLIERR_INVALIDDATABASEHANDLE                 12332
   667#REPLACE CLIERR_TYPENUMBEROUTOFRANGE                  12333
   668#REPLACE CLIERR_LOCKERRORNUMBEROUTOFRANGE             12334
   669#REPLACE CLIERR_CONNECTIONIDOUTOFRANGE                12335
   670#REPLACE CLIERR_CONNECTIONIDNOTFOUND                  12336
   671#REPLACE CLIERR_RELATIONOUTOFRANGE                    12337
   672#REPLACE CLIERR_NOTANEXPRESSEDITION                   12338
   673
   674
   675//*** Call driver function identifiers
   676#REPLACE CLI_CONSTRAINT             10000
   677#REPLACE CLI_SETDRIVERATTRIBUTE     10001
   678#REPLACE CLI_GETDRIVERATTRIBUTE     10002
   679#REPLACE CLI_BROWSECONNECT          10003
   680#REPLACE CLI_DATASOURCES            10004
   681#REPLACE CLI_CKREVISION             10005
   682#REPLACE CLI_INITDATASOURCES        10006
   683#Replace CLI_ENUMERATE_TABLES       10007
   684#Replace CLI_TABLENAME              10008
   685#Replace CLI_TABLESCHEMA            10009
   686#Replace CLI_TABLETYPE              10010
   687#Replace CLI_TABLECOMMENT           10011
   688#Replace CLI_ENUMERATE_COLUMNS      10012
   689#Replace CLI_COLUMNNAME             10013
   690#Replace CLI_DUMPSTATUS             10014
   691#Replace CLI_READCONFIGURATION      10015
   692#Replace CLI_GETDBATTRIBUTE0        10016
   693#Replace CLI_GETDBATTRIBUTE         10017
   694#Replace CLI_GETREGNAME             10018
   695#Replace CLI_GETSERIALNUM           10019
   696#Replace CLI_GETMAXUSERS            10020
   697#Replace CLI_BCP                    10021
   698#Replace CLI_DROPINDICES            10022
   699#Replace CLI_CREATEINDICES          10023
   700#Replace CLI_REDIRECTCONNECTION     10024
   701#Replace CLI_CREATECONNECTIONID     10025
   702#Replace CLI_DELETECONNECTIONID     10026
   703
   704
   705//*** Init data source types
   706#REPLACE SQL_FETCH_ALL        2
   707#REPLACE SQL_FETCH_USER      31
   708#REPLACE SQL_FETCH_SYSTEM    32
   709
   710
   711//*** Dummy strings used in the commands
   712#IFDEF CLI$StrDummy
   713#ELSE
   714    String  CLI$StrDummy 255
   715    Integer CLI$IntDummy
   716#ENDIF
   717
   718
   719//*****************************************************************************
   720//*** CLI_SetConstraint <FileNum> <NewState>                                ***
   721//***                                                                       ***
   722//***   Setup a constraint for a file.                                      ***
   723//*****************************************************************************
   724
   725#COMMAND CLI_SetConstraint R R R .
   726    Call_driver !1 !3 Function CLI_Constraint Callback 0 Passing !2 CLI$StrDummy CLI$IntDummy Result CLI$IntDummy
   727#ENDCOMMAND
   728
   729
   730
   731//*****************************************************************************
   732//*** CLI_Set_Driver_Atrtribute / CLI_Get_Driver_Attribute                  ***
   733//***                                                                       ***
   734//*** Set or get an attribute at driver level. These attributes, when set,  ***
   735//*** will be set for the remainder of the session or until set again. To   ***
   736//*** permanently set driver level attributes change the driver             ***
   737//*** configuration file.                                                   ***
   738//*****************************************************************************
   739
   740#COMMAND CLI_Get_Driver_Attribute R R "TO" R .
   741    Move (Repeat(Character(" "), 255)) To CLI$StrDummy
   742    Call_driver 0 !1 Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing CLI$StrDummy CLI$IntDummy !2 Result CLI$IntDummy
   743    Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !4
   744#ENDCOMMAND
   745
   746#COMMAND CLI_Set_Driver_Attribute R R "TO" R .
   747    Call_driver 0 !1 Function CLI_SETDRIVERATTRIBUTE Callback 0 Passing !4 CLI$StrDummy !2 Result CLI$IntDummy
   748#ENDCOMMAND
   749
   750
   751#COMMAND CLI_Get_Database_Attribute R R R
   752    #IFSAME !4 TO
   753        Move (Repeat(Character(" "), 255)) To CLI$StrDummy
   754        Call_driver 0 !1 Function CLI_GETDBATTRIBUTE Callback 0 Passing CLI$StrDummy !3 !2 Result CLI$IntDummy
   755        Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !5
   756    #ELSE IFSAME !5 TO
   757        Move "" To CLI$StrDummy
   758        Call_driver 0 !1 Function CLI_GETDBATTRIBUTE0 Callback 0 Passing CLI$StrDummy CLI$StrDummy !4 Result CLI$IntDummy
   759        Move (Repeat(Character(" "), 255)) To CLI$StrDummy
   760        Call_driver 0 !1 Function CLI_GETDBATTRIBUTE Callback 0 Passing CLI$StrDummy !3 !2 Result CLI$IntDummy
   761        Move (Left(CLI$StrDummy, Pos(Character(0), CLI$StrDummy) - 1)) To !6
   762    #ENDIF
   763#ENDCOMMAND
   764
   765
   766
   767//*****************************************************************************
   768//*** Class  : cCLIHandler                                                  ***
   769//*** Purpose: An instance of this class can be used as a broker object to  ***
   770//***          call several CLI releated methods.                           ***
   771//*****************************************************************************
   772
   773Class cCLIHandler Is An Array
   774
   775    Procedure Construct_Object Integer iImage
   776        Forward Send Construct_object iImage
   777
   778        Property String  psDriverID       Public ""
   779    End_Procedure // Construct_Object
   780
   781
   782
   783    //***
   784    //*** Fucntion: CKRevsion
   785    //*** Purpose : The revsion of a CLI Connectivity Kit
   786    //***
   787
   788    Function CKRevision Returns String
   789        Local String  sDriverID
   790        Local String  sRevision
   791        Local String  sVoid
   792        Local Integer iRetval
   793
   794        Get psDriverID To sDriverID
   795        If (sDRiverID <> "") Begin
   796            Move (Repeat(" ", 255)) To sRevision
   797            Call_Driver 0 sDRiverID Function CLI_CKREVISION Callback 0 Passing sRevision sVoid 0 Result iRetval
   798        End
   799
   800        Function_Return sRevision
   801    End_Function // CKRevision
   802
   803
   804
   805    //***
   806    //*** Function: ExtractPartFromRevision
   807    //*** Purpose : Extarct the Nth part of a a.b.c.d revsion string.
   808    //***
   809    //*** Returns : The part version number or -1 if there is no such part number.
   810    //***
   811
   812    Function ExtractPartFromRevision Integer iPartNum String sRevision Returns Integer
   813        Local Integer iPartRev
   814        Local Integer iCurrentPart
   815        Local Integer iSeparatorPos
   816
   817        If (iPartNum > 4) ;
   818            Function_Return -1
   819
   820        Move 0 To iCurrentPart
   821        Repeat
   822            Move (Pos(".", sRevision)) To iSeparatorPos
   823            If (iSeparatorPos > 0) Begin
   824                Move (Left(sRevision, iSeparatorPos - 1)) To iPartRev
   825                Move (Right(sRevision, Length(sRevision) - iSeparatorPos)) To sRevision
   826                Increment iCurrentPart
   827            End
   828            Else If (sRevision <> "") Begin
   829                Move sRevision To iPartRev
   830                Move "" To sRevision
   831                Increment iCurrentPart
   832            End
   833            Else ;
   834                Move -1 To iPartRev
   835        Until (iCurrentPart >= iPartNum Or iPartRev = -1)
   836
   837        Function_Return iPartRev
   838    End_Function // EcxtractPartFromRevision
   839
   840
   841
   842    //***
   843    //*** Function: CKMajorRevision
   844    //*** Purpose : Returns the major revision of the CK
   845    //***
   846
   847    Function CKMajorRevision Returns Integer
   848        Function_Return (ExtractPartFromRevision (Current_Object, 1, CKRevision(Current_Object)))
   849    End_Function // CKMajorRevision
   850
   851
   852
   853    //***
   854    //*** Function: CKMinorRevision
   855    //*** Purpose : Returns the minor revision of the CK
   856    //***
   857
   858    Function CKMinorRevision Returns Integer
   859        Function_Return (ExtractPartFromRevision (Current_Object, 2, CKRevision(Current_Object)))
   860    End_Function // CKMinorRevision
   861
   862
   863
   864    //***
   865    //*** Function: CKReleaseRevision
   866    //*** Purpose : Returns the release revision of the CK
   867    //***
   868
   869    Function CKReleaseRevision Returns Integer
   870        Function_Return (ExtractPartFromRevision (Current_Object, 3, CKRevision(Current_Object)))
   871    End_Function // CKReleaseRevision
   872
   873
   874
   875    //***
   876    //*** Function: CKBuildRevision
   877    //*** Purpose : Returns the major revision of the CK
   878    //***
   879
   880    Function CKBuildRevision Returns Integer
   881        Function_Return (ExtractPartFromRevision (Current_Object, 4, CKRevision(Current_Object)))
   882    End_Function // CKBuildRevision
   883
   884
   885
   886    //***
   887    //*** Function: IsMinimalRevision
   888    //*** Purpose : Determines if the CK conforms to a passed minimal revsion.
   889    //***
   890
   891    Function IsMinimalRevision Integer iMajor Integer iMinor Integer iRelease Integer iBuild Returns Integer
   892        If (iMajor < CKMajorRevision(Current_object)) ;
   893            Function_return (TRUE)
   894        Else If (iMajor = CKMajorRevision(Current_object)) Begin
   895            If (iMinor < CKMinorRevision(Current_object)) ;
   896                Function_return (TRUE)
   897            Else If (iMinor = CKMinorRevision(Current_object)) Begin
   898                If (iRelease < CKReleaseRevision(Current_object)) ;
   899                    Function_return (TRUE)
   900                Else If (iRelease = CKReleaseRevision(Current_object) And iBuild <= CKBuildRevision(Current_object)) ;
   901                    Function_return (TRUE)
   902            End
   903        End
   904
   905        Function_Return (FALSE)
   906    End_Function // IsMinimalRevision
   907
   908
   909
   910    //***
   911    //*** Function: RegistrationName
   912    //*** Purpose : Returns the Connectiivty Kit registration name.
   913    //***
   914
   915    Function RegistrationName Returns String
   916        Local String  sRegistration
   917        Local String  sDRiverId
   918        Local String  sVoid
   919        Local Integer iRetval
   920
   921        Get psDriverID To sDriverID
   922        If (sDRiverID <> "") Begin
   923            Move (Repeat(" ", 255)) To sRegistration
   924            Call_Driver 0 sDRiverID Function CLI_GETREGNAME Callback 0 Passing sRegistration sVoid 0 Result iRetval
   925        End
   926
   927        Function_Return sRegistration
   928    End_Function // RegistrationName
   929
   930
   931
   932    //***
   933    //*** Function: SerialNumber
   934    //*** Purpose : Returns the Connectiivty Kit serial number.
   935    //***
   936
   937    Function SerialNumber Returns Integer
   938        Local String  sDRiverId
   939        Local String  sVoid
   940        Local Integer iRetval
   941
   942        Get psDriverID To sDriverID
   943        If (sDRiverID <> "") Begin
   944            Call_Driver 0 sDRiverID Function CLI_GETSERIALNUM Callback 0 Passing sVoid sVoid 0 Result iRetval
   945        End
   946
   947        Function_Return iRetval
   948    End_Function // SerialNumber
   949
   950
   951
   952    //***
   953    //*** Function: MaxUsers
   954    //*** Purpose : Returns the Connectiivty Kit maximum number of users.
   955    //***
   956
   957    Function MaxUsers Returns Integer
   958        Local String  sDRiverId
   959        Local String  sVoid
   960        Local Integer iRetval
   961
   962        Get psDriverID To sDriverID
   963        If (sDRiverID <> "") Begin
   964            Call_Driver 0 sDRiverID Function CLI_GETMAXUSERS Callback 0 Passing sVoid sVoid 0 Result iRetval
   965        End
   966
   967        Function_Return iRetval
   968    End_Function // MaxUsers
   969
   970
   971
   972    //***
   973    //*** Procedure: DumpStatus
   974    //*** Purpose  : Dump the current status of the drver in the passed disk file.
   975    //***
   976
   977    Procedure DumpStatus String sFileName
   978        Local String  sVoid
   979        Local String  sDriverID
   980        Local Integer iVoid
   981
   982        Get psDriverID To sDriverID
   983        If (sDriverID <> "") ;
   984            Call_driver 0 sDriverID Function CLI_DUMPSTATUS Callback 0 Passing sFileName sVoid iVoid Result iVoid
   985    End_Procedure // DumpStatus
   986
   987
   988
   989    //***
   990    //*** Procedure: ReadConfiguration
   991    //*** Purpose  : Reset all driver level configurable attributes to the
   992    //***            default value and then reread the configuration.
   993    //***
   994
   995    Procedure ReadConfiguration
   996        Local String  sVoid
   997        Local String  sDriverID
   998        Local Integer iVoid
   999
  1000        Get psDriverID To sDriverID
  1001        If (sDriverID <> "") ;
  1002            Call_driver 0 sDriverID Function CLI_READCONFIGURATION Callback 0 Passing sVoid sVoid iVoid Result iVoid
  1003    End_Procedure // ReadConfiguration
  1004
  1005
  1006
  1007    //***
  1008    //*** Function: TextToRIMValue
  1009    //*** Purpose : Convert a text to the corresponding
  1010    //***           Generate_Record_ID_Method attribute value
  1011    //***
  1012
  1013    Function TextToRIMValue String sText Returns Integer
  1014        If (sText = "None") ;
  1015            Function_return RIM_NONE
  1016        Else If (sText = "Identity Column") ;
  1017            Function_return RIM_IDENTITY_COLUMN
  1018        Else If (sText = "Dispenser Table") ;
  1019            Function_return RIM_DISPENSER_TABLE
  1020        Else If (sText = "External") ;
  1021            Function_return RIM_EXTERNAL
  1022    End_Function // TextToRIMValue
  1023
  1024
  1025
  1026    //***
  1027    //*** Function: RIMValueTotext
  1028    //*** Purpose : Convert a Generate_Record_ID_Method attribute value to the
  1029    //***           corresponding text.
  1030    //***
  1031
  1032    Function RIMValueToText Integer iAttrValue Returns String
  1033        If (iAttrValue = RIM_NONE) ;
  1034            Function_return "None"
  1035        Else If (iAttrValue = RIM_IDENTITY_COLUMN) ;
  1036            Function_return "Identity Column"
  1037        Else If (iAttrValue = RIM_DISPENSER_TABLE) ;
  1038            Function_return "Dispenser Table"
  1039        Else If (iAttrValue = RIM_EXTERNAL) ;
  1040            Function_return "External"
  1041    End_Function // RIMValueToText
  1042
  1043
  1044
  1045    //***
  1046    //*** Function: TextToROValue
  1047    //*** Purpose : Convert a text to the corresponding
  1048    //***           Generate_Record_ID_Method attribute value
  1049    //***
  1050
  1051    Function TextToROValue String sText Returns Integer
  1052        If (sText = "No") ;
  1053            Function_return RO_NO
  1054        Else If (sText = "Ignore Change") ;
  1055            Function_return RO_IGNORECHANGE
  1056        Else If (sText = "Accept Change") ;
  1057            Function_return RO_ACCEPTCHANGE
  1058        Else If (sText = "Error On Change") ;
  1059            Function_return RO_ERRORONCHANGE
  1060    End_Function // TextToRIMValue
  1061
  1062
  1063
  1064    //***
  1065    //*** Function: ROValueTotext
  1066    //*** Purpose : Convert a Generate_Record_ID_Method attribute value to the
  1067    //***           corresponding text.
  1068    //***
  1069
  1070    Function ROValueToText Integer iAttrValue Returns String
  1071        If (iAttrValue = RO_NO) ;
  1072            Function_return "No"
  1073        Else If (iAttrValue = RO_IGNORECHANGE) ;
  1074            Function_return "Ignore Change"
  1075        Else If (iAttrValue = RO_ACCEPTCHANGE) ;
  1076            Function_return "Accept Change"
  1077        Else If (iAttrValue = RO_ERRORONCHANGE) ;
  1078            Function_return "Error On Change"
  1079    End_Function // RIMValueToText
  1080
  1081
  1082
  1083    //***
  1084    //*** Function: LastDriverError
  1085    //*** Purpose : Return the text f the last error geneated by the driver.
  1086    //***
  1087
  1088    Function LastDriverError Returns String
  1089        Local String  sDriverID
  1090        Local String  sLastError
  1091        Local String  sLastErrorLength
  1092        Local Integer iLastErrorLength
  1093        Local Integer iVoid
  1094
  1095        //*** Initialize
  1096        Move "" To sLastError
  1097
  1098        Get psDriverID To sDriverID
  1099        If (sDriverID <> "") Begin
  1100            //*** Get the text of the last error
  1101            Move (Repeat(Character(" "), 14)) To sLastErrorlength
  1102            Call_driver 0 sDriverID Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing sLastErrorLength iVoid DRVR_LASTERRORTEXTLENGTH Result iVoid
  1103            Move (Left(sLastErrorLength, Pos(Character(0), sLastErrorLength) - 1)) To iLastErrorLength
  1104
  1105            If (iLastErrorLength > 0) Begin
  1106                Move (Repeat(Character(" "), iLastErrorLength + 1)) To sLastError
  1107                Call_driver 0 sDriverID Function CLI_GETDRIVERATTRIBUTE Callback 0 Passing sLastError iVoid DRVR_LASTERRORTEXT Result iVoid
  1108                Move (Left(sLastError, Pos(Character(0), sLastError) - 1)) To sLastError
  1109            End
  1110        End
  1111
  1112        Function_Return sLastError
  1113    End_Function // LastDriverError
  1114
  1115
  1116
  1117    //***
  1118    //*** Function: EnumerateTables
  1119    //*** Purpose : Enumerate the tables in a database
  1120    //***
  1121
  1122    Function EnumerateTables String sLogin Returns Integer
  1123        Local String  sDriver
  1124        Local String  sVoid
  1125        Local Integer iNumTables
  1126        Local Integer iVoid
  1127
  1128        Get psDriverID To sDriver
  1129        If (sDriver <> "") ;
  1130            Call_driver 0 sDriver Function CLI_ENUMERATE_TABLES Callback 0 Passing sLogin sVoid iVoid Result iNumTables
  1131
  1132        Function_Return iNumTables
  1133    End_Function // EnumerateTables
  1134
  1135
  1136
  1137    //***
  1138    //*** Function: TableName
  1139    //*** Purpose : Returns the name of the table enumerated at the given position
  1140    //***
  1141
  1142    Function TableName Integer iIndex Returns String
  1143        Local String  sDriver
  1144        Local String  sTableName
  1145        Local String  sVoid
  1146        Local Integer iVoid
  1147
  1148        Get psDriverID To sDriver
  1149        If (sDriver <> "") Begin
  1150            Move (Repeat(" ", 255)) To sTableName
  1151            Call_driver 0 sDriver Function CLI_TABLENAME Callback 0 Passing sTableName sVoid iIndex Result iVoid
  1152        End
  1153
  1154        Function_Return sTableName
  1155    End_Function // TableName
  1156
  1157
  1158
  1159    //***
  1160    //*** Function: SchemaName
  1161    //*** Purpose : Returns the name of the schema of the table enumerated at the given position
  1162    //***
  1163
  1164    Function SchemaName Integer iIndex Returns String
  1165        Local String  sDriver
  1166        Local String  sSchemaName
  1167        Local String  sVoid
  1168        Local Integer iVoid
  1169
  1170        Get psDriverID To sDriver
  1171        If (sDriver <> "") Begin
  1172            Move (Repeat(" ", 255)) To sSchemaName
  1173            Call_driver 0 sDriver Function CLI_TABLESCHEMA Callback 0 Passing sSchemaName sVoid iIndex Result iVoid
  1174        End
  1175
  1176        Function_Return sSchemaName
  1177    End_Function // SchemaName
  1178
  1179
  1180
  1181    //***
  1182    //*** Function: TableType
  1183    //*** Purpose : Returns the type of the table enumerated at the given position.
  1184    //***           Types can be "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY",
  1185    //***           "LOCAL TEMPORARY", "ALIAS", "SYNONYM"
  1186    //***
  1187
  1188    Function TableType Integer iIndex Returns String
  1189        Local String  sDriver
  1190        Local String  sTableType
  1191        Local String  sVoid
  1192        Local Integer iVoid
  1193
  1194        Get psDriverID To sDriver
  1195        If (sDriver <> "") Begin
  1196            Move (Repeat(" ", 25)) To sTableType
  1197            Call_driver 0 sDriver Function CLI_TABLETYPE Callback 0 Passing sTableType sVoid iIndex Result iVoid
  1198        End
  1199
  1200        Function_Return sTableType
  1201    End_Function // TableType
  1202
  1203
  1204
  1205    //***
  1206    //*** Function: TableComment
  1207    //*** Purpose : Returns the comment of the table enumerated at the given position
  1208    //***
  1209
  1210    Function TableComment Integer iIndex Returns String
  1211        Local String  sDriver
  1212        Local String  sTableComment
  1213        Local String  sVoid
  1214        Local Integer iVoid
  1215
  1216        Get psDriverID To sDriver
  1217        If (sDriver <> "") Begin
  1218            Move (Repeat(" ", 255)) To sTableComment
  1219            Call_driver 0 sDriver Function CLI_TABLECOMMENT Callback 0 Passing sTableComment sVoid iIndex Result iVoid
  1220        End
  1221
  1222        Function_Return sTableComment
  1223    End_Function // TableComment
  1224
  1225
  1226
  1227    //***
  1228    //*** Function: EnumerateColumns
  1229    //*** Purpose : Enumerate the columns in a table
  1230    //***
  1231
  1232    Function EnumerateColumns String sLogin String sTableName Returns Integer
  1233        Local String  sDriver
  1234        Local Integer iNumColumns
  1235        Local Integer iVoid
  1236
  1237        Get psDriverID To sDriver
  1238        If (sDriver <> "") ;
  1239            Call_driver 0 sDriver Function CLI_ENUMERATE_COLUMNS Callback 0 Passing sLogin sTablename iVoid Result iNumColumns
  1240
  1241        Function_Return iNumColumns
  1242    End_Function // EnumerateColumns
  1243
  1244
  1245
  1246    //***
  1247    //*** Function: ColumnName
  1248    //*** Purpose : Returns the name of the column enumerated at the given position
  1249    //***
  1250
  1251    Function ColumnName Integer iIndex Returns String
  1252        Local String  sDriver
  1253        Local String  sColumnName
  1254        Local String  sVoid
  1255        Local Integer iVoid
  1256
  1257        Get psDriverID To sDriver
  1258        If (sDriver <> "") Begin
  1259            Move (Repeat(" ", 255)) To sColumnName
  1260            Call_driver 0 sDriver Function CLI_COLUMNNAME Callback 0 Passing sColumnName sVoid iIndex Result iVoid
  1261        End
  1262
  1263        Function_Return sColumnName
  1264    End_Function // ColumnName
  1265
  1266
  1267
  1268    //***
  1269    //*** Function: CLIDFDateToSQLDate
  1270    //*** Purpose : Convert a DataFlex date to a SQL date using the dummy zero date value.
  1271    //***
  1272
  1273    Function CLIDFDateToSQLDate String sDRiver Date dDFDate Returns String
  1274        Local String sSQLDate
  1275        Local Integer iOrgDateFmt
  1276        Local Integer iOrgDateSep
  1277
  1278        //*** Change date format to military, SQL dates are military dates
  1279        Get_Attribute DF_DATE_FORMAT To iOrgDateFmt
  1280        Get_Attribute DF_DATE_SEPARATOR To iOrgDateSep
  1281        Set_Attribute DF_DATE_FORMAT To DF_DATE_MILITARY
  1282        Set_Attribute DF_DATE_SEPARATOR To (Ascii('-'))
  1283
  1284        //*** We only need to convert if the date is 0
  1285        If (Integer(dDFDate = 0)) ;
  1286            CLI_Get_Driver_Attribute sDRiver DRVR_DUMMY_ZERO_DATE_VALUE To sSQLDate
  1287        Else ;
  1288            Move dDFDate To sSQLDate
  1289
  1290        //*** Change date format back to original
  1291        Set_Attribute DF_DATE_FORMAT To iOrgDateFmt
  1292        Set_Attribute DF_DATE_SEPARATOR To iOrgDateSep
  1293
  1294        Function_Return sSQLDate
  1295    End_Function // CLIDFDateToSQLDate
  1296
  1297
  1298
  1299    //***
  1300    //*** Function: CLISQLDateToDFDate
  1301    //*** Purpose : Convert a SQL date to a DataFlex date using the dummy zero date value.
  1302    //***
  1303
  1304    Function CLISQLDateToDFDate String sDRiver String sSQLDate Returns Date
  1305        Local Date dDFDate
  1306        Local String sDummyDateValue
  1307        Local Integer iOrgDateFmt
  1308        Local Integer iOrgDateSep
  1309
  1310        //*** Change date format to military, SQL dates are military dates
  1311        Get_Attribute DF_DATE_FORMAT To iOrgDateFmt
  1312        Get_Attribute DF_DATE_SEPARATOR To iOrgDateSep
  1313        Set_Attribute DF_DATE_FORMAT To DF_DATE_MILITARY
  1314        Set_Attribute DF_DATE_SEPARATOR To (Ascii('-'))
  1315
  1316        //*** We only need to convert if the date is the dummy zero date value
  1317        CLI_Get_Driver_Attribute sDRiver DRVR_DUMMY_ZERO_DATE_VALUE To sDummyDateValue
  1318        If (sDummyDateValue = sSQLDate) ;
  1319            Move 0 To dDFDate
  1320        Else ;
  1321            Move sSQLDate To dDFDate
  1322
  1323        //*** Change date format back to original
  1324        Set_Attribute DF_DATE_FORMAT To iOrgDateFmt
  1325        Set_Attribute DF_DATE_SEPARATOR To iOrgDateSep
  1326
  1327        Function_Return dDFDate
  1328    End_Function // CLISQLDateToDFDate
  1329
  1330
  1331
  1332    //***
  1333    //*** Function: RedirectConnection
  1334    //*** Purpose : Redirect an exisitng connection. The existing connection
  1335    //***           will point to another database but all tables will stay
  1336    //***           open!
  1337    //***
  1338
  1339    Function RedirectConnection String sOldConnection String sNewConnection Returns Integer
  1340        Local String  sDriver
  1341        Local String  sVoid
  1342        Local Integer iResult
  1343        Local Integer iVoid
  1344
  1345        Get psDriverID To sDriver
  1346        If (sDriver <> "") Begin
  1347            Call_driver 0 sDriver Function CLI_REDIRECTCONNECTION Callback 0 Passing sOldConnection sNewConnection iVoid Result iResult
  1348        End
  1349        Function_Return iResult
  1350    End_Function // RedirectConnect
  1351
  1352
  1353
  1354    //***
  1355    //*** Function: CreateConnectionID
  1356    //*** Purpose : Create a DataFlex side connection id that can be used later on.
  1357    //***
  1358
  1359    Function CreateConnectionID String sID String sConnStr Integer iOpt Returns Integer
  1360        Local String  sDriver
  1361        Local Integer iResult
  1362        Local Integer iOptions
  1363
  1364        Get psDriverID to sDriver
  1365        If (Num_Arguments = 2) ;
  1366            Move 0 to iOptions
  1367        Else ;
  1368            Move iOpt to iOptions
  1369        If (sDriver <> "") Begin
  1370            Call_Driver 0 sDriver Function CLI_CREATECONNECTIONID Callback 0 Passing sID sConnStr iOptions Result iResult
  1371        End
  1372        Function_Return iResult
  1373    End_Function // CreateConnectionID
  1374
  1375
  1376
  1377    //***
  1378    //*** Function: DeleteConnectionID
  1379    //*** Purpose : Delete a DataFlex side connection id.
  1380    //***
  1381
  1382    Function DeleteConnectionID String sID Integer iIndex Returns Integer
  1383        Local String  sDriver
  1384        Local Integer iResult
  1385        Local String sVoid
  1386
  1387        Get psDriverID To sDriver
  1388        If (sDriver <> "") Begin
  1389            Call_Driver 0 sDriver Function CLI_DELETECONNECTIONID Callback 0 Passing sID sVoid iIndex Result iResult
  1390        End
  1391        Function_Return iResult
  1392    End_Function // DeleteConnectionID
  1393
  1394End_Class // cCLIHandler
  1395