2718 lines
144 KiB
Plaintext
2718 lines
144 KiB
Plaintext
Function SQL_Services_RevDotNet(@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_RevDotNet
|
|
|
|
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
|
|
|
|
History : (Date, Initials, Notes)
|
|
06/15/21 djs v1.0.0 - Module cloned from SQL_Services v2.0.8. Converted module to use RevDotNet
|
|
instead of SRP_COM.
|
|
|
|
***********************************************************************************************************************/
|
|
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
$insert LOGICAL
|
|
$insert SERVICE_SETUP
|
|
$insert SERVERS_EQUATES
|
|
$insert MICROSOFT_ADO_EQUATES
|
|
$insert DICT_EQUATES
|
|
$insert REVDOTNETEQUATES
|
|
|
|
Common /SQLServicesRevDotNet/ ConnectionObjects@, CommandObjects@, TransactionObjects@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@
|
|
|
|
Declare function Memory_Services, SQL_Services_RevDotNet, Database_Services, SRP_JSON, SRP_Array, SRP_Hash, SRP_COM, SRP_Encode
|
|
Declare function SRP_Date, SRP_DateTime, SRP_Time, Utility, Unicode_UTF8, Str_Unicode, GetTickCount, SRP_Decode
|
|
Declare function SRP_List
|
|
Declare subroutine Memory_Services, SQL_Services_RevDotNet, Database_Services, SRP_JSON, SRP_Stopwatch, SRP_COM, SRP_List
|
|
Declare subroutine GetTempPath, GetTempFileName, Sleepery, WinYield, Yield, RList, Set_Status
|
|
|
|
If ConnectionObjects@ EQ '' then
|
|
ConnectionObjects@ = SRP_List('Create')
|
|
CommandObjects@ = SRP_List('Create')
|
|
TransactionObjects@ = SRP_List('Create')
|
|
end
|
|
|
|
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$
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Services
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// WriteDataRowToSQL
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table being written to. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being written to SQL. - [Required]
|
|
// OIRow - The OpenInsight row being written to SQL. - [Required]
|
|
// OIColumns - An @FM delimited list of OpenInsight table columns that should only be used to write to SQL. If empty,
|
|
// all columns that have a map defintion will be used. - [Optional]
|
|
//
|
|
// 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_RevDotNet('GetMappedSQLServer', OITableName)
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', SQLServer, 2)
|
|
TransactionQueries = ''
|
|
|
|
If Error_Services('NoError') then
|
|
// Confirm if row already exists. This will determine if an INSERT or UPDATE should be made.
|
|
PrimarySQLTableName = SQL_Services_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, PrimarySQLTableName, OIKeyID, OIRow)
|
|
SQLStatement = 'SELECT TOP 1 * FROM ' : PrimarySQLTablename : ' WHERE ' : JoinClause
|
|
RowData = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLStatement, True$)
|
|
|
|
If RowData EQ '' then
|
|
// Create the INSERT statements to store the data in SQL.
|
|
TransactionQueries = SQL_Services_RevDotNet('GetSQLInsertStatements', OITableName, OIKeyID, OIRow, OIColumns)
|
|
|
|
end else
|
|
// Create the UPDATE statements to store the data in SQL.
|
|
TransactionQueries = SQL_Services_RevDotNet('GetSQLUpdateStatements', OITableName, OIKeyID, OIRow, OIColumns)
|
|
end
|
|
end
|
|
|
|
If Error_Services('NoError') AND (TransactionQueries NE '') then
|
|
// Process the tranaction queries.
|
|
SQL_Services_RevDotNet('ExecuteQueries', objConnection, TransactionQueries, True$, OITableName, OIKeyID)
|
|
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_RevDotNet('GetMappedSQLServer', OITableName)
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', SQLServer, 2)
|
|
TransactionQueries = ''
|
|
|
|
If Error_Services('NoError') then
|
|
// Confirm if row already exists. This will determine if an INSERT or UPDATE should be made.
|
|
PrimarySQLTableName = SQL_Services_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, PrimarySQLTableName, OIKeyID, OIRow)
|
|
SQLStatement = 'SELECT TOP 1 * FROM ' : PrimarySQLTablename : ' WHERE ' : JoinClause
|
|
RowData = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLStatement, True$)
|
|
|
|
If RowData NE '' then
|
|
// Create the DELETE statements so the data in SQL is cleared out first.
|
|
TransactionQueries = SQL_Services_RevDotNet('GetSQLDeleteStatements', OITableName, OIKeyID)
|
|
end
|
|
end
|
|
|
|
If Error_Services('NoError') AND (TransactionQueries NE '') then
|
|
// Process the tranaction queries.
|
|
SQL_Services_RevDotNet('ExecuteQueries', objConnection, TransactionQueries, True$)
|
|
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_RevDotNet('GetMappedSQLServer', OITableName)
|
|
objConnection = SQL_Services_RevDotNet('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_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
SQLSelectStatement = SQL_Services_RevDotNet('GetSQLSelectStatement', OITableName, SQLTableName, OIKeyID)
|
|
SQLData = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLSelectStatement, True$)
|
|
If (SQLData NE '') AND (Error_Services('NoError')) then
|
|
OIRow = SQL_Services_RevDotNet('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_RevDotNet('GetSecondarySQLTables', OITableName)
|
|
If SQLTableNames NE '' then
|
|
For Each SQLTableName in SQLTableNames using @FM
|
|
SQLSelectStatement = SQL_Services_RevDotNet('GetSQLSelectStatement', OITableName, SQLTableName, OIKeyID)
|
|
// Create a new or get an existing Connection Object.
|
|
SQLServer = SQL_Services_RevDotNet('GetMappedSQLServer', OITableName)
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', SQLServer, 2)
|
|
|
|
If Error_Services('NoError') AND (SQLSelectStatement NE '') then
|
|
SQLData = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLSelectStatement, True$)
|
|
If (SQLData NE '') AND (Error_Services('NoError')) then
|
|
OIRow = SQL_Services_RevDotNet('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.
|
|
// Table - SQL table whose row count is being requested.
|
|
//
|
|
// High level services that counts the number of rows in the designated table. This services calls other lower level
|
|
// services.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetRowCount(Server, TableName)
|
|
|
|
RowCount = ''
|
|
|
|
If (Server NE '') AND (TableName NE '') then
|
|
// Create a new or get an existing Connection Object.
|
|
objConnection = SQL_Services_RevDotNet('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_RevDotNet('ExecuteQuery', objConnection, SQLCountStatement, True$)
|
|
If Error_Services('HasError') then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
SQL_Services_RevDotNet('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, QueryStatement, AttemptsBeforeFailure)
|
|
|
|
If AttemptsBeforeFailure EQ '' then AttemptsBeforeFailure = 1
|
|
DataRows = ''
|
|
|
|
If ( (Server NE '') AND (QueryStatement NE '') ) then
|
|
ErrorMessage = ''
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', Server, 2)
|
|
If Error_Services('NoError') then
|
|
If Error_Services('NoError') then
|
|
DataRows = SQL_Services_RevDotNet('ExecuteQuery', objConnection, QueryStatement, True$, AttemptsBeforeFailure)
|
|
end
|
|
// Get any errors from the GetConnectionObject service or the ExecuteQuery service.
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
SQL_Services_RevDotNet('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, AttemptsBeforeFailure)
|
|
|
|
If AttemptsBeforeFailure EQ '' then AttemptsBeforeFailure = 1
|
|
|
|
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
|
|
//Define the dotNet version
|
|
DotNetHandle = StartDotNet("","4.0")
|
|
DotNetDir = CheckDotNet('4.0'):'\'
|
|
SqlClientDLLPath = DotNetDir:'System.Data.dll'
|
|
ConnectionString = SQL_Services_RevDotNet('GetConnectionString', Server)
|
|
//Specify the DLL
|
|
rv = Set_Property.NET(DotNetHandle, "AssemblyName", SqlClientDLLPath)
|
|
//Define the classes
|
|
Set_Status(0)
|
|
objConnection = Create_Class.NET(DotNetHandle, "System.Data.SqlClient.SqlConnection", 0, ConnectionString, 'System.String')
|
|
If Not(Get_Status(errCode)) then
|
|
Set_Status(0)
|
|
rv = Send_Message.Net(objConnection, "Open")
|
|
IF Not(Get_Status(errCode)) THEN
|
|
ConnectionState = Get_Property.Net(objConnection, "State")
|
|
If ConnectionState EQ 'Open' then
|
|
Set_Status(0)
|
|
objCommand = Send_Message.Net(objConnection, 'CreateCommand', '', '', 1)
|
|
If Not(Get_Status(errCode)) then
|
|
Set_Status(0)
|
|
objTransaction = Send_Message.Net(objConnection, 'BeginTransaction', 'Test', 'System.String', 1)
|
|
If Not(Get_Status(errCode)) then
|
|
Set_Status(0)
|
|
rv = Set_Property.NET(objCommand, 'Transaction', objTransaction)
|
|
If Get_Status(errCode) then
|
|
Error_Services('Add', 'Unable to set Transaction property of the SqlCommand object in the ' : Service : ' service: ' : errCode)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Unable to create the SQLTransaction object in the ' : Service : ' service: ' : errCode)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Unable to create the Command object in the ' : Service : ' service: ' : errCode)
|
|
end
|
|
end else
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
objConnection = ''
|
|
end
|
|
end else
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
objConnection = ''
|
|
end
|
|
end
|
|
Attempts += 1
|
|
Until (objConnection NE '') OR (Attempts GE AttemptsBeforeFailure)
|
|
Repeat
|
|
* If objConnection and Error_Services('NoError') then
|
|
* Memory_Services('SetValue', ServiceKeyID, objConnection)
|
|
* end else
|
|
* If Error_Services('NoError') then
|
|
* // If no error message has been set then create a generic one.
|
|
* Error_Services('Add', 'Unable to create the connection object to ' : Server : ' in the ' : Service : ' service: ' : Error)
|
|
* end
|
|
* end
|
|
end else
|
|
Error_Services('Add', 'Server argument was missing from the ' : Service : ' service.')
|
|
end
|
|
* end
|
|
|
|
If objConnection and Error_Services('NoError') then
|
|
ConnObjIndex = SRP_List('Add', ConnectionObjects@, objConnection)
|
|
SRP_List('SetAt', CommandObjects@, ConnObjIndex, objCommand)
|
|
SRP_List('SetAt', TransactionObjects@, ConnObjIndex, objTransaction)
|
|
end else
|
|
If Assigned(objConnection) then Free_Class.Net(objConnection)
|
|
If Assigned(objCommand) then Free_Class.Net(objCommand)
|
|
If Assigned(objTransaction) then Free_Class.Net(objTransaction)
|
|
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
|
|
ConnObjIndex = SRP_List('Locate', ConnectionObjects@, objConnection)
|
|
If ConnObjIndex GT 0 then
|
|
objCommand = SRP_List('GetAt', CommandObjects@, ConnObjIndex)
|
|
objTransaction = SRP_List('GetAt', TransactionObjects@, ConnObjIndex)
|
|
Error = ''
|
|
// Close the connection object, but don't worry about errors. It might have already been closed.
|
|
Set_Status(0)
|
|
rv = Send_Message.Net(objConnection, 'Close')
|
|
errCode = ''
|
|
If Not(Get_Status(errCode)) then
|
|
Free_Class.Net(objConnection)
|
|
Free_Class.Net(objCommand)
|
|
Free_Class.Net(objTransaction)
|
|
Destroyed = True$
|
|
end else
|
|
Error = 'Error in service ':Service:'. Failed to close SQL connection. Error code: ':errCode
|
|
end
|
|
If Destroyed then
|
|
SQL_Services_RevDotNet('ClearConnectionErrors', objConnection)
|
|
* Server = Memory_Services('GetValue', objConnection : '*Server')
|
|
* Memory_Services('SetValue', ServiceModule : '*GetConnectionObject*' : Server, '')
|
|
SRP_List('RemoveAt', ConnectionObjects@, ConnObjIndex)
|
|
SRP_List('RemoveAt', CommandObjects@, ConnObjIndex)
|
|
SRP_List('RemoveAt', TransactionObjects@, ConnObjIndex)
|
|
end else
|
|
SQL_Services_RevDotNet('AddConnectionErrors', objConnection, Error)
|
|
Error_Services('Add', 'Service : ' : Service : ', Error : ' : Error)
|
|
end
|
|
end
|
|
|
|
end else
|
|
Error_Services('Add', 'The objConnection argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = Destroyed
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// AddConnectionErrors
|
|
//
|
|
// objConnection - Connection Object (see GetConnectionObject service.)
|
|
// ErrorList - @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, ErrorList)
|
|
|
|
objConnection = objConnection[1, '*']
|
|
ServiceKeyID = ServiceModule : '*' : 'GetConnectionErrors' : '*' : objConnection
|
|
ConnectionErrors = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If (objConnection NE '') AND (ErrorList NE '') then
|
|
If ConnectionErrors NE '' then
|
|
ConnectionErrors := @FM : ErrorList
|
|
end else
|
|
ConnectionErrors = ErrorList
|
|
end
|
|
Memory_Services('SetValue', ServiceKeyID, ConnectionErrors)
|
|
end else
|
|
Error_Services('Add', 'The objConnection or ErrorList 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_RevDotNet('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
|
|
ConnectionString = Database_Services('ReadDataRow', 'SERVERS', Server)
|
|
If ConnectionString NE '' then
|
|
ConnectionString = Delete(ConnectionString, 2, 0, 0)
|
|
ProviderIdx = IndexC(ConnectionString, 'Provider', 1)
|
|
ConnectionString = ConnectionString[(ProviderIdx + 1), 999]
|
|
ProviderEndIdx = Index(ConnectionString, ';', 1)
|
|
ConnectionString = ConnectionString[(ProviderEndIdx + 1), 999]
|
|
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
|
|
Response = ConnectionString
|
|
end
|
|
|
|
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=BOOLEAN, AttemptsBeforeFailure)
|
|
|
|
If AttemptsBeforeFailure EQ '' then AttemptsBeforeFailure = 1
|
|
Results = False$ ; // Assume no results from this query for now.
|
|
If ReturnDataRows NE True$ then ReturnDataRows = False$
|
|
|
|
If (objConnection NE '') AND (QueryStatement NE '') then
|
|
Attempts = 0
|
|
ErrorMessage = ''
|
|
ConnObjIndex = SRP_List('Locate', ConnectionObjects@, objConnection)
|
|
If ConnObjIndex GT 0 then
|
|
Loop
|
|
objCommand = SRP_List('GetAt', CommandObjects@, ConnObjIndex)
|
|
If objCommand then
|
|
Set_Status(0)
|
|
rv = Set_Property.NET(objCommand, 'CommandText', QueryStatement)
|
|
If Not(Get_Status(errCode)) then
|
|
Set_Status(0)
|
|
Results = Send_Message.Net(objCommand, "ExecuteScalar")
|
|
If Not(Get_Status(errCode)) then
|
|
If ReturnDataRows EQ False$ then
|
|
Results = True$
|
|
end
|
|
end else
|
|
ErrorMessage = 'Failed to execute SQL command in the ' :Service : 'service.'
|
|
end
|
|
end
|
|
end
|
|
Attempts += 1
|
|
Until ( (ErrorMessage EQ '') OR (Attempts GE AttemptsBeforeFailure) )
|
|
Repeat
|
|
end else
|
|
Error_Services('Add', 'objCommand could not be found in the ' : Service : ' service.')
|
|
end
|
|
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, UseTransactionControl=BOOLEAN, OITableName, OIKeyID)
|
|
|
|
If UseTransactionControl NE True$ then UseTransactionControl = False$
|
|
|
|
AllAccepted = True$ ; // Assume all queries were accepted for now unless otherwise proven.
|
|
|
|
If (objConnection NE '') AND (QueryStatements NE '') then
|
|
ConnObjIndex = SRP_List('Locate', ConnectionObjects@, objConnection)
|
|
If ConnObjIndex GT 0 then
|
|
objCommand = SRP_List('GetAt', CommandObjects@, ConnObjIndex)
|
|
objTransaction = SRP_List('GetAt', TransactionObjects@, ConnObjIndex)
|
|
For Each QueryStatement in QueryStatements using @FM
|
|
If QueryStatement NE '' then
|
|
Set_Status(0)
|
|
rv = Set_Property.Net(objCommand, 'CommandText', QueryStatement)
|
|
If Not(Get_Status(errCode)) then
|
|
Set_Status(0)
|
|
rv = Send_Message.Net(objCommand, 'ExecuteNonQuery')
|
|
If Get_Status(errCode) then
|
|
Error_Services('Add', 'Error executing command ':Quote(QueryStatement):' in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
end
|
|
Until Error_Services('HasError')
|
|
Next QueryStatement
|
|
If UseTransactionControl EQ True$ then
|
|
// COMMIT or ROLLBACK the transaction.
|
|
If Error_Services('NoError') then
|
|
Set_Status(0)
|
|
rv = Send_Message.Net(objTransaction, 'Commit')
|
|
If Get_Status(errCode) then
|
|
AllAccepted = False$
|
|
Error_Services('Add', 'Error committing transaction in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
AllAccepted = False$
|
|
rv = Send_Message.Net(objTransaction, 'Rollback')
|
|
end
|
|
end
|
|
end
|
|
|
|
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.)
|
|
//
|
|
// Gets all of the data rows from the RecordSet Object. This returns an @RM array of data rows.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetAllQueryDataRows(objRecordSet)
|
|
|
|
DataRows = ''
|
|
|
|
If Len(objRecordSet) then
|
|
BOF = SRP_COM(objRecordSet, 'GET', 'BOF')
|
|
EOF = SRP_COM(objRecordSet, 'GET', 'EOF')
|
|
If (EOF EQ False$) then
|
|
DataRows = SRP_COM(objRecordSet, 'CALL', 'GetString', 2, -1, @FM, @RM)
|
|
If SRP_COM('', 'ERROR') then
|
|
Error = SRP_COM('', 'ERROR')
|
|
Error_Services('Add', 'ADO error in the ' : Service : ' service: ' : SRP_COM('', 'ERROR'))
|
|
end
|
|
If Error_Services('NoError') then
|
|
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
|
|
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 = ''
|
|
hServers = Database_Services('GetTableHandle', 'SERVERS')
|
|
If Error_Services('NoError') then
|
|
Select hServers
|
|
EOF = False$
|
|
Loop
|
|
Readnext ServerID else EOF = True$
|
|
Until EOF
|
|
Servers := ServerID : @FM
|
|
Repeat
|
|
Servers[-1, 1] = ''
|
|
Servers = SRP_Array('SortRows', Servers, 'AL1', 'LIST', @FM, @VM)
|
|
end
|
|
|
|
Response = Servers
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// SaveConnectionString
|
|
//
|
|
// ServerID - Key ID to a row in the SERVERS database table.
|
|
// ConnectionString - SQL server connection string
|
|
//
|
|
// If a row in the SERVERS table with the key ServerID exists, updates the connection string, otherwise a new row
|
|
// within the SERVERS database table containing ConnectionString.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service SaveConnectionString(ServerName, ConnectionString)
|
|
|
|
If ServerName NE '' then
|
|
ServerRec = Database_Services('ReadDataRow', 'SERVERS', ServerName)
|
|
ServerRec<SERVERS.CONNECTION_STRING$> = ConnectionString
|
|
Database_Services('WriteDataRow', 'SERVERS', ServerName, ServerRec, True$, False$, True$)
|
|
end else
|
|
ErrorMsg = 'Error saving connection. Null server name passed in to the ' : Service : ' service.'
|
|
Error_Services('Add', ErrorMsg)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// CreateNewConnectionString
|
|
//
|
|
// Utilizes the Windows Data Link Properties utility to create a new connection string.
|
|
// Returns a field mark delimited array containing a suggested server name (the data source) and the connection string
|
|
// generated by the Windows Data Link Properties utility.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service CreateNewConnectionString()
|
|
|
|
Response = ''
|
|
ServerName = ''
|
|
ConnectionString = ''
|
|
OleDBString = ''
|
|
Filename = 'temp.udl'
|
|
TempPath = Str(\00\, 1024)
|
|
GetTempPath(Len(TempPath), TempPath)
|
|
Convert \00\ to '' in TempPath
|
|
TempFilename = Str(\00\, 1024)
|
|
GetTempFileName(TempPath, \00\, 0, TempFilename)
|
|
OSWrite OleDBString to TempFilename
|
|
UDLFile = 'C:\Windows\syswow64\rundll32.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll",OpenDSLFile ' : TempFilename
|
|
Mode = '-1' ;* modal
|
|
rv = Utility('RUNWIN', UDLFile, Mode)
|
|
OSRead ConnectionString from TempFilename then
|
|
If ConnectionString NE '' then
|
|
Convert \FFFE\ to '' in ConnectionString
|
|
ConnectionString = Unicode_UTF8(ConnectionString)
|
|
DataSourcePos = Index(ConnectionString, 'Data Source', 1)
|
|
ServerPos = Index(ConnectionString, 'Server', 1)
|
|
Begin Case
|
|
Case DataSourcePos
|
|
ServerName = ConnectionString[(DataSourcePos + Len('Data Source') + 1), 'F;']
|
|
Case ServerPos
|
|
ServerName = ConnectionString[(ServerPos + Len('Server') + 1), 'F;']
|
|
End Case
|
|
end
|
|
end
|
|
Response = ServerName : @FM : ConnectionString
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// EditConnection
|
|
//
|
|
// ServerID - Key ID for the SERVERS database table.
|
|
//
|
|
// Utilizes the Windows Data Link Properties utility to edit the connection string found in the SERVERS record
|
|
// associated with the ServerID key.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service EditConnection(ServerID)
|
|
|
|
If ServerID NE '' then
|
|
ServerRec = Database_Services('ReadDataRow', 'SERVERS', ServerID)
|
|
If Error_Services('NoError') then
|
|
ConnectionString = ServerRec<SERVERS.CONNECTION_STRING$>
|
|
TempPath = Str(\00\, 1024)
|
|
GetTempPath(Len(TempPath), TempPath)
|
|
TempFilename = Str(\00\, 1024)
|
|
GetTempFileName(TempPath, \00\, 0, TempFilename)
|
|
If ConnectionString NE '' then
|
|
UnicodeString = \FFFE\ : Str_Unicode(ConnectionString)
|
|
OSWrite UnicodeString To TempFilename
|
|
end else
|
|
OSWrite '' to TempFileName
|
|
end
|
|
Program = 'C:\Windows\syswow64\rundll32.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll",OpenDSLFile ':TempFilename
|
|
Mode = '-1' ;* modal
|
|
rv = Utility("RUNWIN", Program, Mode)
|
|
NewFile = ''
|
|
OSRead NewConnectionString from TempFilename then
|
|
Convert \FFFE\ to '' in NewConnectionString
|
|
NewConnectionString = Unicode_UTF8(NewConnectionString)
|
|
ServerRec<SERVERS.CONNECTION_STRING$> = NewConnectionString
|
|
Database_Services('WriteDataRow', 'SERVERS', ServerID, ServerRec, True$, False$, True$)
|
|
end
|
|
end
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// DeleteConnection
|
|
//
|
|
// ServerID - Key ID for the SERVERS database table.
|
|
//
|
|
// Deletes the SERVERS record associated with the ServerID key.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service DeleteConnection(ServerID)
|
|
|
|
If ServerID NE '' then
|
|
Database_Services('DeleteDataRow', 'SERVERS', ServerID, True$)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// SetConnectionDesc
|
|
//
|
|
// ServerID - Key ID for the SERVERS database table.
|
|
// Description - Description of the server connection
|
|
//
|
|
// Sets the DESCRIPTION column of the SERVERS record associated with the ServerID key.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service SetConnectionDesc(ServerID, Description)
|
|
|
|
If ServerID NE '' then
|
|
ServerRec = Database_Services('ReadDataRow', 'SERVERS', ServerID)
|
|
ServerRec<SERVERS.DESCRIPTION$> = Description
|
|
Database_Services('WriteDataRow', 'SERVERS', ServerID, ServerRec)
|
|
end
|
|
|
|
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)
|
|
|
|
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<DICT_USER1$> = 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<FIELDS_NAME$>
|
|
For Each ColumnName in ColumnNames using @VM
|
|
SQLMap = SQL_Services_RevDotNet('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<DICT_USER1$>
|
|
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
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedSQLServer
|
|
//
|
|
// Returns the name of the SQL Server that the indicated OpenInsight table is mapped to.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetMappedSQLServer(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_RevDotNet('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', 'OITableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = SQLServer
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetDatabases
|
|
//
|
|
// objConnection - Connection Object (see GetConnectionObject service.) - [Optional, but Server is then Required]
|
|
// Server - Name of a defined server. - [Optional, but objConnection is then Required]
|
|
//
|
|
// Returns an @FM list of databases available through the indicated connection object. If the connection object is
|
|
// empty, then a new one will be created (and then subsequently destroyed) for the indicated server.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetDatabases(objConnection, Server)
|
|
|
|
Databases = ''
|
|
|
|
If (objConnection NE '') OR (Server NE '') then
|
|
If objConnection EQ '' then
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', Server, 3)
|
|
NewObject = True$
|
|
end else
|
|
NewObject = False$
|
|
end
|
|
|
|
If Error_Services('NoError') then
|
|
SQLQuery = "SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')"
|
|
Databases = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLQuery, True$)
|
|
If Databases EQ 0 then
|
|
Databases = ''
|
|
Error_Services('Add', 'Unknown error in the ' : Service : ' service for server ' : Server : '.')
|
|
end else
|
|
Convert @RM to @FM in Databases
|
|
end
|
|
end
|
|
|
|
If NewObject EQ True$ then
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objConnection and Server arguments were both missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = Databases
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetSchemas
|
|
//
|
|
// objConnection - Connection Object (see GetConnectionObject service.) - [Optional, but Server is then Required]
|
|
// Server - Name of a defined server. - [Optional, but objConnection is then Required]
|
|
// Database - Name of a specific database to use. If empty, then all databases will be used. - [Required]
|
|
//
|
|
// Returns an @FM list of schemas available for the indicated database. If the connection object is empty, then a new
|
|
// one will be created (and then subsequently destroyed) for the indicated server.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetSchemas(objConnection, Server, Database)
|
|
|
|
Schemas = ''
|
|
|
|
If Database NE '' then
|
|
If (objConnection NE '') OR (Server NE '') then
|
|
If objConnection EQ '' then
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', Server, 3)
|
|
NewObject = True$
|
|
end else
|
|
NewObject = False$
|
|
end
|
|
|
|
If Error_Services('NoError') then
|
|
SQLQuery = "SELECT DISTINCT TABLE_SCHEMA FROM [" : Database : "].INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"
|
|
Schemas = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLQuery, True$)
|
|
If Error_Services('NoError') then
|
|
Convert @RM to @FM in Schemas
|
|
end else
|
|
Message = Error_Services('GetMessage')
|
|
If IndexC(Message, 'not able to access the database', 1) AND IndexC(Message, 'under the current security context', 1) then
|
|
// Users does not have permission. Clear the error rather than report it.
|
|
Error_Services('Clear')
|
|
end
|
|
end
|
|
end
|
|
|
|
If NewObject EQ True$ then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objConnection and Server arguments were both missing in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Database argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = Schemas
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetTables
|
|
//
|
|
// objConnection - Connection Object (see GetConnectionObject service.) - [Optional, but Server is then Required]
|
|
// Server - Name of a defined server. - [Optional, but objConnection is then Required]
|
|
// Databases - @FM delimited list of databases to use. If empty, then all databases will be used.
|
|
// - [Optional]
|
|
// Schemas - @FM delimited list of schemas to use. If empty, then all schemas will be used. If Databases is
|
|
// empty, then Schemas will be ignored. - [Optional]
|
|
// ReturnFullObjects - Boolean flag to indicate if full object notation (e.g., Server.Database.Schema.Table) should
|
|
// be returned or just the tables. Default is False$ - [Optional]
|
|
// BracketObjects - Boolean flag to indicate if the objects being returned should be bracketed in case some of the
|
|
// object names are reserved words. Default is False$ - [Optional]
|
|
//
|
|
// Returns an @FM list of tables using full object name formatting (i.e., Database.Schema.Table) available for the
|
|
// indicated connection object (or server). If the connection object is empty, then a new one will be created (and then
|
|
// subsequently destroyed) for the indicated server.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetTables(objConnection, Server, Databases, Schemas, IncludeServerObject=BOOLEAN, IncludeDatabaseObject=BOOLEAN, IncludeSchemaObject=BOOLEAN, BracketObjects=BOOLEAN)
|
|
|
|
Tables = ''
|
|
|
|
If IncludeServerObject NE True$ then IncludeServerObject = False$
|
|
If IncludeDatabaseObject NE True$ then IncludeDatabaseObject = False$
|
|
If IncludeSchemaObject NE True$ then IncludeSchemaObject = False$
|
|
If BracketObjects NE True$ then BracketObjects = False$
|
|
If Databases EQ '' then Schemas = ''
|
|
|
|
If (objConnection NE '') OR (Server NE '') then
|
|
If objConnection EQ '' then
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', Server, 3)
|
|
NewObject = True$
|
|
end else
|
|
NewObject = False$
|
|
end
|
|
|
|
If Error_Services('NoError') then
|
|
If Databases EQ '' then Databases = SQL_Services_RevDotNet('GetDatabases', objConnection, Server)
|
|
If Error_Services('NoError') AND (Databases NE '') then
|
|
For Each Database in Databases using @FM
|
|
If Schemas EQ '' then Schemas = SQL_Services_RevDotNet('GetSchemas', objConnection, Server, Database)
|
|
If Error_Services('NoError') AND (Schemas NE '') then
|
|
For Each Schema in Schemas using @FM
|
|
SQLQuery = "SELECT TABLE_NAME FROM [" : Database : "].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='" : Schema : "'"
|
|
TableNames = SQL_Services_RevDotNet('ExecuteQuery', objConnection, SQLQuery, True$)
|
|
Convert @RM to @FM in TableNames
|
|
If Error_Services('NoError') AND (TableNames NE '') then
|
|
If (IncludeServerObject EQ True$) OR (IncludeDatabaseObject EQ True$) OR (IncludeSchemaObject EQ True$) then
|
|
For Each Table in TableNames using @FM
|
|
TableObject = Table
|
|
If IncludeSchemaObject EQ True$ then
|
|
TableObject = Schema : '.' : TableObject
|
|
If IncludeDatabaseObject EQ True$ then
|
|
TableObject = Database : '.' : TableObject
|
|
If IncludeServerObject EQ True$ then
|
|
TableObject = Server : '.' : TableObject
|
|
end
|
|
end
|
|
end
|
|
Tables := TableObject : @FM
|
|
Next Table
|
|
end else
|
|
Tables := TableNames : @FM
|
|
end
|
|
end
|
|
Next Schema
|
|
Schemas = ''
|
|
end
|
|
Next Database
|
|
end
|
|
Tables[-1, 1] = ''
|
|
If (Tables NE '') AND (BracketObjects EQ True$) then
|
|
Swap '.' with '].[' in Tables
|
|
Swap @FM with ']' : @FM : '[' in Tables
|
|
Tables = '[' : Tables : ']'
|
|
Tables = SRP_Array('SortRows', Tables, 'AL1', 'LIST', @FM, @VM)
|
|
end
|
|
end
|
|
|
|
If NewObject EQ True$ then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objConnection and Server arguments were both missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = Tables
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetTableColumns
|
|
//
|
|
// objConnection - Connection Object (see GetConnectionObject service.) - [Optional, but Server is then Required]
|
|
// Server - Name of a defined server. - [Optional, but objConnection is then Required]
|
|
// Database - Database object for the table. - [Optional]
|
|
// Schema - Schema object for the table. - [Optional]
|
|
// Table - Database Table whose column data is being requested. The Table argument might have the Server,
|
|
// Database, and/or Schema objects embedded. If so, then these will override any values specified
|
|
// in the Server, Database, or Schema arguments. - [Required]
|
|
//
|
|
// Returns an @FM/@VM array of database column information.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetTableColumns(objConnection, Server, Database, Schema, Table)
|
|
|
|
TableColumns = ''
|
|
|
|
If Table NE '' then
|
|
Convert '[]' to '' in Table ; // Remove any brackets so the query won't fail.
|
|
If Index(Table, '.', 1) then
|
|
// Table came formatted with other objects. Parse these out.
|
|
NumObjects = DCount(Table, '.')
|
|
Begin Case
|
|
Case NumObjects EQ 4
|
|
Server = Table[1, '.']
|
|
Database = Table[Col2() + 1, '.']
|
|
Schema = Table[Col2() + 1, '.']
|
|
Table = Table[Col2() + 1, '.']
|
|
Case NumObjects EQ 3
|
|
Database = Table[1, '.']
|
|
Schema = Table[Col2() + 1, '.']
|
|
Table = Table[Col2() + 1, '.']
|
|
Case NumObjects EQ 2
|
|
Schema = Table[1, '.']
|
|
Table = Table[Col2() + 1, '.']
|
|
End Case
|
|
end
|
|
|
|
If (objConnection NE '') OR (Server NE '') then
|
|
If objConnection EQ '' then
|
|
objConnection = SQL_Services_RevDotNet('GetConnectionObject', Server, 3)
|
|
NewObject = True$
|
|
end else
|
|
NewObject = False$
|
|
end
|
|
|
|
If Error_Services('NoError') then
|
|
ErrorMessage = ''
|
|
|
|
If Database NE '' then
|
|
SQL_Services_RevDotNet('ExecuteQuery', objConnection, "USE " : Database, False$)
|
|
end
|
|
If Error_Services('NoError') then
|
|
QueryStatement = ""
|
|
QueryStatement := "SELECT "
|
|
QueryStatement := " c.name 'Column Name', "
|
|
QueryStatement := " t.Name 'Data type', "
|
|
QueryStatement := " c.max_length 'Max Length', "
|
|
QueryStatement := " c.is_nullable, "
|
|
QueryStatement := " ISNULL(i.is_primary_key, 0) 'Primary Key' "
|
|
QueryStatement := "FROM "
|
|
QueryStatement := " sys.columns c "
|
|
QueryStatement := "INNER JOIN "
|
|
QueryStatement := " sys.types t ON c.user_type_id = t.user_type_id "
|
|
QueryStatement := "LEFT OUTER JOIN "
|
|
QueryStatement := " sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id "
|
|
QueryStatement := "LEFT OUTER JOIN "
|
|
QueryStatement := " sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id "
|
|
QueryStatement := "WHERE"
|
|
QueryStatement := " c.object_id = OBJECT_ID('"
|
|
If Database NE '' then QueryStatement := "[" : Database : "]."
|
|
If Schema NE '' then QueryStatement := "[" : Schema : "]."
|
|
QueryStatement := "[" : Table : "]')"
|
|
|
|
TableColumns = SQL_Services_RevDotNet('ExecuteQuery', objConnection, QueryStatement, True$)
|
|
If Error_Services('NoError') then
|
|
Convert @FM to @VM in TableColumns
|
|
Convert @RM to @FM in TableColumns
|
|
TableColumns = SRP_Array('SortRows', TableColumns, 'DR5' : @FM : 'AL1', 'LIST', @FM, @VM)
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
end
|
|
end
|
|
|
|
If NewObject EQ True$ then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
SQL_Services_RevDotNet('DestroyConnectionObject', objConnection)
|
|
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The Server or Table argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Table argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = TableColumns
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetPrimarySQLTable
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the primary SQL table. - [Required]
|
|
//
|
|
// 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_RevDotNet('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
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to secondary SQL tables. - [Required]
|
|
//
|
|
// 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_RevDotNet('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
|
|
//
|
|
// OITableName - The name of the OpenInsight table that columns mapped to a SQL table with static values. - [Required]
|
|
//
|
|
// 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)
|
|
|
|
If StaticSQLColumnNames EQ '' then
|
|
If (OITableName NE '') then
|
|
// Add all OpenInsight columns defined in the SQL Join Clause.
|
|
OITableToSQLMap = SQL_Services_RevDotNet('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 : ']')
|
|
StaticSQLColumnNames := SRP_JSON(objStaticColumn, 'GETVALUE', 'SQLColumnName') : @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
|
|
//
|
|
// OITableName - The name of the OpenInsight table that columns mapped to a SQL table with static values. - [Required]
|
|
//
|
|
// 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_RevDotNet('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 : ']')
|
|
StaticValue = SRP_JSON(objStaticColumn, 'GETVALUE', 'StaticValue')
|
|
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
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
//
|
|
// 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
|
|
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName
|
|
AMVMaster = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If AMVMaster EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
OITableToSQLMap = SQL_Services_RevDotNet('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.
|
|
TableArray = SRP_JSON(MapObj, 'Get', 'SecondarySQLTables')
|
|
TableObjs = SRP_JSON(TableArray, 'GetElements')
|
|
TableFound = False$
|
|
For Each TableObj in TableObjs using @FM
|
|
SecondarySQLTableName = SRP_JSON(TableObj, 'GETVALUE', 'Name', '')
|
|
If SQLTableName _EQC SecondarySQLTableName then
|
|
JoinClassArray = SRP_JSON(TableObj, 'Get', 'JoinClause')
|
|
JoinClassObjs = SRP_JSON(JoinClassArray, 'GetElements')
|
|
For Each JoinClassObj in JoinClassObjs using @FM
|
|
If SRP_JSON(JoinClassObj, 'GetValue', 'AMVMaster') EQ True$ then
|
|
AMVMaster = SRP_JSON(JoinClassObj, 'GetValue', 'OIColumnName')
|
|
end
|
|
SRP_JSON(JoinClassObj, 'Release')
|
|
Until AMVMaster NE ''
|
|
Next JoinClassObj
|
|
TableFound = True$
|
|
SRP_JSON(JoinClassArray, 'Release')
|
|
end
|
|
SRP_JSON(TableObj, 'Release')
|
|
Until TableFound
|
|
Next TableObj
|
|
SRP_JSON(TableArray, 'Release')
|
|
end
|
|
SRP_JSON(MapObj, 'Release')
|
|
end
|
|
|
|
If AMVMaster NE '' then
|
|
Memory_Services('SetValue', ServiceKeyID, AMVMaster)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = AMVMaster
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedJoinedOIColumnNames
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// ValuesReturned - A return varabiable that will contain the type of values each associated column should return.
|
|
// See below for more information. - [Optional]
|
|
//
|
|
// Returns an @FM list of column names from the indicated OpenInsight table that are used to join with the indicated
|
|
// SQL table. This service will also populate the ValuesReturned variable with the intended value to be returned by the
|
|
// associated column (.e.g, Column Data or Index Position).
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetMappedJoinedOIColumnNames(OITableName, SQLTableName, Ref ValuesReturned)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName
|
|
ColumnNames = Memory_Services('GetValue', ServiceKeyID)
|
|
ValuesReturned = Memory_Services('GetValue', ServiceKeyID : '*ValuesReturned')
|
|
|
|
If ColumnNames EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
OITableToSQLMap = SQL_Services_RevDotNet('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', '')
|
|
ValueReturned = SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'ValueReturned', '')
|
|
ColumnNames := OIColumnName : @FM
|
|
ValuesReturned := ValueReturned : @FM
|
|
Next ColumnNo
|
|
ColumnNames[-1, 1] = ''
|
|
ValuesReturned[-1, 1] = ''
|
|
SRP_JSON(JoinArray, 'RELEASE')
|
|
end
|
|
|
|
If ColumnNames NE '' then
|
|
Memory_Services('SetValue', ServiceKeyID, ColumnNames)
|
|
Memory_Services('SetValue', ServiceKeyID : '*ValuesReturned', ValuesReturned)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = ColumnNames
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedJoinedSQLColumnNames
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
//
|
|
// Returns an @FM list of column names from the indicated SQL table that are used to join with the indicated OpenInsight
|
|
// table.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetMappedJoinedSQLColumnNames(OITableName, SQLTableName)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName
|
|
ColumnNames = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If ColumnNames EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
OITableToSQLMap = SQL_Services_RevDotNet('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
|
|
SQLColumnName = SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'SQLColumnName', '')
|
|
ColumnNames := SQLColumnName : @FM
|
|
Next ColumnNo
|
|
ColumnNames[-1, 1] = ''
|
|
SRP_JSON(JoinArray, 'RELEASE')
|
|
end
|
|
|
|
If ColumnNames NE '' then
|
|
Memory_Services('SetValue', ServiceKeyID, ColumnNames)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = ColumnNames
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedJoinedOperators
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
//
|
|
// Returns an @FM list of operators from the indicated SQL table that are used to join with the indicated OpenInsight
|
|
// table.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetMappedJoinedOperators(OITableName, SQLTableName)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName
|
|
Operators = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If Operators EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
OITableToSQLMap = SQL_Services_RevDotNet('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
|
|
Operator = SRP_JSON(JoinArray, 'GETVALUE', '[' : ColumnNo : ']' : 'Operator', '')
|
|
Operators := Operator : @FM
|
|
Next ColumnNo
|
|
Operators[-1, 1] = ''
|
|
SRP_JSON(JoinArray, 'RELEASE')
|
|
end
|
|
|
|
If Operators NE '' then
|
|
Memory_Services('SetValue', ServiceKeyID, Operators)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = Operators
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedJoinedSQLColumnValues
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table to. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being written to SQL. - [Required]
|
|
// OIRow - The OpenInsight row being written to SQL. - [Optional]
|
|
// AMVPosition - The position within the multivalue column that should be used in the join clause if the OpenInsight
|
|
// column is supposed to use its Index Position. - [Optional]
|
|
//
|
|
// Returns an @FM delimited list of SQL column values for the indicated table that are derived from the indicated
|
|
// OpenInsight table and associated joined columns. This service is normally called to create a fully formed Insert
|
|
// query statement. Note: OIRow will likely be an empty string since most join clauses will be based on the OpenInsight
|
|
// Key ID.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetMappedJoinedSQLColumnValues(OITableName, SQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
If Num(AMVPosition) else AMVPosition = ''
|
|
|
|
ColumnValues = ''
|
|
|
|
If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') then
|
|
FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%')
|
|
OIColumnNames = SQL_Services_RevDotNet('GetMappedJoinedOIColumnNames', OITableName, SQLTableName, ValuesReturned)
|
|
If Error_Services('NoError') then
|
|
If OIColumnNames NE '' then
|
|
For Each OIColumnName in OIColumnNames using @FM setting fPos
|
|
ValueReturned = ValuesReturned<fPos>
|
|
If ValueReturned EQ '' then ValueReturned = 'Column Data'
|
|
Locate OIColumnName in FieldArray<FIELDS_NAME$> using @VM setting vPos then
|
|
OIColumnToSQLMap = SQL_Services_RevDotNet('GetOIColumnToSQLMap', OITableName, OIColumnName)
|
|
If Error_Services('NoError') then
|
|
If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then
|
|
SQLColumnType = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnType')
|
|
OIColumnType = FieldArray<FIELDS_TYPE$, vPos>
|
|
IsOIKey = False$ ; // Assume false for now.
|
|
If ValueReturned EQ 'Column Data' then
|
|
If OIColumnType EQ 'F' then
|
|
OIColumnPos = FieldArray<FIELDS_FIELD_NO$, vPos>
|
|
If OIColumnPos GT 0 then
|
|
OIColumnValue = OIRow<OIColumnPos>
|
|
end else
|
|
IsOIKey = True$
|
|
OIKeyPart = FieldArray<FIELDS_PART$, vPos>
|
|
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 '') AND (IsOIKey NE True$) then
|
|
OIColumnValue = OIColumnValue<0, AMVPosition>
|
|
end
|
|
end else
|
|
If AMVPosition EQ '' then AMVPosition = 1
|
|
OIColumnValue = AMVPosition
|
|
end
|
|
If ValueReturned EQ 'Column Data' then
|
|
// Make applicable data conversions.
|
|
Begin Case
|
|
Case OIColumnValue EQ ''
|
|
// Empty strings are treated as NULL values.
|
|
OIColumnValue = 'NULL'
|
|
Case InList('varchar,nvarchar,char,nchar', SQLColumnType, ',')
|
|
// Single quote the value.
|
|
SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength')
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
If (SQLColumnLength EQ '') OR (SQLColumnLength EQ '-1') then SQLColumnLength = Len(OIColumnValue)
|
|
OIColumnValue = OIColumnValue[1, SQLColumnLength, 1]
|
|
Swap "'" with "''" in OIColumnValue
|
|
OIColumnValue = "'" : OIColumnValue : "'"
|
|
Case InList('tinyint,smallint,bigint,int', SQLColumnType, ',')
|
|
// Treat as an integer.
|
|
OIColumnConv = 'MD0'
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
Case InList('decimal,numeric,float,real', SQLColumnType, ',')
|
|
// Treat as a floating point number using any OI column output conversion if it
|
|
// exists.
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
Convert 'Z' to '' in OIColumnConv ; // No empty strings with numeric columns.
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
Case SQLColumnType _EQC 'bit'
|
|
// Treat as a Boolean, but only return a 1, 0, or NULL.
|
|
If OIColumnValue EQ '' then
|
|
OIColumnValue = 'NULL'
|
|
end else
|
|
If OIColumnValue NE False$ then OIColumnValue = True$
|
|
end
|
|
Case SQLColumnType _EQC 'date'
|
|
OIColumnValue = "'" : (SRP_Date('Format', OIColumnValue, 'YYYY-MM-DD')) : "'"
|
|
Case SQLColumnType _EQC 'datetime'
|
|
OIColumnValue = "'" : (SRP_DateTime('Format', OIColumnValue, 'YYYY-MM-DD hh:mm:ss')) : "'"
|
|
Case SQLColumnType _EQC 'time'
|
|
OIColumnValue = "'" : (SRP_Time('Format', OIColumnValue, 'hh:mm:ss')) : "'"
|
|
Case Otherwise$
|
|
// Treat as a character type.
|
|
SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength')
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
If (SQLColumnLength EQ '') OR (SQLColumnLength EQ '-1') then SQLColumnLength = Len(OIColumnValue)
|
|
OIColumnValue = OIColumnValue[1, SQLColumnLength, 1]
|
|
Swap "'" with "''" in OIColumnValue
|
|
OIColumnValue = "'" : OIColumnValue : "'"
|
|
End Case
|
|
end
|
|
// 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
|
|
ColumnValues := OIColumnValue : @FM
|
|
|
|
SRP_JSON(MapObj, 'RELEASE')
|
|
end
|
|
end
|
|
end
|
|
While Error_Services('NoError')
|
|
Next OIColumnName
|
|
end
|
|
ColumnValues[-1, 1] = ''
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName, SQLTableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = ColumnValues
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetJoinClause
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being written to SQL. - [Required]
|
|
// OIRow - The OpenInsight row being written to SQL. - [Optional]
|
|
// AMVPosition - The position within the multivalue column that should be used in the join clause if the
|
|
// OpenInsight column is supposed to use its Index Position. - [Optional]
|
|
// IgnoreAMVMaster - Boolean falg to indicate if the joined column associated with the OpenInsight AMV Master should
|
|
// be ignored. This is necessary for Join Clauses used for Select and Delete statements. - [Optional]
|
|
//
|
|
// 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, AMVPosition, IgnoreAMVMaster=BOOLEAN)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
JoinClause = ''
|
|
|
|
If IgnoreAMVMaster NE True$ then IgnoreAMVMaster = False$
|
|
|
|
If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') then
|
|
JoinedSQLColumns = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, SQLTableName)
|
|
If JoinedSQLColumns NE '' then
|
|
JoinedOperators = SQL_Services_RevDotNet('GetMappedJoinedOperators', OITableName, SQLTableName)
|
|
JoinedSQLValues = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnValues', OITableName, SQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
If IgnoreAMVMaster EQ True$ then
|
|
// Get all of the OpenInsight columns associated with this join and the AMV Master. Remove the SQL column,
|
|
// operator, and value associated with the AMV Master.
|
|
AMVMaster = SQL_Services_RevDotNet('GetAMVMaster', OITableName, SQLTableName)
|
|
If AMVMaster NE '' then
|
|
JoinedOIColumns = SQL_Services_RevDotNet('GetMappedJoinedOIColumnNames', OITableName, SQLTableName)
|
|
Locate AMVMaster in JoinedOIColumns using @FM setting Pos then
|
|
JoinedSQLColumns = Delete(JoinedSQLColumns, Pos, 0, 0)
|
|
JoinedOperators = Delete(JoinedOperators, Pos, 0, 0)
|
|
JoinedSQLValues = Delete(JoinedSQLValues, Pos, 0, 0)
|
|
end
|
|
end
|
|
end
|
|
For Each JoinedColumn in JoinedSQLColumns using @FM setting Pos
|
|
JoinClause := JoinedColumn : ' '
|
|
JoinClause := JoinedOperators<Pos> : ' '
|
|
JoinClause := JoinedSQLValues<Pos>
|
|
JoinClause := @FM
|
|
Next JoinedColumn
|
|
JoinClause[-1, 1] = ''
|
|
Swap @FM with ' AND ' in JoinClause
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName, SQLTableName, OIKeyID argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = JoinClause
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedOIColumnNames
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// ExcludeJoinedColumns - Boolean flag indicating if the columns used for the join should be excluded from the
|
|
// list of columns returned. This would be done if the columns are used to insert or update
|
|
// the SQL table. Default is true. - [Optional]
|
|
//
|
|
// 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, ExcludeJoinedColumns=BOOLEAN)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
If ExcludeJoinedColumns NE False$ then ExcludeJoinedColumns = True$
|
|
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName : '*' : ExcludeJoinedColumns
|
|
ColumnNames = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If ColumnNames EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
// 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
|
|
// GetMappedJoinedOIColumnNames service. These will be skipped.
|
|
AllOIColumnToSQLMaps = SQL_Services_RevDotNet('GetAllOIColumnToSQLMaps', OITableName)
|
|
For Each OIColumnToSQLMapList in AllOIColumnToSQLMaps using @FM setting fPos
|
|
(OIColumnName, OIColumnToSQLMap) using @VM = OIColumnToSQLMapList
|
|
If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then
|
|
MappedSQLTableName = SRP_JSON(MapObj, 'GETVALUE', 'SQLTableName')
|
|
MappedSQLColumnName = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnName')
|
|
If (MappedSQLTableName NE '') AND (MappedSQLColumnName NE '') AND (SQLTableName EQ MappedSQLTableName) then
|
|
Locate OIColumnName in ColumnNames using @FM setting fPos else
|
|
ColumnNames := OIColumnName : @FM
|
|
end
|
|
end
|
|
SRP_JSON(MapObj, 'Release')
|
|
end
|
|
Next OIColumnToSQLMap
|
|
|
|
If ExcludeJoinedColumns EQ True$ then
|
|
// Get all OpenInsight columns defined in the SQL Join Clause. Then remove any that are rely upon Column
|
|
// Data mapping rather than Index Position. This will avoid duplicate columns being used in a SQL statement.
|
|
JoinedValuesReturned = ''
|
|
JoinedOIColumns = SQL_Services_RevDotNet('GetMappedJoinedOIColumnNames', OITableName, SQLTableName, JoinedValuesReturned)
|
|
If JoinedOIColumns NE '' then
|
|
For Each JoinedColumnName in JoinedOIColumns using @FM Setting JoinedPos
|
|
Locate JoinedColumnName in ColumnNames using @FM setting Pos then
|
|
If JoinedValuesReturned<JoinedPos> EQ 'Column Data' then
|
|
ColumnNames = Delete(ColumnNames, Pos, 0, 0)
|
|
end
|
|
end
|
|
Next JoinedColumnName
|
|
end
|
|
end
|
|
|
|
ColumnNames[-1, 1] = ''
|
|
If ColumnNames NE '' then
|
|
Memory_Services('SetValue', ServiceKeyID, ColumnNames)
|
|
end
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = ColumnNames
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedOIColumnValues
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// SQLRow - The SQL row that will be mapped to the OpenInsight row. - [Required]
|
|
// OIRow - The OpenInsight row with pre-existing data. See below for more information. - [Optional]
|
|
//
|
|
// 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
|
|
|
|
If (OITableName NE '') AND (SQLTableName NE '') AND (SQLData NE '') then
|
|
MappedOIColumnNames = SQL_Services_RevDotNet('GetMappedOIColumnNames', OITableName, SQLTableName, False$)
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, SQLTableName, '', False$)
|
|
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<fPos>
|
|
Locate OIColumnName in FieldArray<FIELDS_NAME$> using @VM setting vPos then
|
|
OIColumnType = FieldArray<FIELDS_TYPE$, vPos>
|
|
OIColumnPos = FieldArray<FIELDS_FIELD_NO$, vPos>
|
|
If OIColumnType EQ 'F' AND OIColumnPos NE 0 then
|
|
OIColumnToSQLMap = SQL_Services_RevDotNet('GetOIColumnToSQLMap', OITableName, OIColumnName)
|
|
If Error_Services('NoError') then
|
|
If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then
|
|
SQLColumnType = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnType')
|
|
OIColumnValue = SQLRow<fPos>
|
|
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 InList('varchar,nvarchar,char,nchar', SQLColumnType, ',')
|
|
// Single quote the value.
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Iconv(OIColumnValue, OIColumnConv)
|
|
end
|
|
Case InList('tinyint,smallint,bigint,int', SQLColumnType, ',')
|
|
// Treat as an integer.
|
|
OIColumnConv = 'MD0'
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Iconv(OIColumnValue, OIColumnConv)
|
|
end
|
|
Case InList('decimal,numeric,float,real', SQLColumnType, ',')
|
|
// Treat as a floating point number using any OI column output conversion if it
|
|
// exists.
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Iconv(OIColumnValue, OIColumnConv)
|
|
end
|
|
Case SQLColumnType _EQC 'date'
|
|
OIColumnValue = SRP_Date('Parse', OIColumnValue, 'MM/DD/YYYY')
|
|
Case SQLColumnType _EQC 'datetime'
|
|
OIColumnValue = SRP_DateTime('Parse', OIColumnValue, 'MM/DD/YYYY hh:mm:ss')
|
|
Case SQLColumnType _EQC 'time'
|
|
OIColumnValue = SRP_Time('Parse', OIColumnValue, 'hh:mm:ss')
|
|
Case Otherwise$
|
|
// Treat as a character type.
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Iconv(OIColumnValue, OIColumnConv)
|
|
end
|
|
End Case
|
|
OIRow<OIColumnPos, ValuePos> = 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
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedSQLColumnNames
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// OIColumns - An @FM delimited list of OpenInsight table columns that should only be used to write to
|
|
// SQL. If empty, all columns that have a map defintion will be used. - [Optional]
|
|
// ExcludeJoinedColumns - Boolean flag indicating if the columns used for the join should be excluded from the
|
|
// list of columns returned. This would be done if the columns are used to insert or update
|
|
// the SQL table. Default is true. - [Optional]
|
|
//
|
|
// 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, ExcludeJoinedColumns)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
If ExcludeJoinedColumns NE False$ then ExcludeJoinedColumns = True$
|
|
ServiceKeyID := '*' : OITableName : '*' : SQLTableName : '*' : ExcludeJoinedColumns
|
|
ColumnNames = Memory_Services('GetValue', ServiceKeyID)
|
|
|
|
If ColumnNames EQ '' then
|
|
If (OITableName NE '') AND (SQLTableName NE '') then
|
|
If OIColumns NE '' then
|
|
Transfer OIColumns to OIColumnNames
|
|
end else
|
|
// The GetMappedOIColumnNames service will automatically remove any columns that are also mapped in
|
|
// a join clause with the "Column Data" return value attribute.
|
|
OIColumnNames = SQL_Services_RevDotNet('GetMappedOIColumnNames', OITableName, SQLTableName, ExcludeJoinedColumns)
|
|
end
|
|
If OIColumnNames NE '' then
|
|
For Each OIColumnName in OIColumnNames using @FM setting fPos
|
|
OIColumnToSQLMap = SQL_Services_RevDotNet('GetOIColumnToSQLMap', OITableName, OIColumnName)
|
|
If Error_Services('NoError') then
|
|
If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then
|
|
SQLColumnName = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnName')
|
|
If SQLColumnName NE '' then
|
|
ColumnNames := SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnName') : @FM
|
|
end
|
|
SRP_JSON(MapObj, 'RELEASE')
|
|
end
|
|
end
|
|
Next OIColumnName
|
|
end
|
|
ColumnNames[-1, 1] = ''
|
|
If ColumnNames NE '' then Memory_Services('SetValue', ServiceKeyID, ColumnNames)
|
|
end else
|
|
Error_Services('Add', 'The OITableName or SQLTableName argument was missing in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = ColumnNames
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetMappedSQLColumnValues
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table to. - [Required]
|
|
// SQLTableName - The name of the SQL table that the Openinsight table is mapped to. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being written to SQL. - [Required]
|
|
// OIRow - The OpenInsight row being written to SQL. - [Required]
|
|
// AMVPosition - The position within the multivalue column that should be used in the join clause if the OpenInsight
|
|
// column is supposed to use its Index Position. - [Optional]
|
|
// OIColumns - An @FM delimited list of OpenInsight table columns that should only be used to write to SQL. If empty,
|
|
// all columns that have a map defintion will be used. - [Optional]
|
|
//
|
|
// 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
|
|
|
|
If Num(AMVPosition) else AMVPosition = ''
|
|
|
|
ColumnValues = ''
|
|
|
|
If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') AND (OIRow NE '') then
|
|
FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%')
|
|
If OIColumns NE '' then
|
|
Transfer OIColumns to OIColumnNames
|
|
end else
|
|
// The GetMappedOIColumnNames service will automatically remove any columns that are also mapped in
|
|
// a join clause with the "Column Data" return value attribute.
|
|
OIColumnNames = SQL_Services_RevDotNet('GetMappedOIColumnNames', OITableName, SQLTableName, True$)
|
|
end
|
|
If OIColumnNames NE '' then
|
|
For Each OIColumnName in OIColumnNames using @FM setting fPos
|
|
Locate OIColumnName in FieldArray<FIELDS_NAME$> using @VM setting vPos then
|
|
OIColumnToSQLMap = SQL_Services_RevDotNet('GetOIColumnToSQLMap', OITableName, OIColumnName)
|
|
If Error_Services('NoError') then
|
|
If SRP_JSON(MapObj, 'PARSE', OIColumnToSQLMap) EQ '' then
|
|
SQLColumnType = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnType')
|
|
OIColumnType = FieldArray<FIELDS_TYPE$, vPos>
|
|
IsOIKey = False$ ; // Assume false for now.
|
|
If OIColumnType EQ 'F' then
|
|
OIColumnPos = FieldArray<FIELDS_FIELD_NO$, vPos>
|
|
If OIColumnPos GT 0 then
|
|
OIColumnValue = OIRow<OIColumnPos>
|
|
end else
|
|
IsOIKey = True$
|
|
OIKeyPart = FieldArray<FIELDS_PART$, vPos>
|
|
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 '') AND (IsOIKey NE True$) then
|
|
OIColumnValue = OIColumnValue<0, AMVPosition>
|
|
end
|
|
Begin Case
|
|
Case SQLColumnType _EQC 'uniqueidentifier'
|
|
OIColumnValue = 'NEWID()'
|
|
Case OIColumnValue EQ ''
|
|
// Empty strings are treated as NULL values.
|
|
OIColumnValue = 'NULL'
|
|
Case InList('varchar,nvarchar,char,nchar', SQLColumnType, ',')
|
|
// Single quote the value.
|
|
SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength')
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
If (SQLColumnLength EQ '') OR (SQLColumnLength EQ '-1') then SQLColumnLength = Len(OIColumnValue)
|
|
OIColumnValue = OIColumnValue[1, SQLColumnLength, 1]
|
|
Swap "'" with "''" in OIColumnValue
|
|
OIColumnValue = "'" : OIColumnValue : "'"
|
|
Case InList('tinyint,smallint,bigint,int', SQLColumnType, ',')
|
|
// Treat as an integer.
|
|
OIColumnConv = 'MD0'
|
|
If Len(OIColumnConv) then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
If Not(Num(OIColumnValue)) then
|
|
// Not a true number so format like a string.
|
|
OIColumnValue = "'" : OIColumnValue : "'"
|
|
end
|
|
end else
|
|
// Empty value so treat it as a NULL value.
|
|
OIColumnValue = 'NULL'
|
|
end
|
|
Case InList('decimal,numeric,float,real', SQLColumnType, ',')
|
|
// Treat as a floating point number using any OI column output conversion if it
|
|
// exists.
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
Convert 'Z' to '' in OIColumnConv ; // No empty strings with numeric columns.
|
|
If Len(OIColumnConv) then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
If Not(Num(OIColumnValue)) then
|
|
// Not a true number so format like a string.
|
|
OIColumnValue = "'" : OIColumnValue : "'"
|
|
end
|
|
end else
|
|
// Empty value so treat it as a NULL value.
|
|
OIColumnValue = 'NULL'
|
|
end
|
|
Case SQLColumnType _EQC 'bit'
|
|
// Treat as a Boolean, but only return a 1, 0, or NULL.
|
|
If OIColumnValue EQ '' then
|
|
OIColumnValue = 'NULL'
|
|
end else
|
|
If OIColumnValue NE False$ then OIColumnValue = True$
|
|
end
|
|
Case SQLColumnType _EQC 'date'
|
|
OIColumnValue = "'" : (SRP_Date('Format', OIColumnValue, 'YYYY-MM-DD')) : "'"
|
|
Case SQLColumnType _EQC 'datetime'
|
|
OIColumnValue = "'" : (SRP_DateTime('Format', OIColumnValue, 'YYYY-MM-DD hh:mm:ss')) : "'"
|
|
Case SQLColumnType _EQC 'time'
|
|
OIColumnValue = "'" : (SRP_Time('Format', OIColumnValue, 'hh:mm:ss')) : "'"
|
|
Case Otherwise$
|
|
// Treat as a character type.
|
|
SQLColumnLength = SRP_JSON(MapObj, 'GETVALUE', 'SQLColumnLength')
|
|
OIColumnConv = FieldArray<FIELDS_CONV$, vPos>
|
|
If OIColumnConv NE '' then
|
|
OIColumnValue = Fmt(OIColumnValue, OIColumnConv)
|
|
end
|
|
If (SQLColumnLength EQ '') OR (SQLColumnLength EQ '-1') then SQLColumnLength = Len(OIColumnValue)
|
|
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
|
|
ColumnValues := OIColumnValue : @FM
|
|
|
|
SRP_JSON(MapObj, 'RELEASE')
|
|
end
|
|
Error_Services('Clear') ; // Any errors at this point would have been created during calculated column logic, which is unrelated to this service.
|
|
end
|
|
end
|
|
While Error_Services('NoError')
|
|
Next OIColumnName
|
|
end
|
|
ColumnValues[-1, 1] = ''
|
|
end else
|
|
Error_Services('Add', 'The OITableName, SQLTableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = ColumnValues
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetSQLInsertStatements
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being deleted from SQL. - [Required]
|
|
// OIRow - The OpenInsight row associated with the OpenInsight Key ID. - [Optional]
|
|
// OIColumns - An @FM delimited list of OpenInsight table columns that should only be used to write to SQL. If empty,
|
|
// all columns that have a map defintion will be used. - [Optional]
|
|
//
|
|
// 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_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, PrimarySQLTableName, OIColumns)
|
|
If MappedSQLColumnNames NE '' then MappedSQLColumnNames := @FM
|
|
MappedSQLColumnValues = SQL_Services_RevDotNet('GetMappedSQLColumnValues', OITablename, PrimarySQLTableName, OIKeyID, OIRow, '', OIColumns)
|
|
If MappedSQLColumnValues NE '' then MappedSQLColumnValues := @FM
|
|
JoinedSQLColumnNames = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, PrimarySQLTableName)
|
|
If JoinedSQLColumnNames NE '' then
|
|
MappedSQLColumnNames := JoinedSQLColumnNames : @FM
|
|
JoinedSQLColumnValues = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnValues', OITableName, PrimarySQLTableName, OIKeyID, OIRow)
|
|
MappedSQLColumnValues := JoinedSQLColumnValues : @FM
|
|
end
|
|
StaticSQLColumnNames = SQL_Services_RevDotNet('GetStaticSQLColumnNames', OITableName)
|
|
If StaticSQLColumnNames NE '' then
|
|
MappedSQLColumnNames := StaticSQLColumnNames : @FM
|
|
StaticSQLColumnValues = SQL_Services_RevDotNet('GetStaticSQLColumnValues', OITableName)
|
|
MappedSQLColumnValues := StaticSQLColumnValues : @FM
|
|
end
|
|
MappedSQLColumnNames[-1, 1] = ''
|
|
MappedSQLColumnValues[-1, 1] = ''
|
|
Swap @FM with ', ' in MappedSQLColumnNames
|
|
Swap @FM with ", " in MappedSQLColumnValues
|
|
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_RevDotNet('GetSecondarySQLTables', OITableName)
|
|
If SecondarySQLTableNames NE '' then
|
|
For Each SecondarySQLTableName in SecondarySQLTableNames using @FM
|
|
OIColumnValue = '' ; // Default to empty string. Update if AMV Master is found.
|
|
NumPositions = 1 ; // Default to only 1 index position. Update if AMV Master is found.
|
|
AMVMaster = SQL_Services_RevDotNet('GetAMVMaster', OITableName, SecondarySQLTableName)
|
|
If AMVMaster NE '' then
|
|
FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%')
|
|
If Error_Services('NoError') then
|
|
Locate AMVMaster in FieldArray<FIELDS_NAME$> using @VM setting vPos then
|
|
OIColumnType = FieldArray<FIELDS_TYPE$, vPos>
|
|
If OIColumnType EQ 'F' then
|
|
OIColumnPos = FieldArray<FIELDS_FIELD_NO$, vPos>
|
|
If OIColumnPos GT 0 then
|
|
OIColumnValue = OIRow<OIColumnPos>
|
|
end else
|
|
OIKeyPart = FieldArray<FIELDS_PART$, vPos>
|
|
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
|
|
end
|
|
end
|
|
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, SecondarySQLTableName)
|
|
If MappedSQLColumnNames NE '' then
|
|
JoinedSQLColumnNames = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, SecondarySQLTableName)
|
|
If JoinedSQLColumnNames NE '' then
|
|
MappedSQLColumnNames := @FM : JoinedSQLColumnNames
|
|
end
|
|
Swap @FM with ', ' in MappedSQLColumnNames
|
|
For AMVPosition = 1 to NumPositions
|
|
If OIColumnValue<0, AMVPosition> NE '' then
|
|
MappedSQLColumnValues = SQL_Services_RevDotNet('GetMappedSQLColumnValues', OITablename, SecondarySQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
If JoinedSQLColumnNames NE '' then
|
|
JoinedSQLColumnValues = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnValues', OITableName, SecondarySQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
MappedSQLColumnValues := @FM : JoinedSQLColumnValues
|
|
end
|
|
Swap @FM with ', ' in MappedSQLColumnValues
|
|
SQLInsertStatement = 'INSERT INTO ' : SecondarySQLTableName : ' '
|
|
SQLInsertStatement := '('
|
|
SQLInsertStatement := MappedSQLColumnNames
|
|
SQLInsertStatement := ') VALUES ('
|
|
SQLInsertStatement := MappedSQLColumnValues
|
|
SQLInsertStatement := ')'
|
|
SQLInsertStatements := SQLInsertStatement : @FM
|
|
end
|
|
Next AMVPosition
|
|
end
|
|
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
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetSQLUpdateStatements
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being deleted from SQL. - [Required]
|
|
// OIRow - The OpenInsight row associated with the OpenInsight Key ID. - [Optional]
|
|
// OIColumns - An @FM delimited list of OpenInsight table columns that should only be used to write to SQL. If empty,
|
|
// all columns that have a map defintion will be used. - [Optional]
|
|
//
|
|
// Returns an @FM delimited list of SQL update statements for the SQL table mapped to the indicated OpenInsight table.
|
|
// This will automatically create all SQL update statements for secondary SQL tables as well.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetSQLUpdateStatements(OITableName, OIKeyID, OIRow, OIColumns)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
SQLUpdateStatements = ''
|
|
|
|
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_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, PrimarySQLTableName, OIKeyID, OIRow)
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, PrimarySQLTableName, OIColumns)
|
|
If MappedSQLColumnNames NE '' then MappedSQLColumnNames := @FM
|
|
MappedSQLColumnValues = SQL_Services_RevDotNet('GetMappedSQLColumnValues', OITablename, PrimarySQLTableName, OIKeyID, OIRow, '', OIColumns)
|
|
If MappedSQLColumnValues NE '' then MappedSQLColumnValues := @FM
|
|
JoinedSQLColumnNames = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, PrimarySQLTableName)
|
|
StaticSQLColumnNames = SQL_Services_RevDotNet('GetStaticSQLColumnNames', OITableName)
|
|
If StaticSQLColumnNames NE '' then
|
|
MappedSQLColumnNames := StaticSQLColumnNames : @FM
|
|
StaticSQLColumnValues = SQL_Services_RevDotNet('GetStaticSQLColumnValues', OITableName)
|
|
MappedSQLColumnValues := StaticSQLColumnValues : @FM
|
|
end
|
|
MappedSQLColumnNames[-1, 1] = ''
|
|
MappedSQLColumnValues[-1, 1] = ''
|
|
SQLUpdateStatement = ''
|
|
If MappedSQLColumnNames NE '' then
|
|
SQLUpdateStatement := 'UPDATE ' : PrimarySQLTableName : ' SET '
|
|
For Each SQLColumnName in MappedSQLColumnNames using @FM setting fPos
|
|
SQLUpdateStatement := SQLColumnName : '=' : MappedSQLColumnValues<fPos> : ', '
|
|
Next SQLColumnName
|
|
SQLUpdateStatement[-2, 1] = ''
|
|
SQLUpdateStatement := 'WHERE '
|
|
SQLUpdateStatement := JoinClause : ' '
|
|
SQLUpdateStatements := SQLUpdateStatement : @FM
|
|
end
|
|
|
|
If Error_Services('NoError') then
|
|
// Add any secondary SQL table inserts that might be required.
|
|
SecondarySQLTableNames = SQL_Services_RevDotNet('GetSecondarySQLTables', OITableName)
|
|
If SecondarySQLTableNames NE '' then
|
|
For Each SecondarySQLTableName in SecondarySQLTableNames using @FM
|
|
OIColumnValue = '' ; // Default to empty string. Update if AMV Master is found.
|
|
NumPositions = 1 ; // Default to only 1 index position. Update if AMV Master is found.
|
|
AMVMaster = SQL_Services_RevDotNet('GetAMVMaster', OITableName, SecondarySQLTableName)
|
|
If AMVMaster NE '' then
|
|
FieldArray = Database_Services('ReadDataRow', 'DICT.' : OITablename, '%FIELDS%')
|
|
If Error_Services('NoError') then
|
|
Locate AMVMaster in FieldArray<FIELDS_NAME$> using @VM setting vPos then
|
|
OIColumnType = FieldArray<FIELDS_TYPE$, vPos>
|
|
If OIColumnType EQ 'F' then
|
|
OIColumnPos = FieldArray<FIELDS_FIELD_NO$, vPos>
|
|
If OIColumnPos GT 0 then
|
|
OIColumnValue = OIRow<OIColumnPos>
|
|
end else
|
|
OIKeyPart = FieldArray<FIELDS_PART$, vPos>
|
|
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
|
|
end
|
|
end
|
|
|
|
// Remove all rows from the secondary table. These will be added back using the INSERT statements as needed.
|
|
SQLUpdateStatement = 'DELETE FROM ' : SecondarySQLTableName : ' '
|
|
SQLUpdateStatement := 'WHERE '
|
|
SQLUpdateStatement := JoinClause
|
|
SQLUpdateStatements := SQLUpdateStatement : @FM
|
|
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, SecondarySQLTableName)
|
|
If MappedSQLColumnNames NE '' then
|
|
JoinedSQLColumnNames = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, SecondarySQLTableName)
|
|
If JoinedSQLColumnNames NE '' then
|
|
MappedSQLColumnNames := @FM : JoinedSQLColumnNames
|
|
end
|
|
Swap @FM with ', ' in MappedSQLColumnNames
|
|
For AMVPosition = 1 to NumPositions
|
|
If OIColumnValue<0, AMVPosition> NE '' then
|
|
MappedSQLColumnValues = SQL_Services_RevDotNet('GetMappedSQLColumnValues', OITablename, SecondarySQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
If JoinedSQLColumnNames NE '' then
|
|
JoinedSQLColumnValues = SQL_Services_RevDotNet('GetMappedJoinedSQLColumnValues', OITableName, SecondarySQLTableName, OIKeyID, OIRow, AMVPosition)
|
|
MappedSQLColumnValues := @FM : JoinedSQLColumnValues
|
|
end
|
|
Swap @FM with ', ' in MappedSQLColumnValues
|
|
SQLUpdateStatement = 'INSERT INTO ' : SecondarySQLTableName : ' '
|
|
SQLUpdateStatement := '('
|
|
SQLUpdateStatement := MappedSQLColumnNames
|
|
SQLUpdateStatement := ') VALUES ('
|
|
SQLUpdateStatement := MappedSQLColumnValues
|
|
SQLUpdateStatement := ')'
|
|
SQLUpdateStatements := SQLUpdateStatement : @FM
|
|
end
|
|
Next AMVPosition
|
|
end
|
|
Next SecondarySQLTableName
|
|
end
|
|
end
|
|
|
|
SQLUpdateStatements[-1, 1] = ''
|
|
end else
|
|
Error_Services('Add', 'The OITableName, OIKeyID, or OIRow argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = SQLUpdateStatements
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetSQLSelectStatement
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being deleted from SQL. - [Required]
|
|
// OIRow - The OpenInsight row associated with the OpenInsight Key ID. - [Optional]
|
|
//
|
|
// Returns the SQL select statement for the indicated SQL table based on its mapping to the indicated OpenInsight table.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetSQLSelectStatement(OITableName, SQLTableName, OIKeyID, OIRow)
|
|
|
|
Convert @Lower_Case to @Upper_Case in OITableName
|
|
|
|
SQLSelectStatement = ''
|
|
|
|
If (OITableName NE '') AND (SQLTableName NE '') AND (OIKeyID NE '') then
|
|
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, SQLTableName, OIKeyID, OIRow, '', True$)
|
|
If JoinClause NE '' then
|
|
MappedSQLColumnNames = SQL_Services_RevDotNet('GetMappedSQLColumnNames', OITableName, SQLTableName)
|
|
If MappedSQLColumnNames NE '' then
|
|
// Include the join columns among the columns being returned so their values can be updated in their
|
|
// joined OpenInsight columns (if applicable).
|
|
MappedSQLColumnNames := @FM : SQL_Services_RevDotNet('GetMappedJoinedSQLColumnNames', OITableName, SQLTableName)
|
|
Swap @FM with ', ' in MappedSQLColumnNames
|
|
SQLSelectStatement := 'SELECT '
|
|
SQLSelectStatement := MappedSQLColumnNames : ' '
|
|
SQLSelectStatement := 'FROM ' : SQLTableName : ' '
|
|
SQLSelectStatement := 'WHERE '
|
|
SQLSelectStatement := JoinClause : ' '
|
|
end
|
|
end
|
|
|
|
end else
|
|
Error_Services('Add', 'The OITableName, SQLTableName, or OIKeyID argument was missing in the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = SQLSelectStatement
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetSQLDeleteStatements
|
|
//
|
|
// OITableName - The name of the OpenInsight table that is mapped to the SQL table. - [Required]
|
|
// OIKeyID - The Key ID to the OpenInsight row being deleted from SQL. - [Required]
|
|
// OIRow - The OpenInsight row associated with the OpenInsight Key ID. - [Optional]
|
|
//
|
|
// 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_RevDotNet('GetPrimarySQLTable', OITableName)
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, PrimarySQLTableName, OIKeyID, OIRow, '', True$)
|
|
SQLDeleteStatement = 'DELETE FROM ' : PrimarySQLTableName : ' '
|
|
SQLDeleteStatement := 'WHERE '
|
|
SQLDeleteStatement := JoinClause
|
|
SQLDeleteStatements := SQLDeleteStatement : @FM
|
|
|
|
// Add any secondary SQL table inserts that might be required.
|
|
SecondarySQLTableNames = SQL_Services_RevDotNet('GetSecondarySQLTables', OITableName)
|
|
If SecondarySQLTableNames NE '' then
|
|
For Each SecondarySQLTableName in SecondarySQLTableNames using @FM
|
|
JoinClause = SQL_Services_RevDotNet('GetJoinClause', OITableName, SecondarySQLTableName, OIKeyID, OIRow, '', True$)
|
|
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
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Internal GoSubs
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|