Пример #1
0
        static void AnalyzeYear
        (
            int year
        )
        {
            string expression = string.Format("RD={0}$", year.ToInvariantString());

            int[]             found   = connection.Search(expression);
            List <MarcRecord> records = new BatchRecordReader
                                        (
                connection,
                connection.Database,
                500,
                true,
                found
                                        )
                                        .ReadAll(true);

            foreach (MarcRecord record in records)
            {
                ReaderInfo reader = ReaderInfo.Parse(record);

                DateTime registrationDate = reader.RegistrationDate;
                DateTime lastVisitDate    = reader.LastVisitDate;
                if (lastVisitDate == DateTime.MinValue)
                {
                    lastVisitDate = reader.LastRegistrationDate;
                }
                if (lastVisitDate == DateTime.MinValue)
                {
                    if (!ReferenceEquals(reader.Enrollment, null) &&
                        reader.Enrollment.Length != 0)
                    {
                        lastVisitDate = reader.Enrollment.Max(e => e.Date);
                    }
                }
                if (lastVisitDate == DateTime.MinValue)
                {
                    lastVisitDate = registrationDate;
                }
                int visitDays = (int)(lastVisitDate - registrationDate).TotalDays;
                if (visitDays == 0)
                {
                    visitDays = 1;
                }
                int    visits = reader.Visits.Length;
                double rate   = (double)visits / visitDays;
                Console.WriteLine
                (
                    "{0}\t{1}\t{2}\t{3}\t{4}\t{5:F3}",
                    reader.Ticket,
                    registrationDate.ToShortDateString(),
                    visitDays,
                    reader.LastVisitDate.ToShortDateString(),
                    visits,
                    rate
                );
            }
        }
Пример #2
0
        private static void ProcessOneDatabase
        (
            [NotNull] string inputFileName
        )
        {
            using (DirectAccess64 accessor
                       = new DirectAccess64(inputFileName, DirectAccessMode.ReadOnly))
            {
                int maxMfn = accessor.GetMaxMfn();
                Console.WriteLine("{0}: Max MFN={1}", inputFileName, maxMfn);

                for (int mfn = 1; mfn < maxMfn; mfn++)
                {
                    if (mfn % 100 == 1)
                    {
                        Console.Write(" {0} ", mfn - 1);
                    }

                    try
                    {
                        MarcRecord record = accessor.ReadRecord(mfn);
                        if (!ReferenceEquals(record, null))
                        {
                            ReaderInfo readerInfo = ReaderInfo.Parse(record);
                            string     ticket     = readerInfo.Ticket;
                            if (string.IsNullOrEmpty(ticket))
                            {
                                continue;
                            }

                            DepersonalizedReader depersonalized;
                            if (readers.TryGetValue(ticket, out depersonalized))
                            {
                                depersonalized.AddVisits(readerInfo.Visits);
                            }
                            else
                            {
                                depersonalized = DepersonalizedReader
                                                 .FromReaderInfo(readerInfo);
                                readers.Add(ticket, depersonalized);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine();
                        Console.WriteLine("MFN {0}: {1}", mfn, exception.Message);
                    }
                }
            }

            Console.WriteLine("Total: {0}", readers.Count);
            Console.WriteLine("Memory: {0}", Process.GetCurrentProcess().WorkingSet64);
        }
Пример #3
0
        private void ParseAndAddReader
        (
            MarcRecord record
        )
        {
            ReaderInfo reader = ReaderInfo.Parse(record);
            string     status = reader.Status;

            if (string.IsNullOrEmpty(status))
            {
                reader.Status = "0";
                status        = "0";
            }
            Readers.Add(reader);
            ReadersByStatus.Add(status, reader);
        }
Пример #4
0
        private ReaderInfo _ParseReader
        (
            [CanBeNull] MarcRecord record
        )
        {
            if (!ReferenceEquals(record, null))
            {
                ReaderInfo result = ReaderInfo.Parse(record);

                string status = result.Status;
                if (string.IsNullOrEmpty(status))
                {
                    result.Status = "0";
                }

                return(result);
            }

            return(null);
        }
Пример #5
0
 /// <summary>
 /// Загрузка сведений о читателе.
 /// </summary>
 /// <param name="readerID"></param>
 /// <returns></returns>
 public ReaderInfo ReadReader(string readerID)
 {
     try
     {
         Client.PushDatabase(ReaderDatabase);
         int[] found = Client.Search(string.Format
                                     (
                                         "I={0}",
                                         readerID
                                     ));
         if (found.Length == 0)
         {
             return(null);
         }
         IrbisRecord record = Client.ReadRecord(found[0]);
         ReaderInfo  result = ReaderInfo.Parse(record);
         return(result);
     }
     finally
     {
         Client.PopDatabase();
     }
 }
Пример #6
0
        static void Main()
        {
            Console.CancelKeyPress += Console_CancelKeyPress;

            try
            {
                using (connection = new IrbisConnection())
                {
                    connection.ParseConnectionString(ConnectionString);
                    connection.Connect();
                    connection.Database = DatabaseName;
                    Console.WriteLine("Подключились");

                    IEnumerable <MarcRecord> records
                        = BatchRecordReader.WholeDatabase
                          (
                              connection,
                              DatabaseName,
                              500
                              //, rdr =>
                              //{
                              //    Console.WriteLine
                              //        (
                              //            "{0} из {1}",
                              //            rdr.RecordsRead,
                              //            rdr.TotalRecords
                              //        );
                              //}
                          );

                    foreach (MarcRecord record in records)
                    {
                        if (Cancel)
                        {
                            break;
                        }

                        if (record.Deleted)
                        {
                            continue;
                        }

                        ReaderInfo reader = ReaderInfo.Parse(record);
                        if (reader.WorkPlace.SafeContains("ИОГУНБ"))
                        {
                            continue;
                        }

                        int age    = reader.Age;
                        int visits = reader.Visits.Count(v => v.IsVisit);

                        if (reader.Gender.SameString("ж"))
                        {
                            FemaleCount++;
                            FemaleAge.Increment(age);
                            FemaleVisits.Augment(age, visits);
                        }
                        else
                        {
                            MaleCount++;
                            MaleAge.Increment(age);
                            MaleVisits.Augment(age, visits);
                        }
                    }
                }
                Console.WriteLine("Отключились");

                Console.WriteLine(";Муж;Жен;М пос;Ж пос");
                Console.WriteLine
                (
                    "Всего;{0};{1};{2};{3}",
                    MaleCount,
                    FemaleCount,
                    MaleVisits.Total,
                    FemaleVisits.Total
                );
                for (int age = 12; age < 100; age++)
                {
                    Console.WriteLine
                    (
                        "{0};{1};{2};{3};{4}",
                        age,
                        MaleAge.GetValue(age),
                        FemaleAge.GetValue(age),
                        MaleVisits.GetValue(age),
                        FemaleVisits.GetValue(age)
                    );
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
Пример #7
0
        static void Main()
        {
            try
            {
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                Threshold = new DateTime(DateTime.Today.Year, 1, 1);

                string thresholdString = CM.AppSettings["threshold"];

                if (!string.IsNullOrEmpty(thresholdString))
                {
                    Threshold = DateTime.Parse(thresholdString);
                }

                TailDb = CM.AppSettings["tail-db"];

                int total   = 0;
                int cropped = 0;

                string connectionString = CM.AppSettings["connection-string"];
                using (IrbisConnection connection
                           = new IrbisConnection(connectionString))
                {
                    int[] mfns = connection.Search
                                 (
                        "RI=$"
                                 );

                    const int delta = 1000;

                    for (int i = 0; i < mfns.Length; i += delta)
                    {
                        int[] sub = mfns
                                    .Skip(i)
                                    .Take(delta)
                                    .ToArray();

                        MarcRecord[] records = connection.ReadRecords
                                               (
                            connection.Database,
                            sub
                                               );

                        foreach (MarcRecord record in records)
                        {
                            if (record.Deleted)
                            {
                                continue;
                            }

                            total++;

                            Console.WriteLine("ELAPSED: {0}", FormatSpan(stopwatch.Elapsed));
                            ReaderInfo reader = ReaderInfo.Parse(record);
                            Console.WriteLine(reader);

                            VisitInfo[] visits = record
                                                 .Fields
                                                 .GetField(40)
                                                 .Select(VisitInfo.Parse)
                                                 .Where(loan => loan.IsVisit ||
                                                        loan.IsReturned)
                                                 .ToArray();

                            VisitInfo[] old = visits
                                              .Where(visit => visit.DateGiven < Threshold)
                                              .ToArray();

                            Console.WriteLine("VISITS TOTAL:     {0}", visits.Length);
                            Console.WriteLine("VISITS TO DELETE: {0}", old.Length);

                            if (old.Length != 0)
                            {
                                if (!string.IsNullOrEmpty(TailDb))
                                {
                                    connection.PushDatabase(TailDb);
                                    int[] tailMfns = new int[0];
                                    try
                                    {
                                        tailMfns = connection.Search("\"RI={0}\"", reader.Ticket);
                                    }
                                    catch (Exception ex)
                                    {
                                        Debug.WriteLine(ex);
                                    }
                                    MarcRecord copy;
                                    if (tailMfns.Length != 0)
                                    {
                                        copy = connection.ReadRecord(tailMfns[0]);
                                        Console.WriteLine("USING OLD RECORD {0}", tailMfns[0]);
                                    }
                                    else
                                    {
                                        copy = new MarcRecord();
                                        RecordField[] non40 = record
                                                              .Fields
                                                              .Where(field => field.Tag != 40)
                                                              .ToArray();
                                        copy.Fields.AddRange(non40);
                                        Console.WriteLine("COPY CREATED");
                                    }

                                    RecordField[] old40 = old.Select(loan => loan.Field).ToArray();
                                    copy.Fields.AddRange(old40);

                                    try
                                    {
                                        connection.WriteRecord(copy, false, true);
                                    }
                                    catch (Exception ex)
                                    {
                                        Console.WriteLine("CAN'T WRITE COPY, SKIP");
                                        Debug.WriteLine(ex);
                                        continue;
                                    }
                                    finally
                                    {
                                        connection.PopDatabase();
                                    }

                                    Console.WriteLine("COPY WRITTEN");
                                }

                                MarcRecord r2;
                                try
                                {
                                    r2 = connection.ReadRecord(record.Mfn);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("CAN'T REREAD RECORD, SKIP");
                                    Debug.WriteLine(ex);
                                    continue;
                                }

                                RecordField[] toDelete = r2
                                                         .Fields
                                                         .GetField(40)
                                                         .Select(VisitInfo.Parse)
                                                         .Where(loan => loan.IsVisit || loan.IsReturned)
                                                         .Where(visit => visit.DateGiven < Threshold)
                                                         .Select(visit => visit.Field)
                                                         .ToArray();

                                foreach (RecordField field in toDelete)
                                {
                                    r2.Fields.Remove(field);
                                }

                                try
                                {
                                    connection.WriteRecord(r2, false, true);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("CAN'T WRITE MODIFIED RECORD, SKIP");
                                    Debug.WriteLine(ex);
                                    continue;
                                }

                                Console.WriteLine("RECORD WRITTEN");

                                cropped++;
                            }

                            Console.WriteLine(new string('=', 60));
                        }
                    }
                }

                stopwatch.Stop();

                Console.WriteLine("TOTAL={0}", total);
                Console.WriteLine("CROPPED={0}", cropped);
                Console.WriteLine("ELAPSED={0}", FormatSpan(stopwatch.Elapsed));
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
Пример #8
0
        static void Main()
        {
            Console.WriteLine(new string('=', 80));
            Console.WriteLine("Start: {0}", DateTime.Now);
            deadline = DateTime.Today.AddDays(-1.0);

            try
            {
                string baseUri          = CM.AppSettings["baseUri"];
                string apiID            = CM.AppSettings["apiID"];
                string apiKey           = CM.AppSettings["apiKey"];
                string connectionString = CM.AppSettings["connectionString"];
                string messageText      = CM.AppSettings["message"];

                client = new OsmiCardsClient
                         (
                    baseUri,
                    apiID,
                    apiKey
                         );

                Console.WriteLine("PING:");
                JObject ping = client.Ping();
                Console.WriteLine(ping);

                string[] cards = client.GetCardList();
                Console.Write("CARDS: {0}", cards.Length);

                List <string> recipients = new List <string>();
                using (connection = new IrbisConnection(connectionString))
                {
                    IEnumerable <MarcRecord> batch = BatchRecordReader.Search
                                                     (
                        connection,
                        "RDR",
                        "RB=$",
                        1000
                                                     );

                    foreach (MarcRecord record in batch)
                    {
                        ReaderInfo reader = ReaderInfo.Parse(record);
                        string     ticket = reader.Ticket;
                        if (!ticket.OneOf(cards))
                        {
                            continue;
                        }
                        VisitInfo[] outdated = reader.Visits
                                               .Where(v => !v.IsVisit)
                                               .Where(v => !v.IsReturned)
                                               .Where(v => v.DateExpected < deadline)
                                               .ToArray();
                        if (outdated.Length != 0)
                        {
                            Console.WriteLine
                            (
                                "[{0}] {1}: {2} book(s)",
                                reader.Ticket,
                                reader.FullName,
                                outdated.Length
                            );
                            recipients.Add(reader.Ticket);
                        }
                    }
                }

                Console.WriteLine();
                Console.WriteLine("Total recipient(s): {0}", recipients.Count);

                if (recipients.Count != 0)
                {
                    client.SendPushMessage
                    (
                        recipients.ToArray(),
                        messageText
                    );
                    Console.WriteLine("Send OK");
                }

                Console.WriteLine("Finish: {0}", DateTime.Now);
                Console.WriteLine(new string('=', 80));
                Console.WriteLine();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
Пример #9
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("Need two arguments");
                return;
            }

            string inputFileName  = args[0];
            string outputFileName = args[1];

            try
            {
                // Сначала прочитаем уже имеющиеся записи
                if (File.Exists(outputFileName))
                {
                    using (StreamReader stringReader = File.OpenText(outputFileName))
                    {
                        MarcRecord marcRecord;
                        while ((marcRecord = PlainText.ReadRecord(stringReader)) != null)
                        {
                            ReaderInfo           readerInfo = ReaderInfo.Parse(marcRecord);
                            DepersonalizedReader depersonalized
                                = DepersonalizedReader.FromReaderInfo(readerInfo);
                            string ticket = depersonalized.Ticket.ThrowIfNull();
                            readers.Add(ticket, depersonalized);
                        }
                    }
                }

                // Теперь будем вычитывать данные и объединять их с уже имеющимися
                string ext = Path.GetExtension(inputFileName);
                if (ext.SameString(".mst"))
                {
                    ProcessOneDatabase(inputFileName);
                }
                else
                {
                    string[] inputFiles = File.ReadAllLines(inputFileName);
                    foreach (string inputFile in inputFiles)
                    {
                        ProcessOneDatabase(inputFile);
                    }
                }

                // Сохраняем результат
                Console.WriteLine("Writing ");
                using (StreamWriter writer = File.CreateText(outputFileName))
                {
                    var allReaders = readers.Values;
                    foreach (DepersonalizedReader reader in allReaders)
                    {
                        MarcRecord record = reader.ToMarcRecord();
                        PlainText.WriteRecord(writer, record);
                    }
                }

                Console.WriteLine("DONE");
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }