namespace dev;
@Schema : 'DEMO'
context "DeepInsert"
{
entity "Parent"
{
key Id:Integer not null;
Description:String(50);
Temperature:DecimalFloat;
Timestamp:UTCTimestamp;
}
entity "Child"
{
key Id:Integer not null;
ParentId:Integer not null;
Description:String(50);
}
}
schema= "DEMO";
start_with=1;
nomaxvalue=true;
minvalue=1;
cycles=false;
increment_by=1;
depends_on_table="dev::DeepInsert.Parent";
schema= "DEMO";
start_with=1;
nomaxvalue=true;
minvalue=1;
cycles=false;
increment_by=1;
depends_on_table="dev::DeepInsert.Child";
{
"Object":
{
"Parent":{
"Id":-1,
"Description":"Deep Insert Parent Object",
"Temperature":25.2,
"Timestamp":20170511183353,
"Child":[{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 1"
},
{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 2"
}]
}
}
}
/*---------------------------------------------------------------------*
* Procedure: DeepInsert
*----------------------------------------------------------------------*
* Author: Bradley Smith
*----------------------------------------------------------------------*
* Description: Deep Insert Pattern
*----------------------------------------------------------------------
Parameter: Object
Format:
{
"Object":
{
"Parent":{
"Id":-1,
"Description":"Deep Insert Parent Object",
"Temperature":25.2,
"Timestamp":20170511183353,
"Child":[{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 1"
},
{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 2"
}]
}
}
}
*/
var objectsToCreate = [];
var detail = '';
function processObject(objectName, objectInstance, parentIdFieldName, parentId)
{
try
{
//copy the object to prepare it for batch create
var objectToCreate = JSON.parse(JSON.stringify(objectInstance));
//get the new Id from relevant sequence
var recordId = -1;
var queryStr = 'select "dev::Sequence' + objectName + '".NEXTVAL as Id from dummy;';
var conn = $.db.getConnection();
var pstmt = conn.prepareStatement(queryStr);
var rs = pstmt.executeQuery();
while (rs.next()) {
recordId = rs.getInteger(1);
}
rs.close();
pstmt.close();
conn.close();
objectToCreate.Id = recordId;
//detect and update parent id field
if(parentIdFieldName && parentId)
{
objectToCreate[parentIdFieldName] = parentId;
}
var childObjectNames = [];
var objectProperties = Object.getOwnPropertyNames(objectInstance);
for(var objectPropertyIndex = 0;objectPropertyIndex < objectProperties.length; objectPropertyIndex++)
{
var propertyName = objectProperties[objectPropertyIndex];
var propertyType = typeof objectInstance[propertyName];
if(propertyType === 'object')
{
if(Array.isArray(objectToCreate[propertyName]))
{
//relationship 1..*
childObjectNames.push(propertyName);
//remove from the new object as it will prevent odata insert
delete objectToCreate[propertyName];
}
}
}
//queue new object ready for batch create
objectsToCreate.push({ "ObjectName": objectName, "Object": objectToCreate });
//process child objects One To Many
for(var childObjectNameIndex = 0; childObjectNameIndex < childObjectNames.length;childObjectNameIndex++)
{
var childObjectName = childObjectNames[childObjectNameIndex];
var childObjectCollection = objectInstance[childObjectName];
for(var childObjectIndex = 0; childObjectIndex < childObjectCollection.length; childObjectIndex++)
{
var childObject = childObjectCollection[childObjectIndex];
processObject(childObjectName, childObject, objectName + 'Id', objectToCreate.Id);
}
}
}
catch(e)
{
//catch all error condition
$.response.status = $.net.http.INTERNAL_SERVER_ERROR;
$.response.contentType = "application/json";
$.response.setBody(e.toString());
}
}
function createObjects()
{
var conn = $.db.getConnection();
try
{
var parentId = 0;
for(var objIndex = 0;objIndex < objectsToCreate.length; objIndex++)
{
var fieldsStr = "";
var valuesStr = "";
var objectName = objectsToCreate[objIndex].ObjectName;
var objectInstance = objectsToCreate[objIndex].Object;
if(objIndex === 0)
{
parentId = objectInstance.Id;
}
var objectProperties = Object.getOwnPropertyNames(objectInstance);
for(var objectPropertyIndex = 0;objectPropertyIndex < objectProperties.length;objectPropertyIndex++)
{
var propertyName = objectProperties[objectPropertyIndex];
fieldsStr += '"' + propertyName + '"';
valuesStr += '?';
if(objectPropertyIndex < objectProperties.length - 1)
{
fieldsStr += ',';
valuesStr += ',';
}
}
var createQueryStr = 'INSERT INTO "dev::DeepInsert.';
createQueryStr += objectName;
createQueryStr += '" (';
createQueryStr += fieldsStr;
createQueryStr += ') values (';
createQueryStr += valuesStr;
createQueryStr += ');';
var st = conn.prepareStatement(createQueryStr);
//value loop to prevent sql injection
for(objectPropertyIndex = 0;objectPropertyIndex < objectProperties.length;objectPropertyIndex++)
{
propertyName = objectProperties[objectPropertyIndex];
var propertyValue = objectInstance[propertyName];
var propertyType = typeof objectInstance[propertyName];
if(propertyType === 'string')
{
st.setString(objectPropertyIndex + 1, propertyValue);
}
else
{
st.setString(objectPropertyIndex + 1, propertyValue.toString());
}
}
st.execute();
}
conn.commit();
conn.close();
$.response.status = $.net.http.OK;
$.response.contentType = "application/json";
$.response.setBody(JSON.stringify({ "RESULT":"SUCCESS", "Id": parentId } ));
}
catch(e)
{
conn.rollback();
conn.close();
$.response.status = $.net.http.INTERNAL_SERVER_ERROR;
$.response.contentType = "application/json";
$.response.setBody(e.toString() + ' : ' + detail);
}
}
try
{
var reqParams = $.request.body.asString();
reqParams = JSON.parse(reqParams);
var object = reqParams.Object;
//detect the parent object and begin processing
var props = Object.getOwnPropertyNames(object);
for(var i = 0;i < props.length;i++)
{
var parentObjectName = props[i];
var parentObject = object[props[i]];
var typeAttr = typeof object[props[i]];
if(typeAttr === 'object')
{
//top level object detected. do not pass parent params as this is the top level
processObject(parentObjectName, parentObject);
}
}
createObjects();
}
catch(e)
{
//catch all error condition
$.response.status = $.net.http.INTERNAL_SERVER_ERROR;
$.response.contentType = "application/json";
$.response.setBody(e.toString());
}
var sPayload = {
"Object":
{
"Parent":{
"Id":-1,
"Description":"Deep Insert Parent Object",
"Temperature":25.2,
"Timestamp":20170511183353,
"Child":[{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 1"
},
{
"Id":-1,
"ParentId":-1,
"Description":"Deep Insert Child Object 2"
}]
}
}
};
var sUrl = 'https://acct.hanatrial.ondemand.com/dev/DeepInsert.xsjs';
$.ajax({
url:sUrl,
type:'POST',
data:JSON.stringify(sPayload),
dataType:'json',
contentType:'application/json',
headers: {
"Authorization": "Basic " + btoa('username:password')
},
success: function(data) {
alert(data.Id);
},
error: function(error) {
alert(error.responseText ? error.responseText : error.statusText);
}
});
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
11 | |
10 | |
7 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 | |
3 |