|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An interesting query made its way into the office this week. Our client wanted to be able to validate data using Regular Expressions (REGEXP) for Email validation (^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$ if you must know) and so unsurprisingly searched the documentation for REGEXP and came across its usage in RTI_JSON. This led to a series of mutual misunderstandings which led to a far greater understanding of what JSON actually is (see footnote) but still didn't help in actually validating using a REGEXP. Fortunately, we have resources in the office who were able to advise that what we wanted to achieve was actually relatively simple using the OI ActiveX Scripting Host. This is something that is not yet "officially" documented in the product - but like quite a few things in OI, there is profuse documentation in the Equates. In version 10 this has been handily encapsulated for us the the RTI_AXSH function - the ActiveX Scripting Host. ActiveX Scripting and Active Scripting are the same thing. The X was dropped over the years. But first - what actually is a Scripting Host? An Active Scripting Host is a technology used in Windows to support component-based scripting. It allows different scripting engines to be integrated into applications. This enables the execution of scripts written in various languages like VBScript, JScript (Microsoft’s implementation of JavaScript), Python, Perl and others. If we have a task we wish to execute that is better suited to say, JScript - performing a REGEXP for example - we can use RTI_AXSH to do this for us. To show how easy it is, we'll first provide a small sample program to do this, then explain the program and finally document the routine. The Codecompile function test_revaxsh_regexp( void ) $insert rti_AXSH_Equates call set_Status( FALSE$ ) errStat = SETSTAT_OK$ code = 're = new RegExp( "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$" );' createParams = "" hAXSH = rti_AXSH( REVAXSH_MTD_CREATE$, createParams ) errStat = get_Status( errText ) if errStat then call rti_AXSH( REVAXSH_MTD_ADDCODE$, hAXSH, code ) errStat = get_Status( errText ) if errStat then string = "amcauley@sprezzatura" if get_Status() else if ( hAXSH ) then if errStat then return retVal The ExplanationThe first thing that we need to do is insert RTI_AXSH_Equates. Once this has been done, we construct some simple JScript code in a variable called code. For those not fluent in JScript it's probably worth explaining how the code operates. We start by create a global variable called "re". Think of it as being like labelled common. It'll be there until the scripting host is destroyed. Loading the code instantiates the re object as a REGEXP type. We then define a JScript function called testRE so that we can call it from within Basic+. We initialise our create parameter to tell OI which scripting language to use and then use the CREATE method to initialise our Script Hosting. Now that we have a container to put our code in, we can add it using the ADDCODE method. Assuming no errors we then use the RUNEX method, telling it the name of the function in our code we wish to execute (testRE). We now have the result we want to do with as we will. Finally in an act of polite housekeeping we tell the system to DESTROY the scripting host we created so as not to leak resources. We hope that this information makes the Scripting Host a little less scary! The Documentation - taken from RTI_AXHS_EQUATES.The RTI_AXSH routine provides a set of methods for interacting with the ActiveX Scripting Host. Below is a detailed guide on how to use these methods, including their parameters, return values, and error handling. The following methods are supported
CREATECreates an ActiveX scripting host instance and returns it's handle. <1> Script Language (required)
DESTROYDestroys a script host instance.
GETPROPReturns the value of a specified property
The supported properties are "Language", "Allow UI", "SiteHnd" and "Timeout" ANY DEFAULTS CARL? SETPROPSets the value of a specified property e.g. propName = REVAXSH_PROP_ALLOWUI$ propValue = FALSE$ call rti_AXSH( REVAXSH_MTD_SETPROP$, hAXSH, propName, propValue )
ADDCODEAdds a block of code to the scripting host (Any immediate code will be executed as normal) e.g. scriptCode = "function add( a, b ) { return a + b; }" call rti_AXSH( REVAXSH_MTD_ADDCODE$, hAXSH, scriptCode )
EVALEvaluates a statement and returns the result. e.g. statement = "3+10;" retVal = rti_AXSH( REVAXSH_MTD_EVAL$, hAXSH, statement )
EXECUTEExecutes one or more statements (no result is returned) e.g. scriptCode = "function add10( a, b ) { return a + 10; }; add10( 3 );" call rti_AXSH( REVAXSH_MTD_EXECUTE$, hAXSH, scriptCode )
RUNExecutes a specific script function and returns the result (if any). e.g. scriptCode = "function add( a, b ) { return a + b; }" call rti_AXSH( REVAXSH_MTD_ADDCODE$, hAXSH, scriptCode ) method = "add" args = 3 : @rm : 4 retVal = rti_AXSH( REVAXSH_MTD_RUN$, hAXSH, method, args )
GETENGINESReturns a list of ActiveX script engines installed on the workstation. e.g. engineList = rti_AXSH( REVAXSH_MTD_GETENGINES$ )
ADDOBJECTAdds a global named object to the scripting host e.g. objName = "MyXmlDoc" objDoc = OleCreateInstance( "Msxml2.DOMDocument" ) call rti_AXSH( REVAXSH_MTD_ADDOBJECT$, hAXSH, objName, objDoc )
RUNEXExecutes a specific script function and returns the result (if any), allowing the script function parameters to be passed as separate arguments (This method is the only method that can pass OLE objects to a script function) The maximum number of parameters that can be passed is 10. Note that this method stops looking for script function arguments when it encounters the first unassigned one. e.g. scriptCode = "function add( a, b ) { return a + b; }" method = "add"
A note relating to all scripting errorsThe Execute, AddCode, Eval and Run methods can all return parsing and execution errors from the scripting engine. In this case an @svm delimited list of error information is returned with the following structure: <0,0,1> Error Source Footnote:JSON (JavaScript Obect Notation) is a way of serializing JS variables/objects to a human-friendly string format so they can be saved and reloaded. It is not intended as a way to create JS objects and then call their methods and such... despite what the author thought Pro TipCoPilot understands RegExp well. It suggests replacing the REGEXP we started with with "^[\w.%+-]+@[\w.-]+\\.\w{2,}$".
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||