function healPermissionGroup(SharingTableFlag $flag)
 {
     if ($flag->getObjectId() > 0) {
         try {
             $obj = Objects::findObject($flag->getObjectId());
             if (!$obj instanceof ContentDataObject) {
                 $flag->delete();
                 // if object does not exists then delete the flag
                 return;
             }
             DB::beginWork();
             // update sharing table
             $obj->addToSharingTable();
             DB::commit();
         } catch (Exception $e) {
             DB::rollback();
             Logger::log("Failed to heal object permissions for object " . $flag->getObjectId() . " (flag_id = " . $flag->getId() . ")");
             return false;
         }
         // delete flag
         $flag->delete();
         return true;
     } else {
         // heal
         $controller = new SharingTableController();
         $permissions_string = $flag->getPermissionString();
         $permission_group_id = $flag->getPermissionGroupId();
         $permissions = json_decode($permissions_string);
         if ($flag->getMemberId() > 0) {
             foreach ($permissions as $p) {
                 if (!isset($p->m)) {
                     $p->m = $flag->getMemberId();
                 }
             }
         }
         try {
             DB::beginWork();
             // update sharing table
             $controller->afterPermissionChanged($permission_group_id, $permissions);
             DB::commit();
         } catch (Exception $e) {
             DB::rollback();
             Logger::log("Failed to heal permission group {$permission_group_id} (flag_id = " . $flag->getId() . ")\n" . $e->getTraceAsString());
             return false;
         }
         // delete flag
         $flag->delete();
         return true;
     }
 }
     $result = save_member_permissions($member, $permissions, true, false, false, false);
     if ($old_parent_id != -1 && $old_parent_id != $member->getParentMemberId()) {
         do_member_parent_changed_refresh_object_permisssions($member_id, $old_parent_id);
     }
     DB::commit();
 } catch (Exception $e) {
     DB::rollback();
     Logger::log("Error saving permissions (1): " . $e->getMessage() . "\n" . $e->getTraceAsString());
 }
 $changed_pgs = array_var($result, 'changed_pgs');
 if (is_array($changed_pgs)) {
     foreach ($changed_pgs as $pg_id) {
         try {
             // create flag for this $pg_id
             DB::beginWork();
             $flag = new SharingTableFlag();
             $flag->setPermissionGroupId($pg_id);
             $flag->setMemberId($member->getId());
             $flag->setPermissionString($permissions);
             $flag->setExecutionDate(DateTimeValueLib::now());
             $flag->setCreatedById(logged_user()->getId());
             $flag->save();
             DB::commit();
         } catch (Exception $e) {
             DB::rollback();
             Logger::log("Error saving permissions (2): " . $e->getMessage() . "\n" . $e->getTraceAsString());
         }
     }
 }
 $flags_to_delete = array();
 // transactions to update_sharing table