Esempio n. 1
0
        public FSAssetConnector(IConfigSource config, string configName) : base(config)
        {
            if (!m_Initialized)
            {
                m_Initialized  = true;
                m_MainInstance = true;

                MainConsole.Instance.Commands.AddCommand("fs", false,
                                                         "show assets", "show assets", "Show asset stats",
                                                         HandleShowAssets);
                MainConsole.Instance.Commands.AddCommand("fs", false,
                                                         "show digest", "show digest <ID>", "Show asset digest",
                                                         HandleShowDigest);
                MainConsole.Instance.Commands.AddCommand("fs", false,
                                                         "delete asset", "delete asset <ID>",
                                                         "Delete asset from database",
                                                         HandleDeleteAsset);
                MainConsole.Instance.Commands.AddCommand("fs", false,
                                                         "import", "import <conn> <table> [<start> <count>]",
                                                         "Import legacy assets",
                                                         HandleImportAssets);
                MainConsole.Instance.Commands.AddCommand("fs", false,
                                                         "force import", "force import <conn> <table> [<start> <count>]",
                                                         "Import legacy assets, overwriting current content",
                                                         HandleImportAssets);
            }

            IConfig assetConfig = config.Configs[configName];

            if (assetConfig == null)
            {
                throw new Exception("No AssetService configuration");
            }

            // Get Database Connector from Asset Config (If present)
            string dllName          = assetConfig.GetString("StorageProvider", string.Empty);
            string connectionString = assetConfig.GetString("ConnectionString", string.Empty);
            string realm            = assetConfig.GetString("Realm", "fsassets");

            int SkipAccessTimeDays = assetConfig.GetInt("DaysBetweenAccessTimeUpdates", 0);

            // If not found above, fallback to Database defaults
            IConfig dbConfig = config.Configs["DatabaseService"];

            if (dbConfig != null)
            {
                if (dllName == String.Empty)
                {
                    dllName = dbConfig.GetString("StorageProvider", String.Empty);
                }

                if (connectionString == String.Empty)
                {
                    connectionString = dbConfig.GetString("ConnectionString", String.Empty);
                }
            }

            // No databse connection found in either config
            if (dllName.Equals(String.Empty))
            {
                throw new Exception("No StorageProvider configured");
            }

            if (connectionString.Equals(String.Empty))
            {
                throw new Exception("Missing database connection string");
            }

            // Create Storage Provider
            m_DataConnector = LoadPlugin <IFSAssetDataPlugin>(dllName);

            if (m_DataConnector == null)
            {
                throw new Exception(string.Format("Could not find a storage interface in the module {0}", dllName));
            }

            // Initialize DB And perform any migrations required
            m_DataConnector.Initialise(connectionString, realm, SkipAccessTimeDays);

            // Setup Fallback Service
            string str = assetConfig.GetString("FallbackService", string.Empty);

            if (str != string.Empty)
            {
                object[] args = new object[] { config };
                m_FallbackService = LoadPlugin <IAssetService>(str, args);
                if (m_FallbackService != null)
                {
                    m_log.Info("[FSASSETS]: Fallback service loaded");
                }
                else
                {
                    m_log.Error("[FSASSETS]: Failed to load fallback service");
                }
            }

            // Setup directory structure including temp directory
            m_SpoolDirectory = assetConfig.GetString("SpoolDirectory", "/tmp");

            string spoolTmp = Path.Combine(m_SpoolDirectory, "spool");

            Directory.CreateDirectory(spoolTmp);

            m_FSBase = assetConfig.GetString("BaseDirectory", String.Empty);
            if (m_FSBase == String.Empty)
            {
                m_log.ErrorFormat("[FSASSETS]: BaseDirectory not specified");
                throw new Exception("Configuration error");
            }

            m_useOsgridFormat = assetConfig.GetBoolean("UseOsgridFormat", m_useOsgridFormat);

            if (m_MainInstance)
            {
                string loader = assetConfig.GetString("DefaultAssetLoader", string.Empty);
                if (loader != string.Empty)
                {
                    m_AssetLoader = LoadPlugin <IAssetLoader>(loader);
                    string loaderArgs = assetConfig.GetString("AssetLoaderArgs", string.Empty);
                    m_log.InfoFormat("[FSASSETS]: Loading default asset set from {0}", loaderArgs);
                    m_AssetLoader.ForEachDefaultXmlAsset(loaderArgs,
                                                         delegate(AssetBase a)
                    {
                        Store(a, false);
                    });
                }

                m_WriterThread = new Thread(Writer);
                m_WriterThread.Start();
                m_StatsThread = new Thread(Stats);
                m_StatsThread.Start();
            }

            m_log.Info("[FSASSETS]: FS asset service enabled");
        }