Пример #1
0
        static public IRecord CombineRecords(IRecord currentRecord, IRecord nextRecord, String idsToMerge, String fieldInsertBefore)
        {
            var existingFields = currentRecord.GetVariableFields();
            var fieldsToMove   = new List <IVariableField>();

            // temporarily remove some existing fields
            foreach (var field in existingFields)
            {
                if (field.Tag.Contains(fieldInsertBefore))
                {
                    fieldsToMove.Add(field);
                    currentRecord.RemoveVariableField(field);
                }
            }
            var fields = nextRecord.GetVariableFields();

            foreach (var field in fields)
            {
                if (field.Tag.Contains(idsToMerge))
                {
                    currentRecord.AddVariableField(field);
                }
            }
            // now add back the temporarily removed fields
            foreach (var field in fieldsToMove)
            {
                currentRecord.AddVariableField(field);
            }
            return(currentRecord);
        }
Пример #2
0
        public IRecord GetAsRecord(bool permissive, bool toUtf8, String combinePartials, String defaultEncoding)
        {
            var bais = new MemoryStream(rawRecordData);
            MarcPermissiveStreamReader reader = new MarcPermissiveStreamReader(bais, permissive, toUtf8, defaultEncoding);
            IRecord next = null;

            if (reader.MoveNext())
            {
                next = reader.Current;
            }
            if (combinePartials != null)
            {
                while (reader.MoveNext())
                {
                    var nextNext  = reader.Current;
                    var fieldsAll = nextNext.GetVariableFields();
                    var fieldIter = fieldsAll.GetEnumerator();
                    while (fieldIter.MoveNext())
                    {
                        var vf = fieldIter.Current;
                        if (combinePartials.Contains(vf.Tag))
                        {
                            next.AddVariableField(vf);
                        }
                    }
                }
            }
            return(next);
        }
Пример #3
0
        static public IRecord CombineRecords(IRecord currentRecord, IRecord nextRecord, String idsToMerge)
        {
            var fields = nextRecord.GetVariableFields();

            foreach (var field in fields)
            {
                if (field.Tag.Contains(idsToMerge))
                {
                    currentRecord.AddVariableField(field);
                }
            }
            return(currentRecord);
        }
Пример #4
0
        private void ParseRecord(IRecord record, byte[] byteArray, byte[] recordBuf, int recordLength)
        {
            ILeader ldr;

            ldr = factory.NewLeader();
            ldr.RecordLength = recordLength;
            int directoryLength = 0;

            try
            {
                ParseLeader(ldr, byteArray);
                directoryLength = ldr.BaseAddressOfData - (24 + 1);
            }
            catch (IOException e)
            {
                throw new MarcException("error parsing leader with data: "
                                        + byteArray.ConvertToString(), e);
            }
            catch (MarcException e)
            {
                throw new MarcException("error parsing leader with data: "
                                        + byteArray.ConvertToString(), e);
            }

            // if MARC 21 then check encoding
            switch (ldr.CharCodingScheme)
            {
            case ' ':
                if (!isOverride)
                {
                    encoding = "ISO-8859-1";
                }
                break;

            case 'a':
                if (!isOverride)
                {
                    encoding = "UTF-8";
                }
                break;
            }
            record.Leader = ldr;

            if ((directoryLength % 12) != 0)
            {
                throw new MarcException("invalid directory");
            }
            using (var inputrec = new InputStream(recordBuf))
            {
                int size = directoryLength / 12;

                String[] tags    = new String[size];
                int[]    lengths = new int[size];

                byte[] tag    = new byte[3];
                byte[] length = new byte[4];
                byte[] start  = new byte[5];

                String tmp;

                try
                {
                    for (int i = 0; i < size; i++)
                    {
                        inputrec.Read(tag);
                        tmp     = tag.ConvertToString();
                        tags[i] = tmp;

                        inputrec.Read(length);
                        tmp        = length.ConvertToString();
                        lengths[i] = int.Parse(tmp);

                        inputrec.Read(start);
                    }

                    if (inputrec.ReadByte() != Constants.FT)
                    {
                        throw new MarcException("expected field terminator at end of directory");
                    }

                    for (int i = 0; i < size; i++)
                    {
                        GetFieldLength(inputrec);
                        if (Verifier.IsControlField(tags[i]))
                        {
                            byteArray = new byte[lengths[i] - 1];
                            inputrec.Read(byteArray);

                            if (inputrec.ReadByte() != Constants.FT)
                            {
                                throw new MarcException("expected field terminator at end of field");
                            }

                            var field = factory.NewControlField();
                            field.Tag  = tags[i];
                            field.Data = GetDataAsString(byteArray);
                            record.AddVariableField(field);
                        }
                        else
                        {
                            byteArray = new byte[lengths[i]];
                            inputrec.Read(byteArray);

                            try
                            {
                                record.AddVariableField(ParseDataField(tags[i], byteArray));
                            }
                            catch (Exception e)
                            {
                                throw new MarcException(
                                          "error parsing data field for tag: " + tags[i]
                                          + " with data: "
                                          + byteArray.ConvertToString(), e);
                            }
                        }
                    }

                    if (inputrec.ReadByte() != Constants.RT)
                    {
                        throw new MarcException("expected record terminator");
                    }
                }
                catch (IOException e)
                {
                    throw new MarcException("an error occured reading input", e);
                }
            }
        }