/// <summary>
        /// Adds the link to table information link definition.
        /// </summary>
        /// <param name="tableInfo">
        /// The table information.
        /// </param>
        /// <param name="linkDefArray">
        /// The link definition array.
        /// </param>
        private void AddLink(TableInfo tableInfo, JArray linkDefArray)
        {
            var sourceFieldId = -1;
            var destFieldId   = -1;
            int linkFlag;

            if (linkDefArray.Count > 4)
            {
                sourceFieldId = JObjectExtensions.ToInt(linkDefArray[4]);
                destFieldId   = JObjectExtensions.ToInt(linkDefArray[5]);
            }
            else
            {
                sourceFieldId = -1;
                destFieldId   = -1;
            }

            if (linkDefArray.Count > 7)
            {
                linkFlag = JObjectExtensions.ToInt(linkDefArray[7]);
            }
            else
            {
                linkFlag = 0;
            }

            var arr = linkDefArray.Count > 6 ? linkDefArray[6] as JArray : null;

            if (arr == null)
            {
                return;
            }

            var linkFieldCount          = arr.Count;
            var sourceFieldIds          = new int[linkFieldCount];
            var destinationFieldIds     = new int[linkFieldCount];
            var sourceValuesBuffer      = new string[linkFieldCount];
            var destinationValuesBuffer = new string[linkFieldCount];

            for (var i = 0; i < arr.Count; i++)
            {
                var fieldArray = arr[i] as JArray;
                sourceFieldIds[i]      = JObjectExtensions.ToInt(fieldArray?[0]);
                destinationFieldIds[i] = JObjectExtensions.ToInt(fieldArray?[1]);
                if (fieldArray.Count > 2)
                {
                    var sourceValue = fieldArray[2];
                    var destValue   = fieldArray[3];

                    sourceValuesBuffer[i]      = (string)sourceValue;
                    destinationValuesBuffer[i] = (string)destValue;
                }
                else
                {
                    sourceValuesBuffer[i]      = null;
                    destinationValuesBuffer[i] = null;
                }
            }

            var linkInfo = new LinkInfo(
                tableInfo.InfoAreaId,
                (string)linkDefArray[0],
                JObjectExtensions.ToInt(linkDefArray[1]),
                JObjectExtensions.ToInt(linkDefArray[2]),
                LinkInfo.ToLinkType((string)linkDefArray[3]),
                sourceFieldId,
                destFieldId,
                linkFieldCount,
                sourceFieldIds,
                destinationFieldIds,
                linkFlag,
                sourceValuesBuffer,
                destinationValuesBuffer);

            tableInfo.AddLinkInfoWithOwnership(linkInfo);
        }