Wednesday, 22 March 2017

We just released soapgateQ! 5.5 on OpenNTF

Release note:

soapgate Q! 5.5

Bug Fixes

Minor fixes and improvements since version 5.0


New Features

Client controlled caching - for smaller data sets (64K limit).

Consider the following scenario: a corporate application for a smart device is accessing a Domino server to withdraw some data from a view. Unless some kind of caching mechanism is in place, multiple devices requesting the data from the same database and view, will cause the Domino server to multiple times generate the same result set.

soapgateQ! 5.5 provides a caching feature to avoid this situation. This feature is entirely controlled by the client. If the request is send with the correct parameters, the server will cache the result-set until a new request comes in stating explicitly not to cache. A request to cache will also force any further request sent by other devices to be put on hold and answered only once the cache is built.

Using this feature, multiple devices can send requests all at the same time, but the server will only process the first request, collect the data, build the cache and only then answer all request from the cache. This resulting in high performance gains.

All view or folder related RESTful or SOAP operations provide the CACHE parameter. The way the cache parameter is to be used in a client application is by creating a string that contains a prefix related to the view accessed and a date time string in reverse format. For instance:

BOOKS.FLAT.201703011600    (Prefix.yyyymmddhhnn)

Depending on how long the cache should remain valid before the next request is processed accessing the most current data, the last n characters of the cache string should be modified accordingly. If the cache should be active for let’s say 15 minutes, the last two character should be changed once 15 minutes passed…

BOOKS.FLAT.201703011615    (Prefix.yyyymmddhhnn)

The prefix is required to make the cache string unique and keep it linked to a particular view in a particular Domino database. There are no rules on what prefix to use, just make it unique.

If the server receives a request with a cache string, it will look up if there is a cache entry and return the result set if there is. Otherwise it will lock the cache string until a result set is created and all other requests with the same cache string must wait until the result set for the cache entry is created.

Try the request below against our test server (use two different browser to avoid browser caching). You might not notice much of a difference as the test data-set is pretty small. However, we have this feature implemented in a real world scenario where up to 50 iOS devices hit the server in a 10-15 minute time period to synchornise client records and we have reduced the response time from 2+ minutes down to 15-30 seconds for reading about 10 thausend clients.

https://domino.flexdomino.net/SOAPGATEQ_5.NSF/REST4ViewsFolders?openagent&JSONPARAM={
    "jsonparam": {
        "OPERATION": "dbviewentries",
        "CACHE": "BOOKS.FLAT.201703011600",
        "SRVNAME": "flexdomino/flex2domino",
        "DBNAME": "flex/flexdemo.nsf",
        "VIEWNAME": "books.flat"
    }
}




Batch processing

The REST4Documents REST service to read and update individual documents now has a new operation called DbBatchProcess.  This allows transmitting multiple operation requests in one REST call, thereby improving performance of REST operations. So it is possible to read, amend or create multiple documents in one call.

The DbBatchProcess operation has only one parameter, a list of tags. At the end of the main REST construct to call the DbBatchProcess operation, additional REST constructs for further operations can be added. Additional operations must be part of the REST4Documents list of operations. Each additional call must begin with one of the tags and end with the same tag.
There are no rules towards the format of the tags. However, tags must be unique within the entire message send to the server.

https://domino.flexdomino.net/SOAPGATEQ_5.NSF/REST4Documents?openagent&JSONPARAM={
    "jsonparam": {
        "OPERATION": "dbbatchprocess",
        "PROCESSTAGS": ["{{tag-00001}}","{{tag-00002}}","{{tag-00003}}"]
    }
}
{{tag-00001}}
{"jsonparam":{"OPERATION":"dbsavedocfields","SRVNAME":"server/org","DBNAME":"requests.nsf","DOCUNID":"","FORM":"OnlineCalcRQST","FIELDS":["ArrivalDate","DepartureDate","CourseStartDate","Weeks","CourseUniversalID","ResidenceUniversalID","HotelUniversalID","Supplements","Visa","Airport","DiscountCode"],"TYPES":["1024","1024","1024","768","1280","1280","1280","1280","768","768","1280"],"VALUES":["2017-03-12","2017-03-25","2017-03-13",2,"2F780A45B001394DC1257EEC00561965","F0A41663A0B724A1C1257EED00432A30","","Single","Yes","Yes","CB2017"],"READFIELDS":["SUMMARY","PRICE","TOTALDISCOUNT","ECOTAXDAYS"],"COMPWF":false,"SAVERPC":"$OnlineCalculatorRQST"}}
{{tag-00001}}
{{tag-00002}}
{"jsonparam":{"OPERATION":"dbsavedocfields","SRVNAME":"server/org","DBNAME":"requests.nsf","DOCUNID":"","FORM":"OnlineCalcRQST","FIELDS":["ArrivalDate","DepartureDate","CourseStartDate","Weeks","CourseUniversalID","ResidenceUniversalID","HotelUniversalID","Supplements","Visa","Airport","DiscountCode"],"TYPES":["1024","1024","1024","768","1280","1280","1280","1280","768","768","1280"],"VALUES":["2017-04-14","2017-04-27","2017-04-15",2,"2F780A45B001394DC1257EEC00561965","F0A41663A0B724A1C1257EED00432A30","","Single","Yes","Yes","CB2017"],"READFIELDS":["SUMMARY","PRICE","TOTALDISCOUNT","ECOTAXDAYS"],"COMPWF":false,"SAVERPC":"$OnlineCalculatorRQST"}}
{{tag-00002}}
{{tag-00003}}
{"jsonparam":{"OPERATION":"dbsavedocfields","SRVNAME":"server/org","DBNAME":"requests.nsf","DOCUNID":"","FORM":"OnlineCalcRQST","FIELDS":["ArrivalDate","DepartureDate","CourseStartDate","Weeks","CourseUniversalID","ResidenceUniversalID","HotelUniversalID","Supplements","Visa","Airport","DiscountCode"],"TYPES":["1024","1024","1024","768","1280","1280","1280","1280","768","768","1280"],"VALUES":["2017-05-10","2017-05-20","2017-05-11",2,"2F780A45B001394DC1257EEC00561965","F0A41663A0B724A1C1257EED00432A30","","Single","Yes","Yes","CB2017"],"READFIELDS":["SUMMARY","PRICE","TOTALDISCOUNT","ECOTAXDAYS"],"COMPWF":false,"SAVERPC":"$OnlineCalculatorRQST"}}
{{tag-00003}}




Extended Data Sets

Similar to the batch processing tags, there are a number of predefined tag-names that can be used to separate large data sets (for instance binary data) from the JSON construct for the REST operation. These can only be used for fields of type Richtext (1).

None Encoded Data Block – {[DATA]:tag}

This special tag can be used to transmit for instance longer HTML content to be stored in a Richtext fields. Content stored in None Encoded Data Blocks are not parsed as part of the JSON construct and therefore do not require any encoding to make it JSON parser conformative.

https://domino.flexdomino.net/SOAPGATEQ_5.NSF/REST4Documents?openagent&JSONPARAM={
{"jsonparam":{"OPERATION":"dbsavedocfields","SRVNAME":"server/org","DBNAME":"requests.nsf","DOCUNID":"","FORM":"HtmlForm","FIELDS":["Body"],"TYPES":["1"],"VALUES":["{[DATA]:{data-tag_0001}"],"READFIELDS":[""],"COMPWF":false,"SAVERPC":""}}}
{{EXTENDED-DATA}}
{data-tag_0001}
any string (for instance HTML)
{data-tag_0001}

Base64 Encoded Data Block – {Base64:tag:KEEPRAW}

With this special tag it is possible to transmit files as Base64 encoded data and attach them to a Richtext field. The tag name must be a valid filename (no path). The optional parameter :KEEPRAW allows to keep the Base64 encoded string in addition to the attachment.

https://domino.flexdomino.net/SOAPGATEQ_5.NSF/REST4Documents?openagent&JSONPARAM={
{"jsonparam":{"OPERATION":"dbsavedocfields","SRVNAME":"server/org","DBNAME":"requests.nsf","DOCUNID":"","FORM":"HtmlForm","FIELDS":["Body"],"TYPES":["1"],"VALUES":["{Base64:image.jpg}"],"READFIELDS":[""],"COMPWF":false,"SAVERPC":""}}}
{{EXTENDED-DATA}}
{image.jpg}
for instance Base64 encoded image data
{image.jpg}


Monday, 16 March 2015

Are you an owner of a Macbook Air or Pro?

I'm and I have been deeply disappointed by the bad quality of the anti-glare coating. So have many other Macbook owners. If you have the same problem, please join the following Facebook group...

https://www.facebook.com/groups/607572909386595/

https://www.facebook.com/stainsonretinadisplay

http://www.staingate.org


Friday, 10 October 2014

Salesforce and IBM Domino integration using SoapgateQ!

Our partner Q!kom extended its business into the Salesforce area. They use our soapgate Q! API  for the integration of data between IBM Domino and Salesforce CRM. In these projects soapgate Q! has proved itself to be solid and robust. 

http://en.qkom.de/2014/09/soapgate-q-and-salesforce/ 

Next week the major Salesforce meeting in San Francisco starts ("Dreamforce") and Q!kom made it to be a speaker with the topic of integrating IBM Connections into Salesforce. 

http://en.qkom.de/2014/09/dreamforce-in-san-francisco-october-13-16/ 

If Salesforce is coming up in your company Q!kom can help you to find your way through and to secure your investment! 

Friday, 6 December 2013

soapgate Q! 5 Beta 2 released

soapgate Q! 5 Beta 2

Bug Fixes
  • dbOutlineViews() - Did not return always welformed XML 
  • dbLookupX() - Returned an error message when no columns had to be returned (empty COLFIELDS parameter), but one or more of the parameters VENUM, UNID and NOTEID where set to True. The latter is a perfectly valid scenario to receive for instance the UNID and NoteID of documents only.
  • dbPutInFolder() / dbRemoveFromFolder() - Failed when the given list of UNIDs/NoteIDs was no refering to a unique list of documents (double entries). The latter is now ignored.
  • dbLookupNames() - Returned no result if the RowFormat parameter was set to False


New Features
Release 5 is all about RESTful services. Whilst the soapgateQ! project was originally focused on providing a web service based API to Domino, we decided that it wouldn't harm to write some wrapper classes around the current functionality to provide a RESTful interface.

This current BETA release does not yet cover all the provided web service operations, but the most commonly used ones:

http:/domino.flexdomino.net/soapgateq_5.nsf/REST4ViewsFolders?OpenAgent

  • dbClearFolder()
  • dbColumn()
  • dbColumnX()
  • dbFTSearch()
  • dbLookup()
  • dbLookupX()
  • dbOutlineViews()
  • dbPutInFolder()
  • dbRemoveFromFolder()
  • dbRowX()
  • dbSearch()
  • dbViewEntries()
  • dbViewFTSearch()


http:/domino.flexdomino.net/soapgateq_5.nsf/REST4Documents?OpenAgent

  • dbDeleteDoc()
  • dbDocAttachmentList()
  • dbGetFieldTypes()
  • dbGetFormFields()
  • dbReadDocFields()
  • dbReadProfileFields()
  • dbSaveDocFields()
  • dbSaveProfileFields()


http:/domino.flexdomino.net/soapgateq_5.nsf/REST4WinCAPI?OpenAgent

  • dbGetDelStubs()


http:/domino.flexdomino.net/soapgateq_5.nsf/REST4AccessNAB?OpenAgent

  • dbACL()
  • dbEffectiveRights()
  • dbGetMailInfo()
  • dbLookupNames()
  • dbUserRoles()

Please refer to the release notes provided with the download

Friday, 1 November 2013

soapgateQ! 5 Beta just release on OpenNTF

soapgateQ! 5 Beta supporting RESTful API calls (besides SOAP) is now available on soapgateq.openntf.org

Thursday, 31 October 2013

The new REST API in soapgateQ! 5 is nearly complete...

In a previous posting we showed a few sample REST calls related to reading views and folders from a Notes database. In the meantime we completed most view, folder and document related operations. The REST call can now also provide the parameters as a single JSON construct:

    "jsonparam": {
        "OPERATION": "dbviewentries",
        "SRVNAME": "flexdomino/flex2domino",
        "DBNAME": "flex/flexdemo.nsf",
        "VIEWNAME": "books.flat"
    }
}


    "jsonparam": {
        "OPERATION": "dbcolumnx",
        "SRVNAME": "flexdomino/flex2domino",
        "DBNAME": "flex/flexdemo.nsf",
        "VIEWNAME": "books.flat",
        "COLFIELDS": [
            "1",
            "2",
            "3",
            "4",
            "5",
            "Book_Genre"
        ],
        "RETUNID": true
    }
}


    "jsonparam": {
        "OPERATION": "dbreaddocfields",
        "SRVNAME": "flexdomino/flex2domino",
        "DBNAME": "flex/flexdemo.nsf",
        "DOCUNID": "8F0C446A37709450C1257C2900371615",
        "FIELDS": [
            "Book_Summary",
            "Book_Cover",
            "Book_Price",
            "Book_Genre",
            "Book_Year",
            "Book_Author",
            "Book_Title"
        ]
    }
}


    "jsonparam": {
        "OPERATION": "dbsavedocfields",
        "SRVNAME": "flexdomino/flex2domino",
        "DBNAME": "flex/flexdemo.nsf",
        "DOCUNID": "",
        "FORM": "Book",        
        "FIELDS": [
            "Book_Summary",
            "Book_Cover",
            "Book_Price",
            "Book_Genre",
            "Book_Year",
            "Book_Author",
            "Book_Title"
        ],
        "TYPES": [
            1280,
            25,
            768,
            1280,
            1280,
            1280,
            1280
        ],
        "VALUES": [
            "New Summary",
            "(See attached file: warren.JPG)<\/i><\/body><\/html>\n\n\n
warren-479601236.JPG<\/a><\/td><\/tr>\n<\/table>\n",

            99.99,
            "IT",
            "2013",
            "John Smith",
            "soapgate Q! RESTful services"
        ],
        "READFIELDS": [
            "Book_Price",
            "Book_Genre",
            "Book_Year",
            "Book_Author",
            "Book_Title"
        ]
    }

}

Thursday, 3 October 2013

Unbelievable but TRUE...Flash made it on iOS !!!!

...well, of course not directly, but the Photon Browser includes a Flash streaming service that works reasonably fast if you have a good internet connection.


I purchased the browser and Flash just runs fine. I tried Flash videos, simple to 
sophisticated Flash games, I even tried a few business Flash apps I had developed myself and they all run fine. I admit that some of the games where not particular suited for the iPad due to the keyboard control requirements, nevertheless they worked. And the browser has some keyboard options for Flash games that help.

The nice thing is, if you are in a situation where you are with your iPhone/iPad and come across Flash content you really like to see, you now have a solution.