Array object has exceeded maximum permitted size of 268435456 Error

vineetharohra
Kilo Contributor

I want to fetch all the users from a particular field from a custom table and add them as members to a group if they are already not a part of it.

I am using below code but i get the error 'Array object has exceeded maximum permitted size of 268435456' for the members array:

// Add your code here

var managers = [];

var gr1 = new GlideRecord("u_contract_externals"); //custom table

gr1.addEncodedQuery("u_internal_contact_person!=NULL");

gr1.query();

while (gr1.next()) {

  //u_internal_contact_person

managers.push(gr1.u_internal_contact_person); //custom field from the table that refers user table

//managers =gr1.u_internal_contact_person + '';

}

gs.log(" OverSight Managers: "+managers);

  var gr = new GlideRecord("sys_user_grmember");

  gr.addEncodedQuery("group=b8c3923613038b0014145a132244b05a");

  gr.query();

  while (gr.next()) {

  for(i=0;i<managers.length;i++)

  {

  if(gr.user == managers[i])

  {

  gs.log(" Already A Member");

  }

  if(gr.user != managers[i])

  {

  gr.user = managers[i].toString();

  gr.insert();

  gs.log("Made a member of the group");

  }

  }

}

The above code does not reach the log -

gs.log(" OverSight Managers: "+managers);

Before that itself it throws error, array exceeded maximum size.

NOTE: This is a scheduled job which runs On Demand.

1 ACCEPTED SOLUTION

sachin_namjoshi
Kilo Patron
Kilo Patron

The below script should do what you are asking; although, it is making an extra call to the server to check the group membership before attempting to create the record.


Please modify code as per your table name and column names.





var gr = new GlideRecord('u_contract_externals');


gr.addEncodedQuery('u_internal_contact_person');


gr.query();


while(gr.next()){


  1. var grp = gr.u_internal_contact_person.toString();  
  2. var array = grp.split(",");  
  3.  
  4. for (var i=0; i<array.length; i++) {  
  5.   // Check to see if this user is a member of this group  
  6.   var grMember1 = new GlideRecord('sys_user_grmember');  
  7.   grMember1.addQuery('user', gr.array[i]);  
  8.   grMember1.addQuery('group', "<sys_id_of_your_group>");  
  9.   grMember1.query();  
  10.   if (grMember1.next()) {  
  11.       // Ignore if a group member  
  12.       gs.print('Group membership already exists');  
  13.   }  
  14.   else {  
  15.       // Create group membership  
  16.       var grMember2 = new GlideRecord('sys_user_grmember');  
  17.       grMember2.initialize();  
  18.       grMember2.user = gr.array[i];  
  19.       grMember2.group = <sys_id_of_group>;  
  20.       grMember2.insert();  
  21.       gs.print('Group membership created');  
  22.   }  
  23. }  
  24. }


Regards,


Sachin


View solution in original post

4 REPLIES 4

Surendra Raika1
Kilo Guru

How many records in u_contract_externals ?


sachin_namjoshi
Kilo Patron
Kilo Patron

The below script should do what you are asking; although, it is making an extra call to the server to check the group membership before attempting to create the record.


Please modify code as per your table name and column names.





var gr = new GlideRecord('u_contract_externals');


gr.addEncodedQuery('u_internal_contact_person');


gr.query();


while(gr.next()){


  1. var grp = gr.u_internal_contact_person.toString();  
  2. var array = grp.split(",");  
  3.  
  4. for (var i=0; i<array.length; i++) {  
  5.   // Check to see if this user is a member of this group  
  6.   var grMember1 = new GlideRecord('sys_user_grmember');  
  7.   grMember1.addQuery('user', gr.array[i]);  
  8.   grMember1.addQuery('group', "<sys_id_of_your_group>");  
  9.   grMember1.query();  
  10.   if (grMember1.next()) {  
  11.       // Ignore if a group member  
  12.       gs.print('Group membership already exists');  
  13.   }  
  14.   else {  
  15.       // Create group membership  
  16.       var grMember2 = new GlideRecord('sys_user_grmember');  
  17.       grMember2.initialize();  
  18.       grMember2.user = gr.array[i];  
  19.       grMember2.group = <sys_id_of_group>;  
  20.       grMember2.insert();  
  21.       gs.print('Group membership created');  
  22.   }  
  23. }  
  24. }


Regards,


Sachin


Thank you so much, it worked as expected.


Surendra Raika1
Kilo Guru

Well this error of array size is something very interesting .. still trying to figure out what exactly happened..



Meanwhile you can try something like this ...




var array =[];


var group = 'b85d44954a3623120004689b2d5dd60a';//group sys_id


var externEmployee = new GlideRecord('sys_user');//you may use you custom form


var sysUser = externEmployee.addJoinQuery('sys_user_grmember');


sysUser.addCondition('group','b85d44954a3623120004689b2d5dd60a');


//you may add more conditions


externEmployee.query();


// Iterate and output results




gs.addInfoMessage(externEmployee.getRowCount());


while(externEmployee._next()){


array.push(externEmployee.sys_id.toString());  


}


var member = array.toString();


gs.addInfoMessage(member);//all the users which already have that group , array size will be relatively less




var externEmpRel = new GlideRecord('sys_user');


externEmpRel.addQuery('sys_id','NOT IN',member);


externEmpRel.query();


gs.addInfoMessage(externEmpRel.getRowCount());


//gs.addInfoMessage(externEmpRel.getRowCount()+externEmployee.getRowCount());


while (externEmpRel._next()) {


var temp = new GlideRecord('sys_user_grmember');


temp.initialize();


temp.user=externEmpRel.sys_id.toString();


temp.group=group.toString();


temp.insert();


}