Function SQL_Services(@Service, @Params) /*********************************************************************************************************************** This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written permission from SRP Computer Solutions, Inc. Name : SQL_Services Description : Handler program for all module related services. Notes : The generic parameters should contain all the necessary information to process the services. Often this will be information like the data Record and Key ID. Parameters : Service [in] -- Name of the service being requested Param1-10 [in/out] -- Additional request parameter holders Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure Metadata : History : (Date, Initials, Notes) 08/13/18 dmb Original programmer. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $insert LOGICAL $insert SERVICE_SETUP $insert MICROSOFT_ADO_EQUATES $insert DICT_EQUATES Declare function Memory_Services, SQL_Services, Database_Services, SRP_JSON, SRP_Array, SRP_Hash, SRP_COM, Logging_Services Declare subroutine Memory_Services, SQL_Services, Database_Services, SRP_JSON, SRP_Stopwatch, SRP_COM, Logging_Services,Sleepery GoToService else Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') end Return Response OR '' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Service Parameter Options //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Options BOOLEAN = True$, False$ Options ProviderTypes = 'ODBC', 'SQLNCLI11' Options Servers = 'mesirwdb002.irworld.irf.com', '10.95.128.28\PROD1,53959', 'messa03ec.ec.local' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Services //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------------------------------------- // WriteDataRowToSQL // // High level services that writes OpenInsight data into a designated SQL table. This services calls other lower // level services as needed and assumes an OpenInsight to SQL map has already been created. //---------------------------------------------------------------------------------------------------------------------- Service WriteDataRowToSQL(OITableName, OIKeyID, OIRow, OIColumns) If (OITableName NE '') AND (OIKeyID NE '') AND (OIRow NE '') then // Create a new or get an existing Connection Object. SQLServer = SQL_Services('GetSQLServer', OITableName) objConnection = SQL_Services('GetConnectionObject', SQLServer, 2) If Error_Services('NoError') then // Set up transaction processing, initiate SQL queries, and commit the transaction. TransactionQueries = '' * TransactionQueries := "SET TRANSACTION NAME 'oi'" : @FM // Create the DELETE statements so the data in SQL is cleared out first. * TransactionQueries := SQL_Services('GetSQLDeleteStatements', OITableName, OIKeyID, OIRow) : @FM // Create the INSERT statements to store the data in SQL. TransactionQueries := SQL_Services('GetSQLInsertStatements', OITableName, OIKeyID, OIRow, OIColumns) : @FM // End transaction processing. * TransactionQueries := 'COMMIT' : @FM TransactionQueries[-1, 1] = '' end If Error_Services('NoError') then // Process the tranaction queries. SQL_Services('ExecuteQueries', objConnection, TransactionQueries) end end else Error_Services('Add', 'The OITableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // DeleteDataRowFromSQL // // High level services that deletes data from a designated SQL table. This services calls other lower level services as // needed and assumes an OpenInsight to SQL map has already been created. //---------------------------------------------------------------------------------------------------------------------- Service DeleteDataRowFromSQL(OITableName, OIKeyID) If (OITableName NE '') AND (OIKeyID NE '') then // Create a new or get an existing Connection Object. SQLServer = SQL_Services('GetSQLServer', OITableName) objConnection = SQL_Services('GetConnectionObject', SQLServer, 2) If Error_Services('NoError') then // Set up transaction processing, initiate SQL queries, and commit the transaction. TransactionQueries = '' TransactionQueries := "SET TRANSACTION NAME 'oi'" : @FM // Create the DELETE statements so the data in SQL is cleared out first. TransactionQueries := SQL_Services('GetSQLDeleteStatements', OITableName, OIKeyID) : @FM // End transaction processing. TransactionQueries := 'COMMIT' : @FM TransactionQueries[-1, 1] = '' end If Error_Services('NoError') then // Process the tranaction queries. SQL_Services('ExecuteQueries', objConnection, TransactionQueries) end end else Error_Services('Add', 'The OITableName or OIKeyID argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // ReadDataRowFromSQL // // High level services that reads data from a designated SQL table. This services calls other lower level services as // needed and assumes an OpenInsight to SQL map has already been created. //---------------------------------------------------------------------------------------------------------------------- Service ReadDataRowFromSQL(OITableName, OIKeyID) OIRow = '' If (OITableName NE '') AND (OIKeyID NE '') then // Create a new or get an existing Connection Object. SQLServer = SQL_Services('GetSQLServer', OITableName) objConnection = SQL_Services('GetConnectionObject', SQLServer, 2) If Error_Services('NoError') then // Select the SQL data for the primary SQL table associated to the OpenInsight table. SQLTableName = SQL_Services('GetPrimarySQLTable', OITableName) SQLSelectStatement = SQL_Services('GetSQLSelectStatement', OITableName, SQLTableName, OIKeyID) SQLData = SQL_Services('ExecuteQuery', objConnection, SQLSelectStatement, True$) If (SQLData NE '') AND (Error_Services('NoError')) then OIRow = SQL_Services('GetMappedOIColumnValues', OITableName, SQLTableName, SQLData) end end If Error_Services('NoError') then // Select the SQL data for all secondary SQL tables associated to the OpenInsight table. SQLTableNames = SQL_Services('GetSecondarySQLTables', OITableName) If SQLTableNames NE '' then For Each SQLTableName in SQLTableNames using @FM SQLSelectStatement = SQL_Services('GetSQLSelectStatement', OITableName, SQLTableName, OIKeyID) // Create a new or get an existing Connection Object. SQLServer = SQL_Services('GetSQLServer', OITableName) objConnection = SQL_Services('GetConnectionObject', SQLServer, 2) If Error_Services('NoError') then SQLData = SQL_Services('ExecuteQuery', objConnection, SQLSelectStatement, True$) If (SQLData NE '') AND (Error_Services('NoError')) then OIRow = SQL_Services('GetMappedOIColumnValues', OITableName, SQLTableName, SQLData, OIRow) end end While (Error_Services('NoError')) Next SQLTable end end end else Error_Services('Add', 'The OITableName or OIKeyID argument was missing in the ' : Service : ' service.') end Response = OIRow end service //---------------------------------------------------------------------------------------------------------------------- // GetRowCount // // Server - Name of the server the connection object is bound to. This should be the same name that // will be used in the Data Source connection string. // TableName - Database Table whose row count is being requested. // // High level services that counts the number of rows in a designated table. This services calls other lower level // services. //---------------------------------------------------------------------------------------------------------------------- Service GetRowCount(Server=Servers, TableName) RowCount = '' If (Server NE '') AND (TableName NE '') then // Create a new or get an existing Connection Object. objConnection = SQL_Services('GetConnectionObject', Server, 2) If Error_Services('NoError') then // Select the SQL data for the primary SQL table associated to the OpenInsight table. ErrorMessage = '' SQLCountStatement = 'SELECT COUNT(*) FROM ' : TableName RowCount = SQL_Services('ExecuteQuery', objConnection, SQLCountStatement, True$) If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage') end SQL_Services('DestroyConnectionObject', objConnection) If ErrorMessage NE '' then Error_Services('Add', ErrorMessage) end end else Error_Services('Add', 'The Server or TableName argument was missing in the ' : Service : ' service.') end Response = RowCount end service //---------------------------------------------------------------------------------------------------------------------- // GetDataRows // // Server - Name of the server the connection object is bound to. This should be the same name that // will be used in the Data Source connection string. // QueryStatement - Query command. This should be a properly syntaxed SQL statement. // // High level service that gets database rows from the indicated database using the indicated query statement. This // service will automatically get the connection and query object needed to perform the query statement. //---------------------------------------------------------------------------------------------------------------------- Service GetDataRows(Server=Servers, QueryStatement) DataRows = '' If (Server NE '') AND (QueryStatement NE '') then ErrorMessage = '' objConnection = SQL_Services('GetConnectionObject', Server, 2) If Error_Services('NoError') then If Error_Services('NoError') then DataRows = SQL_Services('ExecuteQuery', objConnection, QueryStatement, True$) end // Get any errors from the GetConnectionObject service or the ExecuteQuery service. ErrorMessage = Error_Services('GetMessage') end SQL_Services('DestroyConnectionObject', objConnection) If ErrorMessage then Error_Services('Set', ErrorMessage) end else Error_Services('Add', 'Server or QueryStatement argument was missing in the ' : Service : 'service.') end Response = DataRows end service //---------------------------------------------------------------------------------------------------------------------- // GetConnectionObject // // Server - Name of the server the connection object is bound to. This should be the same name that // will be used in the Data Source connection string. // AttemptsBeforeFailure - Number of attempts to make the connect before erroring out. Default is 1. // // Returns a Connection Object based on the server. A returned Connection Object means that the server has been // successfully connected to with the provided credentials. This service uses caching, so until an existing Connection // Object has been destroyed (see the DestroyConnectionObject service), it will continue to use the one already in // existence. //---------------------------------------------------------------------------------------------------------------------- Service GetConnectionObject(Server=Servers, AttemptsBeforeFailure) If AttemptsBeforeFailure EQ '' then AttemptsBeforeFailure = 1 OpenConnectionAttempts = 1 end else OpenConnectionAttempts = AttemptsBeforeFailure end objConnection = '' // Check to see if the Connection Object already exists. ServiceKeyID := '*' : Server objConnection = Memory_Services('GetValue', ServiceKeyID) If objConnection EQ '' then If Server NE '' then Attempts = 0 Error = '' Loop If SRP_COM(objConnection, 'CREATE', 'ADODB.Connection') then Memory_Services('SetValue', objConnection : '*Server', Server) If SRP_COM('', 'ERROR') then Error = SRP_COM('', 'ERROR') SQL_Services('DestroyConnectionObject', objConnection) objConnection = '' end else ConnectionString = SQL_Services('GetConnectionString', Server) If Error_Services('NoError') then OpenAttempts = 0 Loop SRP_COM(objConnection, 'CALL', 'Open', ConnectionString) HasConnectionError = SQL_Services('HasConnectionObjectErrors', objConnection) If (HasConnectionError) and (OpenAttempts GE AttemptsBeforeFailure) then *Error = SQL_Services('GetConnectionObjectErrors', objConnection) // Retrieval of errors has been temporarily disabled due to an issue where // we are receiving over one million errors, which is causing the OENGINES to hang. SQL_Services('DestroyConnectionObject', objConnection) objConnection = '' end OpenAttempts += 1 Until (objConnection NE '') OR (OpenAttempts GE AttemptsBeforeFailure) Repeat end end end Attempts += 1 Until (objConnection NE '') OR (Attempts GE AttemptsBeforeFailure) Repeat If objConnection then Memory_Services('SetValue', ServiceKeyID, objConnection) end else Error_Services('Add', 'Unable to create the connection object to ' : Server : ' in the ' : Service : ' service: ' : Error) end end else Error_Services('Add', 'Server argument was missing from the ' : Service : ' service.') end end Response = objConnection end service //---------------------------------------------------------------------------------------------------------------------- // DestroyConnectionObject // // objConnection - Connection Object (see GetConnectionObject service.) // // Destroys the Connection Object. This returns True$ if successful, False$ if not. //---------------------------------------------------------------------------------------------------------------------- Service DestroyConnectionObject(objConnection) Destroyed = False$ ; // Assume object is not destroyed for now. If objConnection NE '' then Error = '' // Close the connection object, but don't worry about errors. It might have already been closed. SRP_COM(objConnection, 'CALL', 'Close') SRP_COM(objConnection, 'RELEASE') If SRP_COM('', 'ERROR') then Error = SRP_COM('', 'ERROR') end else Destroyed = True$ end If Destroyed then SQL_Services('ClearConnectionErrors', objConnection) Server = Memory_Services('GetValue', objConnection : '*Server') Memory_Services('SetValue', ServiceModule : '*GetConnectionObject*' : Server, '') end else SQL_Services('AddConnectionErrors', objConnection, Error) Error_Services('Add', 'Service : ' : Service : ', Error : ' : Error) end end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end Response = Destroyed end service //---------------------------------------------------------------------------------------------------------------------- // HasConnectionObjectErrors // // objConnection - Connection Object (see GetConnectionObject service.) // // Returns a Boolean flag indicating if the Connection Object has any connection errors. //---------------------------------------------------------------------------------------------------------------------- Service HasConnectionObjectErrors(objConnection) HasConnectionObjectErrors = False$ ; // Assume false for now. If objConnection NE '' then objErrors = SRP_COM(objConnection, 'GET', 'Errors') NumErrors = SRP_COM(objErrors, 'GET', 'Count') If NumErrors GT 0 then HasConnectionObjectErrors = True$ SRP_COM(objErrors, 'RELEASE') end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end Response = HasConnectionObjectErrors end service //---------------------------------------------------------------------------------------------------------------------- // GetConnectionObjectErrors // // objConnection - Connection Object (see GetConnectionObject service.) // // Returns a string of errors errors associated with the indicated Connection Object. Different error properties related // to the same error object will be surrounded by square braces. Different error oejcts will be separated by a // semi-colon. //---------------------------------------------------------------------------------------------------------------------- Service GetConnectionObjectErrors(objConnection) ConnectionObjectErrors = '' If objConnection NE '' then objErrors = SRP_COM(objConnection, 'GET', 'Errors') NumErrors = SRP_COM(objErrors, 'GET', 'Count') If NumErrors GT 0 then For ErrorCnt = 1 to NumErrors objError = SRP_COM(objErrors, 'GET', 'Item', ErrorCnt - 1) ErrorDescription = SRP_COM(objError, 'GET', 'Description') If ErrorDescription NE 0 then ConnectionObjectErrors := '[' : ErrorDescription : ']' ConnectionObjectErrors := '[' : SRP_COM(objError, 'GET', 'NativeError') : ']' ConnectionObjectErrors := '[' : SRP_COM(objError, 'GET', 'Number') : ']' ConnectionObjectErrors := '[' : SRP_COM(objError, 'GET', 'Source') : ']' ConnectionObjectErrors := '[' : SRP_COM(objError, 'GET', 'SQLState') : ']' ConnectionObjectErrors := ';' end SRP_COM(objError, 'RELEASE') Next ErrorCnt end SRP_COM(objErrors, 'RELEASE') ConnectionObjectErrors[-1, 1] = '' end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end Response = ConnectionObjectErrors end service //---------------------------------------------------------------------------------------------------------------------- // AddConnectionErrors // // objConnection - Connection Object (see GetConnectionObject service.) // Errors - @FM delimited list of errors. // // Adds a list of errors to the indicated Connection Object so the GetConnectionErrors service can retrieve them at // will. This list will accumulate until the ClearConnectionErrors service is called. //---------------------------------------------------------------------------------------------------------------------- Service AddConnectionErrors(objConnection, Errors) objConnection = objConnection[1, '*'] ServiceKeyID = ServiceModule : '*' : 'GetConnectionErrors' : '*' : objConnection ConnectionErrors = Memory_Services('GetValue', ServiceKeyID) If (objConnection NE '') AND (Errors NE '') then If ConnectionErrors NE '' then ConnectionErrors := @FM : Errors end else ConnectionErrors = Errors end Memory_Services('SetValue', ServiceKeyID, ConnectionErrors) end else Error_Services('Add', 'The objConnection or Errors argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // GetConnectionErrors // // objConnection - Connection Object (see GetConnectionObject service.) // // Returns an @FM list of all connection errors associated with the indicated Connection Object. //---------------------------------------------------------------------------------------------------------------------- Service GetConnectionErrors(objConnection) objConnection = objConnection[1, '*'] ConnectionErrors = '' If objConnection NE '' then ServiceKeyID = ServiceModule : '*' : 'GetConnectionErrors' : '*' : objConnection ConnectionErrors = Memory_Services('GetValue', ServiceKeyID) end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end Response = ConnectionErrors end service //---------------------------------------------------------------------------------------------------------------------- // ClearConnectionErrors // // objConnection - Connection Object (see GetConnectionObject service.) // // Clears all connection errors associated with the indicated Connection Object. //---------------------------------------------------------------------------------------------------------------------- Service ClearConnectionErrors(objConnection) objConnection = objConnection[1, '*'] If objConnection NE '' then ServiceKeyID = ServiceModule : '*' : 'GetConnectionErrors' : '*' : objConnection Memory_Services('SetValue', ServiceKeyID, '') end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // HasConnectionErrors // // objConnection - Connection Object (see GetConnectionObject service.) // // Returns a Boolean flag indicating of the Connection Object has any connection errors. //---------------------------------------------------------------------------------------------------------------------- Service HasConnectionErrors(objConnection) objConnection = objConnection[1, '*'] HasErrors = False$ ; // Assume no errors for now. If objConnection NE '' then ConnectionErrors = SQL_Services('GetConnectionErrors', objConnection) If ConnectionErrors NE '' then HasErrors = True$ end else HasErrors = False$ end end else Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.') end Response = HasErrors end service //---------------------------------------------------------------------------------------------------------------------- // GetConnectionString // // Returns a well formed Connection String for the current server. This is used for ADO connections. //---------------------------------------------------------------------------------------------------------------------- Service GetConnectionString(Server) ServiceKeyID := '*' : Server ConnectionString = Memory_Services('GetValue', ServiceKeyID) If ConnectionString EQ '' then If (Server NE '') then ConnectionInfo = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_SERVER*' : Server) If ConnectionInfo NE '' then ConnectionString = ConnectionInfo Convert @FM to ';' in ConnectionString ConnectionString := ';' Memory_Services('SetValue', ServiceKeyID, ConnectionString) end else Error_Services('Add', Server : ' is not a valid server. [' : Service : ']') end end else Error_Services('Add', 'The Server argument was missing in the ' : Service : ' service.') end end Response = ConnectionString end service //---------------------------------------------------------------------------------------------------------------------- // ExecuteQuery // // objConnection - Connection Object (see GetConnectionObject service.) // QueryStatement - Query command. This should be a properly syntaxed SQL statement. // ReturnDataRows - Boolean flag to determine if all data rows resulting from the query should automatically be // returned. This is the same as if the caller used the GetAllQueryDataRows service, but this allows // everything to be done in one service rather than two. Default is False$ // // Executes the query against the Connection Object. If the ReturnDataRows argument is False$, then this returns True$ // if there are results, False$ if there are no results or if there is a problem running the services. Otherwise, the // datarows from the query will be returned unless there is an error. //---------------------------------------------------------------------------------------------------------------------- Service ExecuteQuery(objConnection, QueryStatement, ReturnDataRows) Results = False$ ; // Assume no results from this query for now. If ReturnDataRows NE True$ then ReturnDataRows = False$ If (objConnection NE '') AND (QueryStatement NE '') then objRecordSet = SRP_COM(objConnection, 'CALL', 'Execute', QueryStatement) If SRP_COM('', 'HASERROR') then * If SQL_Services('HasConnectionObjectErrors', objConnection) then Error = SQL_Services('GetConnectionObjectErrors', objConnection) Error2 = SRP_COM('', 'ERROR') Error_Services('Add', 'ADO error in the ' : Service : ' service: ' : Error) Results = '' ; // Since there is an error, no result should be returned. end else If ReturnDataRows then Results = SQL_Services('GetAllQueryDataRows', objRecordSet, objConnection) If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage') End end else Results = True$ end end SRP_COM(objRecordSet, 'CALL', 'Cancel') SRP_COM(objRecordSet, 'RELEASE') end else Error_Services('Add', 'The objConnection or QueryStatement argument was missing in the ' : Service : ' service.') end Response = Results end service //---------------------------------------------------------------------------------------------------------------------- // ExecuteQueries // // objConnection - Connection Object (see GetConnectionObject service.) // QueryStatements - @FM delimited list of Query commands. These should be a properly syntaxed SQL statement. // // Executes one or more queries against the Connection Object. This returns True$ if all queries processed without any // errors, False$ if there is a problem running any of the queries. //---------------------------------------------------------------------------------------------------------------------- Service ExecuteQueries(objConnection, QueryStatements) AllAccepted = True$ ; // Assume all queries were accepted for now unless otherwise proven. If (objConnection NE '') AND (QueryStatements NE '') then For Each QueryStatement in QueryStatements using @FM objRecordSet = SRP_COM(objConnection, 'CALL', 'Execute', QueryStatement) If SQL_Services('HasConnectionObjectErrors', objConnection) then Error = SQL_Services('GetConnectionObjectErrors', objConnection) Error_Services('Add', 'ADO error in the ' : Service : ' service: ' : Error) AllAccepted = False$ end SRP_COM(objRecordSet, 'CALL', 'Cancel') SRP_COM(objRecordSet, 'RELEASE') Until Not(AllAccepted) Next QueryStatement end else AllAccepted = False$ Error_Services('Add', 'The objConnection or QueryStatement argument was missing in the ' : Service : ' service.') end Response = AllAccepted end service //---------------------------------------------------------------------------------------------------------------------- // GetAllQueryDataRows // // objRecordSet - RecordSet Object (see ExecuteQuery service.) // objConnection - Connection Object (see GetConnectionObject service.) // // Gets all of the data rows from the RecordSet Object. This returns an @RM array of data rows. //---------------------------------------------------------------------------------------------------------------------- Service GetAllQueryDataRows(objRecordSet, objConnection) DataRows = '' TableName = '' Error = '' If objRecordSet NE '' then DataRows = SRP_COM(objRecordSet, 'CALL', 'GetString', 2, -1, @FM, @RM) If SQL_Services('HasConnectionObjectErrors', objConnection) then Error = SQL_Services('GetConnectionObjectErrors', objConnection) end * If SRP_COM('', 'ERROR') then * Error = SRP_COM('', 'ERROR') * end If DataRows[-1, 1] EQ @RM then DataRows[-1, 1] = '' If DataRows EQ objRecordSet then DataRows = '' Error_Services('Add', 'Unknown ADO error in the ' : Service : ' service.') end else If SRP_COM('', 'ERROR') then Error = SRP_COM('', 'ERROR') If IndexC(Error, 'current record has been deleted', 1) then DataRows = '' end else Error_Services('Add', 'ADO error in the ' : Service : ' service: ' : SRP_COM('', 'ERROR')) end end end end else Error_Services('Add', 'The objRecordSet argument was missing in the ' : Service : ' service.') end Response = DataRows end service //---------------------------------------------------------------------------------------------------------------------- // GetServers // // Returns an @FM list of database servers. //---------------------------------------------------------------------------------------------------------------------- Service GetServers() Servers = Memory_Services('GetValue', ServiceKeyID) If Servers EQ '' then hSysEnv = Database_Services('GetTableHandle', 'SYSENV') If Error_Services('NoError') then Select hSysEnv EOF = False$ Loop Readnext SysEnvKeyID else EOF = True$ Until EOF If SysEnvKeyID[1, 31] EQ 'SRP_DATA_EXPORT*CONNECTION_INFO' then Servers := SysEnvKeyID[-1, 'B*'] : @FM Repeat Servers[-1, 1] = '' Servers = SRP_Array('SortRows', Servers, 'AL1', 'LIST', @FM, @VM) Memory_Services('SetValue', ServiceKeyID, Servers) end end Response = Servers end service //---------------------------------------------------------------------------------------------------------------------- // GetTableNames // // Server - Name of the server the connection object is bound to. This should be the same name that // will be used in the Data Source connection string. // // Returns an @FM list of database table names available through the current Connection Object. //---------------------------------------------------------------------------------------------------------------------- Service GetTableNames(Server=Servers) TableNames = '' If Server NE '' then objConnection = SQL_Services('GetConnectionObject', Server, 2) If Error_Services('NoError') then ErrorMessage = '' QueryStatement = "SELECT table_name FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo'" TableNames = SQL_Services('ExecuteQuery', objConnection, QueryStatement, True$) If Error_Services('NoError') then Convert @RM to @FM in TableNames end else ErrorMessage = Error_Services('GetMessage') end SQL_Services('DestroyConnectionObject', objConnection) If ErrorMessage NE '' then Error_Services('Add', ErrorMessage) end end else Error_Services('Add', 'Server argument was missing from the ' : Service : ' service.') end Response = TableNames end service //---------------------------------------------------------------------------------------------------------------------- // GetTableColumns // // Server - Name of the server the connection object is bound to. This should be the same name that // will be used in the Data Source connection string. // TableName - Database Table whose column data is being requested. // // Returns an @FM/@VM array of database column information. //---------------------------------------------------------------------------------------------------------------------- Service GetTableColumns(Server=Servers, TableName, DoNotDestroy) TableColumns = '' If Unassigned(DoNotDestroy) Then DoNotDestroy = False$ If (Server NE '') AND (TableName NE '') then objConnection = SQL_Services('GetConnectionObject', Server, 2) If Error_Services('NoError') then ErrorMessage = '' * QueryStatement = 'SELECT column_name,data_type,character_maximum_length FROM information_schema.columns with (nolock) WHERE table_name = ' : "'" : TableName : "'" QueryStatement = "SELECT '['+column_name+']' AS column_name,data_type,character_maximum_length FROM information_schema.columns with (nolock) WHERE table_name = " : "'" : TableName : "'" TableColumns = SQL_Services('ExecuteQuery', objConnection, QueryStatement, True$) If Error_Services('NoError') then Convert @FM to @VM in TableColumns Convert @RM to @FM in TableColumns end else ErrorMessage = Error_Services('GetMessage') end If DoNotDestroy = True$ Else SQL_Services('DestroyConnectionObject', objConnection) End If ErrorMessage NE '' then Error_Services('Add', ErrorMessage) end end else Error_Services('Add', 'The Server or TableName argument was missing in the ' : Service : ' service.') end Response = TableColumns end service //---------------------------------------------------------------------------------------------------------------------- // SetOITableToSQLMap // // TableName - OpenInsight table being mapped. - [Required] // SQLMap - JSON object containing the OI Table to SQL Map information. - [Required] // // Updates the stored JSON object that defines the mapping between the indicated OpenInsight table and the SQL table. //---------------------------------------------------------------------------------------------------------------------- Service SetOITableToSQLMap(TableName, SQLMap) Convert @Lower_Case to @Upper_Case in TableName ServiceKeyID = ServiceModule : '*' : 'GetOITableToSQLMap' : '*' : TableName If (TableName NE '') AND (SQLMap NE '') then Convert \0D0A\ to @FM in SQLMap ; // Makes it easier to inspect. The GetOITableToSQLMap service removes the @FMs. Database_Services('WriteDataRow', 'DICT.' : TableName, '%SQLMap%', SQLMap, True$) If Error_Services('NoError') then Convert @FM to '' in SQLMap Memory_Services('SetValue', ServiceKeyID, SQLMap) end end else Error_Services('Add', 'The TableName or SQLMap argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // GetOITableToSQLMap // // TableName - OpenInsight table being mapped. - [Required] // // Returns JSON object that defines the mapping between the indicated OpenInsight table and the SQL table. //---------------------------------------------------------------------------------------------------------------------- Service GetOITableToSQLMap(TableName) Convert @Lower_Case to @Upper_Case in TableName ServiceKeyID := '*' : TableName * OITableToSQLMap = Memory_Services('GetValue', ServiceKeyID) OITableToSQLMap = '' If OITableToSQLMap EQ '' then If TableName NE '' then OITableToSQLMap = Database_Services('ReadDataRow', 'DICT.' : TableName, '%SQLMap%') Convert @FM to '' in OITableToSQLMap If OITableToSQLMap NE '' then Memory_Services('SetValue', ServiceKeyID, OITableToSQLMap) end end else Error_Services('Add', 'The TableName argument was missing in the ' : Service : ' service.') end end Response = OITableToSQLMap end service //---------------------------------------------------------------------------------------------------------------------- // SetOIColumnToSQLMap // // TableName - OpenInsight table being mapped. - [Required] // ColumnName - Database column from the OpenInsight table. - [Required] // SQLMap - JSON object containing the OI Column to SQL Map information. - [Required] // // Updates the stored JSON object that defines the mapping between the indicated OpenInsight column and the SQL table. //---------------------------------------------------------------------------------------------------------------------- Service SetOIColumnToSQLMap(TableName, ColumnName, SQLMap) Convert @Lower_Case to @Upper_Case in TableName Convert @Lower_Case to @Upper_Case in ColumnName ServiceKeyID = ServiceModule : '*' : 'GetOIColumnToSQLMap' : '*' : TableName : '*' : ColumnName If (TableName NE '') AND (ColumnName NE '') AND (SQLMap NE '') then Convert @FM to '' in SQLMap Convert \0D0A\ to '' in SQLMap ColumnData = Database_Services('ReadDataRow', 'DICT.' : TableName, ColumnName) ColumnData = SQLMap Database_Services('WriteDataRow', 'DICT.' : TableName, ColumnName, ColumnData, True$) If Error_Services('NoError') then Memory_Services('SetValue', ServiceKeyID, SQLMap) end end else Error_Services('Add', 'The TableName, ColumnName, or SQLMap argument was missing in the ' : Service : ' service.') end end service //---------------------------------------------------------------------------------------------------------------------- // GetAllOIColumnToSQLMaps // // TableName - OpenInsight table being mapped. - [Required] // // Returns an @FM/@VM delimited array of all JSON objects that define the mapping being the table columns and their // respective SQL table columns. Columns with no maps will return an empty string for the JSON object. //---------------------------------------------------------------------------------------------------------------------- Service GetAllOIColumnToSQLMaps(TableName) Convert @Lower_Case to @Upper_Case in TableName ColumnSQLMaps = '' If TableName NE '' then FieldArray = Database_Services('ReadDataRow', 'DICT.' : TableName, '%FIELDS%') ColumnNames = FieldArray For Each ColumnName in ColumnNames using @VM SQLMap = SQL_Services('GetOIColumnToSQLMap', TableName, ColumnName) ColumnSQLMaps := ColumnName : @VM If SQLMap NE '' then ColumnSQLMaps := SQLMap end ColumnSQLMaps := @FM Next ColumnName ColumnSQLMaps[-1, 1] = '' end else Error_Services('Add', 'The TableName argument was missing in the ' : Service : ' service.') end Response = ColumnSQLMaps end service //---------------------------------------------------------------------------------------------------------------------- // GetOIColumnToSQLMap // // TableName - OpenInsight table being mapped. - [Required] // ColumnName - Database column from the OpenInsight table. - [Required] // // Returns JSON object that defines the mapping between the indicated OpenInsight table column and the SQL table column. //---------------------------------------------------------------------------------------------------------------------- Service GetOIColumnToSQLMap(TableName, ColumnName) Convert @Lower_Case to @Upper_Case in TableName Convert @Lower_Case to @Upper_Case in ColumnName ServiceKeyID := '*' : TableName : '*' : ColumnName OIColumnToSQLMap = Memory_Services('GetValue', ServiceKeyID) If OIColumnToSQLMap EQ '' then If (TableName NE '') AND (ColumnName NE '') then ColumnData = Database_Services('ReadDataRow', 'DICT.' : TableName, ColumnName) OIColumnToSQLMap = ColumnData If OIColumnToSQLMap NE '' then Memory_Services('SetValue', ServiceKeyID, OIColumnToSQLMap) end end else Error_Services('Add', 'The TableName or ColumnName argument was missing in the ' : Service : ' service.') end end Response = OIColumnToSQLMap end service //---------------------------------------------------------------------------------------------------------------------- // GetSQLServer // // Returns the name of the SQL Server that the indicated OpenInsight table is mapped to. //---------------------------------------------------------------------------------------------------------------------- Service GetSQLServer(OITableName) Convert @Lower_Case to @Upper_Case in OITableName ServiceKeyID := '*' : OITableName SQLServer = Memory_Services('GetValue', ServiceKeyID) If SQLServer EQ '' then If OITableName NE '' then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then SQLServer = SRP_JSON(MapObj, 'GETVALUE', 'SQLServer.Name') SRP_JSON(MapObj, 'RELEASE') end If SQLServer NE '' then Memory_Services('SetValue', ServiceKeyID, SQLServer) end else Error_Services('Add', 'The OITableName argument was missing in the ' : Service : ' service.') end end Response = SQLServer end service //---------------------------------------------------------------------------------------------------------------------- // GetPrimarySQLTable // // Returns the name of the primary SQL table that the indicated OpenInsight table is mapped to. //---------------------------------------------------------------------------------------------------------------------- Service GetPrimarySQLTable(OITableName) Convert @Lower_Case to @Upper_Case in OITableName ServiceKeyID := '*' : OITableName PrimarySQLTable = Memory_Services('GetValue', ServiceKeyID) If PrimarySQLTable EQ '' then If OITableName NE '' then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then PrimarySQLTable = SRP_JSON(MapObj, 'GETVALUE', 'PrimarySQLTable.Name') SRP_JSON(MapObj, 'RELEASE') end If PrimarySQLTable NE '' then Memory_Services('SetValue', ServiceKeyID, PrimarySQLTable) end else Error_Services('Add', 'The OITableName argument was missing in the ' : Service : ' service.') end end Response = PrimarySQLTable end service //---------------------------------------------------------------------------------------------------------------------- // GetSecondarySQLTables // // Returns an @FM delimited list of the secondary SQL tables that the indicated OpenInsight table is mapped to. //---------------------------------------------------------------------------------------------------------------------- Service GetSecondarySQLTables(OITableName) Convert @Lower_Case to @Upper_Case in OITableName ServiceKeyID := '*' : OITableName SecondarySQLTables = Memory_Services('GetValue', ServiceKeyID) If SecondarySQLTables EQ '' then If OITableName NE '' then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then TablesArray = SRP_JSON(MapObj, 'GET', 'SecondarySQLTables') NumTables = SRP_JSON(TablesArray, 'GETCOUNT') MatchFound = False$ For TableNum = 1 to NumTables SecondarySQLTables := SRP_JSON(TablesArray, 'GETVALUE', '[' : TableNum : '].Name', '') : @FM Until MatchFound Next TableNum SRP_JSON(TablesArray, 'RELEASE') SRP_JSON(MapObj, 'RELEASE') end SecondarySQLTables[-1, 1] = '' If SecondarySQLTables NE '' then Memory_Services('SetValue', ServiceKeyID, SecondarySQLTables) end else Error_Services('Add', 'The OITableName argument was missing in the ' : Service : ' service.') end end Response = SecondarySQLTables end service //---------------------------------------------------------------------------------------------------------------------- // GetStaticSQLColumnNames // // Returns an @FM delimited list of SQL column names that have a static value. These are usually used in a SQL insert // statement along with the mapped columns. //---------------------------------------------------------------------------------------------------------------------- Service GetStaticSQLColumnNames(OITableName) Convert @Lower_Case to @Upper_Case in OITableName ServiceKeyID := '*' : OITableName * StaticSQLColumnNames = Memory_Services('GetValue', ServiceKeyID) StaticSQLColumnNames = '' If StaticSQLColumnNames EQ '' then If (OITableName NE '') then // Add all OpenInsight columns defined in the SQL Join Clause. OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then StaticColumnsArray = SRP_JSON(MapObj, 'GET', 'StaticColumns') NumColumns = SRP_JSON(StaticColumnsArray, 'GETCOUNT') For ColumnNum = 1 to NumColumns objStaticColumn = SRP_JSON(StaticColumnsArray, 'GET', '[' : ColumnNum : ']') StaticSQLColumnName = SRP_JSON(objStaticColumn, 'GETMEMBERS') If StaticSQLColumnName[1, 1] EQ '(' then Convert '(' to '[' in StaticSQLColumnName Convert ')' to ']' in StaticSQLColumnName end StaticSQLColumnNames := StaticSQLColumnName : @FM SRP_JSON(objStaticColumn, 'RELEASE') Next NumColumns StaticSQLColumnNames[-1, 1] = '' SRP_JSON(StaticColumnsArray, 'RELEASE') SRP_JSON(MapObj, 'RELEASE') end If StaticSQLColumnNames NE '' then Memory_Services('SetValue', ServiceKeyID, StaticSQLColumnNames) end else Error_Services('Add', 'The OITableName argument was missing in the ' : Service : ' service.') end end Response = StaticSQLColumnNames end service //---------------------------------------------------------------------------------------------------------------------- // GetStaticSQLColumnValues // // Returns an @FM delimited list of values for SQL column names that have a static value. These are usually used in a // SQL insert statement along with the mapped columns. //---------------------------------------------------------------------------------------------------------------------- Service GetStaticSQLColumnValues(OITableName) Convert @Lower_Case to @Upper_Case in OITableName ServiceKeyID := '*' : OITableName StaticSQLColumnValues = Memory_Services('GetValue', ServiceKeyID) If StaticSQLColumnValues EQ '' then If (OITableName NE '') then // Add all OpenInsight columns defined in the SQL Join Clause. OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then StaticColumnsArray = SRP_JSON(MapObj, 'GET', 'StaticColumns') NumColumns = SRP_JSON(StaticColumnsArray, 'GETCOUNT') For ColumnNum = 1 to NumColumns objStaticColumn = SRP_JSON(StaticColumnsArray, 'GET', '[' : ColumnNum : ']') StaticSQLColumnName = SRP_JSON(objStaticColumn, 'GETMEMBERS') StaticValue = SRP_JSON(objStaticColumn, 'GETVALUE', StaticSQLColumnName, '') StaticValue = "'" : StaticValue : "'" StaticSQLColumnValues := StaticValue : @FM SRP_JSON(objStaticColumn, 'RELEASE') Next NumColumns StaticSQLColumnValues[-1, 1] = '' SRP_JSON(StaticColumnsArray, 'RELEASE') SRP_JSON(MapObj, 'RELEASE') end If StaticSQLColumnValues NE '' then Memory_Services('SetValue', ServiceKeyID, StaticSQLColumnValues) end else Error_Services('Add', 'The OITableName argument was missing in the ' : Service : ' service.') end end Response = StaticSQLColumnValues end service //---------------------------------------------------------------------------------------------------------------------- // GetAMVMaster // // Returns the name of the OpenInsight column used as the AMV (associated multivalue) master used to determine the // number of values needed to write into the secondary SQL table. //---------------------------------------------------------------------------------------------------------------------- Service GetAMVMaster(OITableName, SQLTableName) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName ServiceKeyID := '*' : OITableName : '*' : SQLTableName AMVMaster = Memory_Services('GetValue', ServiceKeyID) If AMVMaster EQ '' then If (OITableName NE '') AND (SQLTableName NE '') then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) JoinArray = '' ; // Initialize the array. If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then PrimarySQLTableName = SRP_JSON(MapObj, 'GETVALUE', 'PrimarySQLTable.Name') If SQLTableName _EQC PrimarySQLTableName then // Primary SQL tables do not have a Seq Key. Just return the empty string. end else // Look for a matching secondary SQL table. TablesArray = SRP_JSON(MapObj, 'GET', 'SecondarySQLTables') NumTables = SRP_JSON(TablesArray, 'GETCOUNT') MatchFound = False$ For TableNum = 1 to NumTables SecondarySQLTableName = SRP_JSON(TablesArray, 'GETVALUE', '[' : TableNum : '].Name', '') If SQLTableName _EQC SecondarySQLTableName then AMVMaster = SRP_JSON(TablesArray, 'GETVALUE', '[' : TableNum : '].AMVMaster', '') Swap '' with '' in AMVMaster MatchFound = True$ end Until MatchFound Next TableNum SRP_JSON(TablesArray, 'RELEASE') end SRP_JSON(MapObj, 'RELEASE') end If AMVMaster NE '' then Memory_Services('SetValue', ServiceKeyID, AMVMaster) end else Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.') end end Response = AMVMaster end service //---------------------------------------------------------------------------------------------------------------------- // GetJoinedOIColumns // // Returns an @FM list of column names from the indicated OpenInsight table that are used to join with the indicated // SQL table. //---------------------------------------------------------------------------------------------------------------------- Service GetJoinedOIColumns(OITableName, SQLTableName) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName ServiceKeyID := '*' : OITableName : '*' : SQLTableName JoinedOIColumns = Memory_Services('GetValue', ServiceKeyID) If JoinedOIColumns EQ '' then If (OITableName NE '') AND (SQLTableName NE '') then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) JoinArray = '' ; // Initialize the array. If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then PrimarySQLTableName = SRP_JSON(MapObj, 'GETVALUE', 'PrimarySQLTable.Name') If SQLTableName _EQC PrimarySQLTableName then // Use the join array from the primary SQL Table. JoinArray = SRP_JSON(MapObj, 'GET', 'PrimarySQLTable.JoinClause') end else // Look for a matching secondary SQL table. TablesArray = SRP_JSON(MapObj, 'GET', 'SecondarySQLTables') NumTables = SRP_JSON(TablesArray, 'GETCOUNT') MatchFound = False$ For TableNum = 1 to NumTables TableObj = SRP_JSON(TablesArray, 'GET', '[' : TableNum : ']') SecondarySQLTableName = SRP_JSON(TableObj, 'GETVALUE', 'Name', '') If SQLTableName _EQC SecondarySQLTableName then JoinArray = SRP_JSON(TableObj, 'GET', 'JoinClause') MatchFound = True$ end SRP_JSON(TableObj, 'RELEASE') Until MatchFound Next TableNum SRP_JSON(TablesArray, 'RELEASE') end SRP_JSON(MapObj, 'RELEASE') end If JoinArray GT 0 then NumColumns = SRP_JSON(JoinArray, 'GETCOUNT') For ColumnNo = 1 to NumColumns OIColumnName = SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'OIColumnName', '') JoinedOIColumns := OIColumnName : @FM Next ColumnNo JoinedOIColumns[-1, 1] = '' SRP_JSON(JoinArray, 'RELEASE') end If JoinedOIColumns NE '' then Memory_Services('SetValue', ServiceKeyID, JoinedOIColumns) end else Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.') end end Response = JoinedOIColumns end service //---------------------------------------------------------------------------------------------------------------------- // GetJoinClause // // Returns a well formed join clause using the indicated OpenInsight Key ID and row for the indicated OpenInsight table // and SQL table. Note: OIRow will likely be an empty string since most join clauses will be based on the OpenInsight // Key ID. //---------------------------------------------------------------------------------------------------------------------- Service GetJoinClause(OITableName, SQLTableName, OIKeyID, OIRow) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName JoinClause = '' If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') then OITableToSQLMap = SQL_Services('GetOITableToSQLMap', OITableName) If Error_Services('NoError') then FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%') end If Error_Services('NoError') then JoinArray = '' ; // Initialize the array. If SRP_JSON(MapObj, 'PARSE', OITableToSQLMap) EQ '' then PrimarySQLTableName = SRP_JSON(MapObj, 'GETVALUE', 'PrimarySQLTable.Name') If SQLTableName _EQC PrimarySQLTableName then // Use the join array from the primary SQL Table. JoinArray = SRP_JSON(MapObj, 'GET', 'PrimarySQLTable.JoinClause') end else // Look for a matching secondary SQL table. TablesArray = SRP_JSON(MapObj, 'GET', 'SecondarySQLTables') NumTables = SRP_JSON(TablesArray, 'GETCOUNT') MatchFound = False$ For TableNum = 1 to NumTables TableObj = SRP_JSON(TablesArray, 'GET', '[' : TableNum : ']') SecondarySQLTableName = SRP_JSON(TableObj, 'GETVALUE', 'Name', '') If SQLTableName _EQC SecondarySQLTableName then JoinArray = SRP_JSON(TableObj, 'GET', 'JoinClause') MatchFound = True$ end SRP_JSON(TableObj, 'RELEASE') Until MatchFound Next TableNum SRP_JSON(TablesArray, 'RELEASE') end SRP_JSON(MapObj, 'RELEASE') end If JoinArray GT 0 then NumColumns = SRP_JSON(JoinArray, 'GETCOUNT') For ColumnNo = 1 to NumColumns JoinClause := SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'SQLColumnName', '') : ' ' JoinClause := SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'Operator', '') : ' ' OIColumnName = SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'OIColumnName', '') Locate OIColumnName in FieldArray using @VM setting vPos then OIColumnType = FieldArray If OIColumnType EQ 'F' then OIColumnPos = FieldArray If OIColumnPos GT 0 then OIColumnValue = OIRow end else OIKeyPart = FieldArray OIColumnValue = Field(OIKeyID, '*', OIKeyPart, 1) end end else * OIColumnValue = Calculate(OIColumnName) ; // Actual logic used in MFS OIColumnValue = Xlate(OITableName, OIKeyID, OIColumnName, 'X') end end else OIColumnValue = '' end JoinClause := "'" : OIColumnValue : "'" JoinClause := @FM Next ColumnNo JoinClause[-1, 1] = '' Swap @FM with ' AND ' in JoinClause SRP_JSON(JoinArray, 'RELEASE') end end end else Error_Services('Add', 'The OITableName, SQLTableName, OIKeyID argument was missing in the ' : Service : ' service.') end Response = JoinClause end service //---------------------------------------------------------------------------------------------------------------------- // GetMappedOIColumnNames // // Returns an @FM delimited list of OpenInsight column names from the indicated table that are mapped to the indicated // SQL table. //---------------------------------------------------------------------------------------------------------------------- Service GetMappedOIColumnNames(OITableName, SQLTableName) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName ServiceKeyID := '*' : OITableName : '*' : SQLTableName MappedOIColumnNames = Memory_Services('GetValue', ServiceKeyID) If MappedOIColumnNames EQ '' then If (OITableName NE '') AND (SQLTableName NE '') then // Add all OpenInsight columns defined in the SQL Join Clause. JoinedOIColumns = SQL_Services('GetJoinedOIColumns', OITableName, SQLTableName) If JoinedOIColumns NE '' then Convert @VM to @FM in JoinedOIColumns MappedOIColumnNames := JoinedOIColumns : @FM end // Go through all of the OpenInsight column SQL maps and add any column which is bound to the same SQL // table. Note, one or more of these columns might already be in the list from the GetJoinedOIColumns service. // These will be skipped. AllOIColumnToSQLMaps = SQL_Services('GetAllOIColumnToSQLMaps', OITableName) For Each OIColumnToSQLMap in AllOIColumnToSQLMaps using @FM setting fPos If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap<0, 2>) EQ '' then MappedSQLTableName = SRP_JSON(MapObj, 'GETVALUE', 'SQLTableName') If (MappedSQLTableName NE '') AND (SQLTableName EQ MappedSQLTableName) then OIColumnName = OIColumnToSQLMap<0, 1> Locate OIColumnName in MappedOIColumnNames using @FM setting fPos else MappedOIColumnNames := OIColumnName : @FM end end end Next OIColumnToSQLMap MappedOIColumnNames[-1, 1] = '' If MappedOIColumnNames NE '' then Memory_Services('SetValue', ServiceKeyID, MappedOIColumnNames) end else Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.') end end Response = MappedOIColumnNames end service //---------------------------------------------------------------------------------------------------------------------- // GetMappedSQLColumnNames // // Returns an @FM delimited list of SQL column names from the indicated table that are mapped from the indicated // OpenInsight table and associated OpenInsight columns. //---------------------------------------------------------------------------------------------------------------------- Service GetMappedSQLColumnNames(OITableName, SQLTableName, OIColumns) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName ServiceKeyID := '*' : OITableName : '*' : SQLTableName * MappedSQLColumnNames = Memory_Services('GetValue', ServiceKeyID) MappedSQLColumnNames = '' If MappedSQLColumnNames EQ '' then If (OITableName NE '') AND (SQLTableName NE '') then OIColumnNames = SQL_Services('GetMappedOIColumnNames', OITableName, SQLTableName) If OIColumns NE '' then OIColumnNames = SRP_Array('Join', OIColumnNames, OIColumns, 'AND', @FM) end For Each OIColumnName in OIColumnNames using @FM setting fPos OIColumnToSQLMap = SQL_Services('GetOIColumnToSQLMap', OITableName, OIColumnName) If Error_Services('NoError') then If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then MappedSQLColumnNames := SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnName') : @FM SRP_JSON(MapObj, 'RELEASE') end end Next OIColumnName MappedSQLColumnNames[-1, 1] = '' If MappedSQLColumnNames NE '' then Memory_Services('SetValue', ServiceKeyID, MappedSQLColumnNames) end else Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.') end end Response = MappedSQLColumnNames end service //---------------------------------------------------------------------------------------------------------------------- // GetMappedSQLColumnValues // // Returns an @FM delimited list of SQL column values for the indicated table that are derived from the indicated // OpenInsight table and associated OpenInsight columns. This service is normally called to create a fully formed Insert // query statement. //---------------------------------------------------------------------------------------------------------------------- Service GetMappedSQLColumnValues(OITableName, SQLTableName, OIKeyID, OIRow, AMVPosition, OIColumns) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName If Num(AMVPosition) else AMVPosition = '' MappedSQLColumnValues = '' If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') AND (OIRow NE '') then FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%') OIColumnNames = SQL_Services('GetMappedOIColumnNames', OITableName, SQLTableName) If OIColumns NE '' then OIColumnNames = SRP_Array('Join', OIColumnNames, OIColumns, 'AND', @FM) end If OIColumnNames NE '' then For Each OIColumnName in OIColumnNames using @FM setting fPos Locate OIColumnName in FieldArray using @VM setting vPos then OIColumnToSQLMap = SQL_Services('GetOIColumnToSQLMap', OITableName, OIColumnName) If Error_Services('NoError') then If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then SQLColumnType = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnType') OIColumnType = FieldArray If OIColumnType EQ 'F' then OIColumnPos = FieldArray If OIColumnPos GT 0 then OIColumnValue = OIRow end else OIKeyPart = FieldArray OIColumnValue = Field(OIKeyID, '*', OIKeyPart, 1) If OIColumnValue EQ '' then Error_Services('Add', 'Key ID Column ' : OIColumnName : ' was assigned an empty string value in ' : Service : '.') end end end else // OIColumnValue = Calculate(OIColumnName) ; // Actual logic used in MFS OIColumnValue = Xlate(OITablename, OIKeyID, OIColumnName, 'X') end If AMVPosition NE '' then OIColumnValue = OIColumnValue<0, AMVPosition> end Begin Case Case OIColumnValue EQ '' // Empty strings are treated as NULL values. OIColumnValue = 'NULL' Case SQLColumnType[1, 7] _EQC 'VARCHAR' OR SQLColumnType _EQC 'CHAR' // Single quote the value. SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength') If (SQLColumnLength EQ '') OR (SQLColumnLength EQ -1) then SQLColumnLength = Len(OIColumnValue) OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Fmt(OIColumnValue, OIColumnConv) end OIColumnValue = OIColumnValue[1, SQLColumnLength, 1] Swap "'" with "''" in OIColumnValue OIColumnValue = "'" : OIColumnValue : "'" Case SQLColumnType _EQC 'INT' // Oconv based on the OI column output conversion if it exists. OIColumnConv = 'MD0' If OIColumnConv NE '' then OIColumnValue = Fmt(OIColumnValue, OIColumnConv) end Case SQLColumnType _EQC 'NUMBER' // Oconv based on the OI column output conversion if it exists. OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Fmt(OIColumnValue, OIColumnConv) end Case SQLColumnType _EQC 'DECIMAL' // Oconv based on the OI column type. // Oconv based on the OI column output conversion if it exists. OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Fmt(OIColumnValue, OIColumnConv) end Case SQLColumnType _EQC 'DATE' OIColumnValue = "TO_DATE('" : Oconv(OIColumnValue, 'D4/J') : "', 'yyyy/mm/dd')" Case Otherwise$ // Treat as a VARCHAR2 and single quote the value. SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength') If SQLColumnLength EQ '' then SQLColumnLength = Len(OIColumnValue) OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Fmt(OIColumnValue, OIColumnConv) end OIColumnValue = OIColumnValue[1, SQLColumnLength, 1] Swap "'" with "''" in OIColumnValue OIColumnValue = "'" : OIColumnValue : "'" End Case // Basic conversion rules. Convert \09\ to ' ' in OIColumnValue Swap \0D0A\ with ' ' in OIColumnValue Convert @VM to '|' in OIColumnValue Convert @SVM to ' ' in OIColumnValue Convert @TM to ' ' in OIColumnValue Convert @STM to ' ' in OIColumnValue MappedSQLColumnValues := OIColumnValue : @FM SRP_JSON(MapObj, 'RELEASE') end end end While Error_Services('NoError') Next OIColumnName end MappedSQLColumnValues[-1, 1] = '' end else Error_Services('Add', 'The OITableName, SQLTableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.') end Response = MappedSQLColumnValues end service //---------------------------------------------------------------------------------------------------------------------- // GetSQLDeleteStatements // // Returns an @FM delimited list of SQL delete statements for the SQL table mapped to the indicated OpenInsight table. // This will automatically create all SQL delete statements for secondary SQL tables as well. Note: OIRow will likely be // an empty string since most join clauses will be based on the OpenInsight Key ID. //---------------------------------------------------------------------------------------------------------------------- Service GetSQLDeleteStatements(OITableName, OIKeyID, OIRow) Convert @Lower_Case to @Upper_Case in OITableName SQLDeleteStatements = '' If (OITableName NE '') AND (OIKeyID NE '') then // Start with the primary SQL table that is mapped to this OpenInsight table. PrimarySQLTableName = SQL_Services('GetPrimarySQLTable', OITableName) JoinClause = SQL_Services('GetJoinClause', OITableName, PrimarySQLTableName, OIKeyID, OIRow) SQLDeleteStatement = '' SQLDeleteStatement := 'DELETE FROM ' : PrimarySQLTableName : ' ' SQLDeleteStatement := 'WHERE ' SQLDeleteStatement := JoinClause SQLDeleteStatements := SQLDeleteStatement : @FM // Add any secondary SQL table inserts that might be required. SecondarySQLTableNames = SQL_Services('GetSecondarySQLTables', OITableName) If SecondarySQLTableNames NE '' then For Each SecondarySQLTableName in SecondarySQLTableNames using @FM JoinClause = SQL_Services('GetJoinClause', OITableName, SecondarySQLTableName, OIKeyID, OIRow) SQLDeleteStatement = '' SQLDeleteStatement := 'DELETE FROM ' : SecondarySQLTableName : ' ' SQLDeleteStatement := 'WHERE ' SQLDeleteStatement := JoinClause SQLDeleteStatements := SQLDeleteStatement : @FM Next SecondarySQLTableName end SQLDeleteStatements[-1, 1] = '' end else Error_Services('Add', 'The OITableName or OIKeyID argument was missing in the ' : Service : ' service.') end Response = SQLDeleteStatements end service //---------------------------------------------------------------------------------------------------------------------- // GetSQLInsertStatements // // Returns an @FM delimited list of SQL insert statements for the SQL table mapped to the indicated OpenInsight table. // This will automatically create all SQL insert statements for secondary SQL tables as well. //---------------------------------------------------------------------------------------------------------------------- Service GetSQLInsertStatements(OITableName, OIKeyID, OIRow, OIColumns) Convert @Lower_Case to @Upper_Case in OITableName SQLInsertStatements = '' If (OITableName NE '') AND (OIKeyID NE '') AND (OIRow NE '') then // Start with the primary SQL table that is mapped to this OpenInsight table. PrimarySQLTableName = SQL_Services('GetPrimarySQLTable', OITableName) MappedSQLColumnNames = SQL_Services('GetMappedSQLColumnNames', OITableName, PrimarySQLTableName, OIColumns) MappedSQLColumnValues = SQL_Services('GetMappedSQLColumnValues', OITablename, PrimarySQLTableName, OIKeyID, OIRow, '', OIColumns) StaticSQLColumnNames = SQL_Services('GetStaticSQLColumnNames', OITableName) If StaticSQLColumnNames NE '' then MappedSQLColumnNames := @FM : StaticSQLColumnNames StaticSQLColumnValues = SQL_Services('GetStaticSQLColumnValues', OITableName) MappedSQLColumnValues := @FM : StaticSQLColumnValues end Swap @FM with ', ' in MappedSQLColumnNames Swap @FM with ", " in MappedSQLColumnValues SQLInsertStatement = '' SQLInsertStatement := 'INSERT INTO ' : PrimarySQLTableName : ' ' SQLInsertStatement := '(' SQLInsertStatement := MappedSQLColumnNames SQLInsertStatement := ') VALUES (' SQLInsertStatement := MappedSQLColumnValues SQLInsertStatement := ')' SQLInsertStatements := SQLInsertStatement : @FM If Error_Services('NoError') then // Add any secondary SQL table inserts that might be required. SecondarySQLTableNames = SQL_Services('GetSecondarySQLTables', OITableName) If SecondarySQLTableNames NE '' then For Each SecondarySQLTableName in SecondarySQLTableNames using @FM AMVMaster = SQL_Services('GetAMVMaster', OITableName, SecondarySQLTableName) FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%') If Error_Services('NoError') then Locate AMVMaster in FieldArray using @VM setting vPos then OIColumnType = FieldArray If OIColumnType EQ 'F' then OIColumnPos = FieldArray If OIColumnPos GT 0 then OIColumnValue = OIRow end else OIKeyPart = FieldArray OIColumnValue = Field(OIKeyID, '*', OIKeyPart, 1) end end else // OIColumnValue = Calculate(OIColumnName) ; // Actual logic used in MFS OIColumnValue = Xlate(OITablename, OIKeyID, OIColumnName, 'X') end NumPositions = DCount(OIColumnValue, @VM) end else NumPositions = 1 end end else NumPositions = 1 end For AMVPosition = 1 to NumPositions MappedSQLColumnNames = '' MappedSQLColumnValues = '' MappedSQLColumnNames := SQL_Services('GetMappedSQLColumnNames', OITableName, SecondarySQLTableName) : @FM MappedSQLColumnValues := SQL_Services('GetMappedSQLColumnValues', OITablename, SecondarySQLTableName, OIKeyID, OIRow, AMVPosition) : @FM MappedSQLColumnNames[-1, 1] = '' MappedSQLColumnValues[-1, 1] = '' Swap @FM with ', ' in MappedSQLColumnNames Swap @FM with ", " in MappedSQLColumnValues SQLInsertStatement = '' SQLInsertStatement := 'INSERT INTO ' : SecondarySQLTableName : ' ' SQLInsertStatement := '(' SQLInsertStatement := MappedSQLColumnNames SQLInsertStatement := ') VALUES (' SQLInsertStatement := MappedSQLColumnValues SQLInsertStatement := ')' SQLInsertStatements := SQLInsertStatement : @FM Next AMVPosition Next SecondarySQLTableName end end SQLInsertStatements[-1, 1] = '' end else Error_Services('Add', 'The OITableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.') end Response = SQLInsertStatements end service //---------------------------------------------------------------------------------------------------------------------- // GetSQLSelectStatement // // Returns the SQL select statement for the indicated SQL table based on its mapping to the indicated OpenInsight table. //---------------------------------------------------------------------------------------------------------------------- Service GetSQLSelectStatement(OITableName, SQLTableName, OIKeyID) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName SQLSelectStatement = '' If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') then JoinClause = SQL_Services('GetJoinClause', OITableName, SQLTableName, OIKeyID) MappedSQLColumnNames = SQL_Services('GetMappedSQLColumnNames', OITableName, SQLTableName) Swap @FM with ', ' in MappedSQLColumnNames SQLSelectStatement = '' SQLSelectStatement := 'SELECT ' SQLSelectStatement := MappedSQLColumnNames : ' ' SQLSelectStatement := 'FROM ' : SQLTableName : ' ' SQLSelectStatement := 'WHERE ' SQLSelectStatement := JoinClause : ' ' end else Error_Services('Add', 'The OITableName, SQLTableName, or OIKeyID argument was missing in the ' : Service : ' service.') end Response = SQLSelectStatement end service //---------------------------------------------------------------------------------------------------------------------- // GetMappedOIColumnValues // // Returns an OpenInsight data row for the indicated table that are derived from the indicated SQL table and // corresponding SQL data. Note, since data can come from multiple SQL tables, the OIRow arguments can already contain // data from a previous call to this service. This allows primary and secondary SQL tables to be passed into this // service so that all relevant SQL data can be denormalized into a single OpenInsight data row. This service is // normally called to create a denormalized OpenInsight row. //---------------------------------------------------------------------------------------------------------------------- Service GetMappedOIColumnValues(OITableName, SQLTableName, SQLData, OIRow) Convert @Lower_Case to @Upper_Case in OITableName Convert @Lower_Case to @Upper_Case in SQLTableName If (OITableName NE '') AND (SQLTableName NE '') AND (SQLData NE '') then MappedOIColumnNames = SQL_Services('GetMappedOIColumnNames', OITableName, SQLTableName) MappedSQLColumnNames = SQL_Services('GetMappedSQLColumnNames', OITableName, SQLTableName) FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%') If Error_Services('NoError') then For Each SQLRow in SQLData using @RM setting ValuePos For Each SQLColumnName in MappedSQLColumnNames using @FM setting fPos OIColumnName = MappedOIColumnNames Locate OIColumnName in FieldArray using @VM setting vPos then OIColumnType = FieldArray OIColumnPos = FieldArray If OIColumnType EQ 'F' AND OIColumnPos NE 0 then OIColumnToSQLMap = SQL_Services('GetOIColumnToSQLMap', OITableName, OIColumnName) If Error_Services('NoError') then If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then SQLColumnType = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnType') OIColumnValue = SQLRow Swap '<@VM>' with @VM in OIColumnValue Swap @SVM with '<@SVM>' in OIColumnValue Swap @TM with '<@TM>' in OIColumnValue Swap @STM with '<@STM>' in OIColumnValue Begin Case Case OIColumnValue EQ '' // SQL values are empty strings. OIColumnValue = '' Case SQLColumnType _EQC 'NUMBER' // Oconv based on the OI column output conversion if it exists. OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Iconv(OIColumnValue, OIColumnConv) end Case SQLColumnType _EQC 'DECIMAL' // Oconv based on the OI column type. // Oconv based on the OI column output conversion if it exists. OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Iconv(OIColumnValue, OIColumnConv) end Case SQLColumnType _EQC 'DATE' // Oconv based on the OI column output conversion if it exists, but only if // the data is non-numeric. If Alpha(OIColumnValue) then OIColumnConv = FieldArray If OIColumnConv NE '' then OIColumnValue = Iconv(OIColumnValue, OIColumnConv) end end End Case OIRow = OIColumnValue end SRP_JSON(MapObj, 'RELEASE') end end end Next SQLColumnName Next SQLRow end end else Error_Services('Add', 'The SQLTableName, SQLData, or OITableName argument was missing in the ' : Service : ' service.') end Response = OIRow end service //---------------------------------------------------------------------------------------------------------------------- // LogConnectionActivity // // Appends the activity log for the Connection Object. //---------------------------------------------------------------------------------------------------------------------- Service LogConnectionActivity(Activity) If Activity NE '' then KeyID = '%SQL_CONNECTION_ACTIVITY_LOG%' ActivityLog = Database_Services('ReadDataRow', 'CONTROL', KeyID) If ActivityLog EQ '' then Transfer Activity to ActivityLog end else ActivityLog := @FM :Activity end Database_Services('WriteDataRow', 'CONTROL', KeyID, ActivityLog, True$) end else Error_Services('Add', 'The Activity argument was missing in the ' : Service : ' service.') end end service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////