示例#1
0
        public override void Load(Stream stream)
        {
            TestForEditable();
            byte version = stream.ReadNextByte();

            switch (version)
            {
            case 1:
                int cnt = stream.ReadInt32();
                m_databases.Clear();
                while (cnt > 0)
                {
                    cnt--;
                    var database = new ServerDatabaseSettings();
                    database.Load(stream);
                    m_databases.Add(database);
                }
                cnt = stream.ReadInt32();
                m_listeners.Clear();
                while (cnt > 0)
                {
                    cnt--;
                    var listener = new SnapSocketListenerSettings();
                    listener.Load(stream);
                    m_listeners.Add(listener);
                }
                break;

            default:
                throw new VersionNotFoundException("Unknown Version Code: " + version);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="settings"></param>
        public SnapServerDatabase(ServerDatabaseSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }
            m_settings = settings.CloneReadonly();
            m_settings.Validate();

            m_tmpKey   = new TKey();
            m_tmpValue = new TValue();
            m_supportedStreamingMethods = settings.StreamingEncodingMethods.ToList();
            m_info = new DatabaseInfo(m_settings.DatabaseName, m_tmpKey, m_tmpValue, m_supportedStreamingMethods);

            using (Logger.AppendStackMessages(GetSourceDetails()))
            {
                m_archiveList = new ArchiveList <TKey, TValue>(m_settings.ArchiveList);
                m_rolloverLog = new RolloverLog(m_settings.RolloverLog, m_archiveList);

                if (m_settings.SupportsWriting)
                {
                    m_archiveWriter = new WriteProcessor <TKey, TValue>(m_archiveList, m_settings.WriteProcessor, m_rolloverLog);
                }
            }
        }
        /// <summary>
        /// Creates a new server database from the provided config.
        /// </summary>
        /// <param name="databaseConfig"></param>
        /// <param name="parent">the parent LogSource</param>
        /// <returns></returns>
        public static SnapServerDatabaseBase CreateDatabase(ServerDatabaseSettings databaseConfig)
        {
            var keyType   = Library.GetSortedTreeType(databaseConfig.KeyType);
            var valueType = Library.GetSortedTreeType(databaseConfig.ValueType);

            var type             = typeof(SnapServerDatabaseBase);
            var method           = type.GetMethod("CreateDatabase", BindingFlags.NonPublic | BindingFlags.Static);
            var reflectionMethod = method.MakeGenericMethod(keyType, valueType);

            return((SnapServerDatabaseBase)reflectionMethod.Invoke(null, new object[] { databaseConfig }));
        }
示例#4
0
        /// <summary>
        /// Adds a database to the server
        /// </summary>
        /// <param name="databaseConfig"></param>
        public void AddDatabase(ServerDatabaseSettings databaseConfig)
        {
            if ((object)databaseConfig == null)
            {
                throw new ArgumentNullException("databaseConfig");
            }

            //Pre check to prevent loading a database with the same name twice.
            lock (m_syncRoot)
            {
                if (m_databases.ContainsKey(databaseConfig.DatabaseName.ToUpper()))
                {
                    Log.Publish(MessageLevel.Error, "Database Already Exists", "Adding a database that already exists in the server: " + databaseConfig.DatabaseName);
                    return;
                }
            }

            SnapServerDatabaseBase database;

            try
            {
                using (Logger.AppendStackMessages(Log.InitialStackMessages))
                {
                    database = SnapServerDatabaseBase.CreateDatabase(databaseConfig);
                }
            }
            catch (Exception ex)
            {
                Log.Publish(MessageLevel.Critical, "Database failed to load.", databaseConfig.DatabaseName, null, ex);
                return;
            }

            string databaseName = database.Info.DatabaseName.ToUpper();

            lock (m_syncRoot)
            {
                if (m_databases.ContainsKey(databaseName))
                {
                    Log.Publish(MessageLevel.Error, "Database Already Exists", "Adding a database that already exists in the server: " + databaseName);
                    database.Dispose();
                }
                else
                {
                    Log.Publish(MessageLevel.Info, "Added Database", "Adding a database to the server: " + databaseName);
                    m_databases.Add(database.Info.DatabaseName.ToUpper(), database);
                }
            }
        }
 [MethodImpl(MethodImplOptions.NoOptimization)] //Prevents removing this method as it may appear unused.
 static SnapServerDatabaseBase CreateDatabase <TKey, TValue>(ServerDatabaseSettings databaseConfig)
     where TKey : SnapTypeBase <TKey>, new()
     where TValue : SnapTypeBase <TValue>, new()
 {
     return(new SnapServerDatabase <TKey, TValue>(databaseConfig));
 }