示例#1
0
        /// <summary>
        /// Initialize connection string parsing string in "key1=value1;key2=value2;...." format or only "filename" as default (when no ; char found)
        /// </summary>
        public ConnectionString(string connectionString)
            : this()
        {
            if (string.IsNullOrEmpty(connectionString))
            {
                throw new ArgumentNullException(nameof(connectionString));
            }

            // create a dictionary from string name=value collection
            if (connectionString.Contains("="))
            {
                _values.ParseKeyValue(connectionString);
            }
            else
            {
                _values["filename"] = connectionString;
            }

            // setting values to properties
            this.Connection = _values.GetValue("connection", this.Connection);
            this.Filename   = _values.GetValue("filename", this.Filename).Trim();

            this.Password    = _values.GetValue("password", this.Password);
            this.InitialSize = _values.GetFileSize(@"initial size", this.InitialSize);
            this.ReadOnly    = _values.GetValue("readonly", this.ReadOnly);

            this.Upgrade = _values.GetValue("upgrade", this.Upgrade);
        }
示例#2
0
    private void SetUI(GameObject button, int index)
    {
        DisplayButton displayButton = button.GetComponent <DisplayButton>();
        UpgradeOption upgradeOption = upgradeManager.GetUpgradeOptions()[index];

        displayButton.InitializeButton(upgradeOption.displayName, upgradeOption.icon, upgradeOption.dataCost, dataCostIcon, dataCostIconColor);
    }
示例#3
0
    void AdvanceLevel(int newLevel)
    {
        charLevel = newLevel;
        Map.Game.Log($"<#448622>You are now level {charLevel}!</color>");

        health.Hitpoints = health.MaxHitpoints;

        // present some advancement options
        // let's try this decision panel thing
        upgradesOnDeck.Enqueue(UpgradeOption.GenerateUpgradeOptions(this, newLevel));
    }
示例#4
0
        /// <summary>
        /// Fill current database with data inside file reader - run inside a transacion
        /// </summary>
        internal void RebuildContent(IFileReader reader, UpgradeOption upgrade = UpgradeOption.True)
        {
            // begin transaction and get TransactionID
            var transaction = _monitor.GetTransaction(true, false, out _);

            try
            {
                foreach (var collection in reader.GetCollections())
                {
                    if (upgrade != UpgradeOption.DataOnly)
                    {
                        // first create all user indexes (exclude _id index)
                        foreach (var index in reader.GetIndexes(collection))
                        {
                            this.EnsureIndex(collection,
                                             index.Name,
                                             BsonExpression.Create(index.Expression),
                                             index.Unique);
                        }
                    }

                    // get all documents from current collection
                    var docs = reader.GetDocuments(collection);

                    // get snapshot, indexer and data services
                    var snapshot = transaction.CreateSnapshot(LockMode.Write, collection, true);
                    var indexer  = new IndexService(snapshot, _header.Pragmas.Collation);
                    var data     = new DataService(snapshot);

                    // insert one-by-one
                    foreach (var doc in docs)
                    {
                        transaction.Safepoint();

                        this.InsertDocument(snapshot, doc, BsonAutoId.ObjectId, indexer, data);
                    }
                }

                transaction.Commit();
            }
            catch (Exception)
            {
                _walIndex.Clear();

                throw;
            }
            finally
            {
                _monitor.ReleaseTransaction(transaction);
            }
        }
示例#5
0
        /// <summary>
        /// Upgrade old version of LiteDB into new LiteDB file structure. Returns true if database was completed converted
        /// If database already in current version just return false
        /// </summary>
        public static bool Upgrade(string filename, string password = null, UpgradeOption upgrade = UpgradeOption.True)
        {
            if (filename.IsNullOrWhiteSpace())
            {
                throw new ArgumentNullException(nameof(filename));
            }
            if (!File.Exists(filename))
            {
                return(false);
            }

            var settings = new EngineSettings
            {
                Filename = filename,
                Password = password
            };

            var backup = FileHelper.GetSufixFile(filename, "-backup", true);

            settings.Filename = FileHelper.GetSufixFile(filename, "-temp", true);

            var         buffer = new byte[PAGE_SIZE * 2];
            IFileReader reader;

            using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                // read first 16k
                stream.Read(buffer, 0, buffer.Length);

                // checks if v8 plain data or encrypted (first byte = 1)
                if ((Encoding.UTF8.GetString(buffer, HeaderPage.P_HEADER_INFO, HeaderPage.HEADER_INFO.Length) == HeaderPage.HEADER_INFO &&
                     buffer[HeaderPage.P_FILE_VERSION] == HeaderPage.FILE_VERSION) ||
                    buffer[0] == 1)
                {
                    return(false);
                }

                // checks if v7 (plain or encrypted)
                if (Encoding.UTF8.GetString(buffer, 25, HeaderPage.HEADER_INFO.Length) == HeaderPage.HEADER_INFO &&
                    buffer[52] == 7)
                {
                    reader = new FileReaderV7(stream, password);
                }
                else
                {
                    throw new LiteException(0, "Invalid data file format to upgrade");
                }

                using (var engine = new LiteEngine(settings))
                {
                    // copy all database to new Log file with NO checkpoint during all rebuild
                    engine.Pragma(Pragmas.CHECKPOINT, 0);

                    engine.RebuildContent(reader, upgrade);

                    // after rebuild, copy log bytes into data file
                    engine.Checkpoint();
                }
            }

            // rename source filename to backup name
            File.Move(filename, backup);

            // rename temp file into filename
            File.Move(settings.Filename, filename);

            return(true);
        }