Ejemplo n.º 1
0
        /// <summary>
        ///   allocates and initialize inner object according to the found xml data
        /// </summary>
        private bool InitInnerObjects(XmlParser parser, String foundTagName)
        {
            if (foundTagName == null)
            {
                return(false);
            }

            switch (foundTagName)
            {
            case XMLConstants.MG_TAG_FLDH:
                FldsTab = new RCFieldsTable();
                FldsTab.fillData();
                break;

            case ConstInterface.MG_ATTR_KEY:
            {
                var current = new Key(this);
                current.FillData();
                _keys.Add(current);
                break;
            }

            case ConstInterface.MG_TAG_RECORDS:
                parser.setCurrIndex(
                    parser.getXMLdata().IndexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
                //end of outer tad and its ">"
                break;

            case ConstInterface.MG_TAG_RECORDS_END:
                parser.setCurrIndex2EndOfTag();
                break;

            case ConstInterface.MG_TAG_CACHED_TABLE_END:
                parser.setCurrIndex2EndOfTag();
                return(false);

            case ConstInterface.MG_TAG_REC:
            {
                var current = new Record(this);
                current.fillData();
                _records.Add(current);
                break;
            }
            }
            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///   build XML string for the records
        /// </summary>
        /// <param name = "fieldsTab">the fields table for the records table
        /// </param>
        /// <param name = "message">to build, add parts
        ///   <param name = "skipCurrRec">Skip current record
        ///     <param name = "currRecId">Current record ID
        ///     </param>
        protected internal void buildXML(FieldsTable fieldsTab, StringBuilder message, bool skipCurrRec, int currRecId)
        {
            Record rec, prevRec, orgPrevRec;
            int    recIdx = REC_NOT_FOUND;

            for (int i = 0; i < _records.Count; i++)
            {
                // In case the previous record is not known to the server (OP_INSERT'ed) and is to be
                // dumped only after this record (it's idx is greater then 'i'), then temporary change
                // my prev record so the server won't get confused.
                rec = _records[i];

                if (!rec.SendToServer || (skipCurrRec && rec.getId() == currRecId))
                {
                    continue;
                }

                prevRec = orgPrevRec = rec.getPrevRec();
                // QCR #505277: The previous record may be unknown to the server but not in
                // the modified list yet. Therefore, if the previous record was not found
                // in that list then do another iteration of the loop.
                while (prevRec != null && (prevRec.getMode() == DataModificationTypes.Insert || !prevRec.SendToServer) &&
                       rec.getMode() == DataModificationTypes.Insert &&
                       ((recIdx = getRecIdx(prevRec.getId())) > i || recIdx == REC_NOT_FOUND || !prevRec.SendToServer))
                {
                    prevRec = prevRec.getPrevRec();
                    rec.setPrevRec(prevRec);
                }
                rec.buildXML(message, false);

                if (prevRec != orgPrevRec)
                {
                    rec.setPrevRec(orgPrevRec);
                }
            }
        }