/// <summary>
        /// Add journal entries from the supplied XML to the database.
        /// </summary>
        /// <param name="corc"></param>
        /// <param name="fileXML"></param>
        /// <returns>The number of rows added to the journal table.</returns>
        private int UpdateJournalFromXML(CharOrCorp corc, XmlDocument fileXML, short walletID)
        {
            int retVal = 0;
            int updatedEntries = 0;
            EMMADataSet.JournalDataTable journalData = new EMMADataSet.JournalDataTable();
            long highestIDSoFar = _apiSettings.GetHighestID(corc, APIDataType.Journal);
            long oldHighestID = _apiSettings.GetHighestID(corc, APIDataType.Journal);
            DateTime dataDate = DateTime.UtcNow;

            try
            {
                XmlNodeList journEntries = null;
                XmlDocument xml = new XmlDocument();

                UpdateStatus(0, 1, "Getting journal entries from file", "", false);
                journEntries = EveAPI.GetResults(fileXML);
                dataDate = EveAPI.GetDataTime(fileXML);
                UpdateStatus(1, 1, "", journEntries.Count + " entries found in file.", false);

                if (journEntries != null && journEntries.Count > 0)
                {
                    // Offset will always be the same since CCP switched over to 64 bit IDs
                    // (At least until we break the 64bit limit... As of mid 2010, we're using
                    // around 2 billion IDs a year so breaking the 64 bit limit will take around
                    // 9 billion years... Don't think it will be a problem :))
                    long offset = 2591720933;
                    int batchPrg = 0;

                    UpdateStatus(0, journEntries.Count, "Processing entries", "", false);

                    // Loop through the results returned from this call to the API and add the line
                    // to the data table.
                    foreach (XmlNode journEntry in journEntries)
                    {
                        bool tryUpdate = false;
                        long id = long.Parse(journEntry.SelectSingleNode("@refID").Value) + offset;
                        long recieverID = 0;
                        if (corc == CharOrCorp.Corp)
                        {
                            // This is a special case.
                            // When bounty prizes are received by the player, corp tax is applied.
                            // This corp tax does not appear as a seperate journal entry for the
                            // character. It is specified by the taxReceiverID and taxAmount fields
                            // on the bounty prize entry itself in the XML.
                            // On the corp side, there is a specifc entry for the tax but it has
                            // the same journalentryID and ownerID2 as the character entry.
                            // This means that EMMA does not differentiate between them and the
                            // corp tax part is lost.
                            // In order to resolve this we simply set receiver ID to be the corp
                            // instead of character in these cases.
                            // Note that 'BuildJournalEntry' has similar processing.
                            if (int.Parse(journEntry.SelectSingleNode("@refTypeID").Value) == 85)
                            {
                                recieverID = _corpID;
                            }
                        }
                        if (recieverID == 0)
                        {
                            recieverID = long.Parse(journEntry.SelectSingleNode("@ownerID2").Value);
                        }

                        //if (id - offset > oldHighestID)
                        //{
                        if (id - offset > highestIDSoFar) { highestIDSoFar = id - offset; }
                        if (Journal.EntryExists(journalData, id, recieverID))
                        {
                            tryUpdate = true;
                        }
                        else
                        {
                            EMMADataSet.JournalRow tmpRow = journalData.FindByIDRecieverID(id, recieverID);
                            if (tmpRow == null)
                            {
                                EMMADataSet.JournalRow newRow =
                                    BuildJournalEntry(journalData, journEntry, offset, walletID, corc);

                                journalData.AddJournalRow(newRow);
                                retVal++;

                                // This section searches the character and journal ref type tables
                                // for the values used in this new journal entry.
                                // If they are not present in the tables then they are added.
                                #region Check other tables and add values if needed.
                                SortedList<long, string> entityIDs = new SortedList<long, string>();
                                entityIDs.Add(newRow.SenderID, journEntry.SelectSingleNode("@ownerName1").Value);
                                if (!entityIDs.ContainsKey(newRow.RecieverID))
                                {
                                    entityIDs.Add(newRow.RecieverID, journEntry.SelectSingleNode("@ownerName2").Value);
                                }
                                foreach (KeyValuePair<long, string> checkName in entityIDs)
                                {
                                    Names.AddName(checkName.Key, checkName.Value);
                                }
                                #endregion
                            }
                            else
                            {
                                tryUpdate = true;
                            }
                        }

                        if (tryUpdate)
                        {
                            EMMADataSet.JournalRow newRow =
                                BuildJournalEntry(journalData, journEntry, offset, walletID, corc);
                            EMMADataSet.JournalRow oldRow = journalData.FindByIDRecieverID(newRow.ID,
                                    newRow.RecieverID);
                            bool updated = false;

                            if (oldRow != null)
                            {
                                if ((newRow.RBalance > 0 && oldRow.RBalance == 0) ||
                                    (newRow.RCorpID != 0 && oldRow.RCorpID == 0))
                                {
                                    oldRow.RBalance = newRow.RBalance;
                                    oldRow.RCorpID = newRow.RCorpID;
                                    oldRow.RArgID = newRow.RArgID;
                                    oldRow.RArgName = newRow.RArgName;
                                    oldRow.RWalletID = newRow.RWalletID;
                                    updated = true;
                                }
                                if ((newRow.SBalance > 0 && oldRow.SBalance == 0) ||
                                    (newRow.SCorpID != 0 && oldRow.SCorpID == 0))
                                {
                                    oldRow.SBalance = newRow.SBalance;
                                    oldRow.SCorpID = newRow.SCorpID;
                                    oldRow.SArgID = newRow.SArgID;
                                    oldRow.SArgName = newRow.SArgName;
                                    oldRow.SWalletID = newRow.SWalletID;
                                    updated = true;
                                }
                            }

                            if (updated)
                            {
                                updatedEntries++;
                            }
                        }

                        //}

                        batchPrg++;
                        UpdateStatus(batchPrg, journEntries.Count, "", "", false);
                    }

                    SetHighestID(corc, APIDataType.Journal, highestIDSoFar);
                }

                UpdateStatus(0, 0, retVal + " journal entries added to database.", "", false);
                UpdateStatus(0, 0, updatedEntries + " existing journal entries updated.", "", true);

                if (journalData.Count > 0)
                {
                    Journal.Store(journalData);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log
                    // it by creating a new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when adding journal data", ex);
                }

                SetLastAPIUpdateError(corc, APIDataType.Journal, ex.Message);
                UpdateStatus(-1, 0, "Error", ex.Message, true);
            }

            if (UpdateEvent != null)
            {
                UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Journal,
                    corc == CharOrCorp.Char ? _charID : _corpID,
                    APIUpdateEventType.UpdateCompleted));
            }

            return retVal;
        }
Esempio n. 2
0
        public void LoadOldEmmaXML(string filename, long charID, long corpID)
        {
            EMMADataSet.JournalDataTable table = new EMMADataSet.JournalDataTable();
            XmlDocument xml = new XmlDocument();
            //UpdateStatus(0, 0, "", "Loading file", false);
            xml.Load(filename);

            XmlNodeList nodes = xml.SelectNodes("/DocumentElement/Journal");

            int counter = 0;
            UpdateStatus(0, 0, "", "Extracting data from XML", false);
            foreach (XmlNode node in nodes)
            {
                bool tryUpdate = true;
                long id = long.Parse(node.SelectSingleNode("ID").FirstChild.Value) + 1085796677;
                long recieverID = long.Parse(node.SelectSingleNode("OwnerID2").FirstChild.Value);

                if (!EntryExists(table, id, recieverID))
                {
                    EMMADataSet.JournalRow tmpRow = table.FindByIDRecieverID(id, recieverID);
                    if (tmpRow == null)
                    {
                        EMMADataSet.JournalRow newRow = BuildRow(corpID, node, id, recieverID, table);
                        table.AddJournalRow(newRow);
                        tryUpdate = false;
                    }
                }
                if (tryUpdate)
                {
                    EMMADataSet.JournalRow newRow = BuildRow(corpID, node, id, recieverID, table);
                    EMMADataSet.JournalRow oldRow = table.FindByIDRecieverID(newRow.ID,
                        newRow.RecieverID);

                    if ((newRow.RBalance > 0 && oldRow.RBalance == 0) ||
                        (newRow.RCorpID != 0 && oldRow.RCorpID == 0))
                    {
                        oldRow.RBalance = newRow.RBalance;
                        oldRow.RCorpID = newRow.RCorpID;
                        oldRow.RArgID = newRow.RArgID;
                        oldRow.RArgName = newRow.RArgName;
                        oldRow.RWalletID = newRow.RWalletID;
                    }
                    if ((newRow.SBalance > 0 && oldRow.SBalance == 0) ||
                        (newRow.SCorpID != 0 && oldRow.SCorpID == 0))
                    {
                        oldRow.SBalance = newRow.SBalance;
                        oldRow.SCorpID = newRow.SCorpID;
                        oldRow.SArgID = newRow.SArgID;
                        oldRow.SArgName = newRow.SArgName;
                        oldRow.SWalletID = newRow.SWalletID;
                    }
                }
                counter++;
                UpdateStatus(counter, nodes.Count, "", "", false);

                // If we've got 1000 rows then update the database and move on to the next batch.
                if (table.Count >= 1000)
                {
                    UpdateStatus(0, 0, "", "Updating database", false);
                    lock (tableAdapter)
                    {
                        tableAdapter.Update(table);
                        table.Clear();
                    }
                }
            }

            UpdateStatus(0, 0, "", "Updating database", false);
            lock (tableAdapter)
            {
                tableAdapter.Update(table);
            }
        }