protected IEnumerable <(Guid Id, string Name, DateTime Date)> GetMiaTypes(bool useBackupTable = false)
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            using (ITransaction transaction = database.BeginTransaction())
            {
                List <(Guid Id, string Name, DateTime Date)> miams = new List <(Guid Id, string Name, DateTime Date)>();
                int        idIndex;
                int        nameIndex;
                int        dateIndex;
                IDbCommand command;
                if (useBackupTable)
                {
                    command = SelectAllBackupMediaItemAspectMetadataNameAndCreationDatesCommand(transaction, out idIndex, out nameIndex, out dateIndex);
                }
                else
                {
                    command = MediaLibrary_SubSchema.SelectAllMediaItemAspectMetadataNameAndCreationDatesCommand(transaction, out idIndex, out nameIndex, out dateIndex);
                }
                using (command)
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        ICollection <string> result = new List <string>();
                        while (reader.Read())
                        {
                            miams.Add((reader.GetGuid(idIndex), reader.GetString(nameIndex), reader.GetDateTime(dateIndex)));
                        }
                    }
                return(miams);
            }
        }
        public void DeleteSubSchema(string subSchemaName, int currentVersionMajor, int currentVersionMinor, string deleteScriptFilePath)
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            using (ITransaction transaction = database.BeginTransaction(IsolationLevel.Serializable))
            {
                int  versionMajor;
                int  versionMinor;
                bool schemaPresent = GetSubSchemaVersion(subSchemaName, out versionMajor, out versionMinor);
                if (!schemaPresent)
                {
                    return;
                }
                if (currentVersionMajor == versionMajor && currentVersionMinor == versionMinor)
                {
                    using (TextReader reader = new SqlScriptPreprocessor(deleteScriptFilePath))
                        ExecuteBatch(transaction, new InstructionList(reader));
                }
                else
                {
                    throw new ArgumentException(string.Format("The current version of sub schema '{0}' is {1}.{2}, but the schema deletion script works for version {3}.{4}",
                                                              subSchemaName, versionMajor, versionMinor, currentVersionMajor, currentVersionMajor));
                }

                using (IDbCommand command = MediaPortal_Basis_Schema.DeleteSubSchemaCommand(transaction, subSchemaName))
                    command.ExecuteNonQuery();

                transaction.Commit();
            }
        }
Beispiel #3
0
        protected ICollection <UserProfile> GetProfiles(Guid?profileId, string name)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                int profileIdIndex;
                int nameIndex;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.SelectUserProfilesCommand(transaction, profileId, name,
                                                                                                          out profileIdIndex, out nameIndex))
                {
                    ICollection <UserProfile> result = new List <UserProfile>();
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Guid   profileId_ = database.ReadDBValue <Guid>(reader, profileIdIndex);
                            string name_      = database.ReadDBValue <string>(reader, nameIndex);
                            result.Add(new UserProfile(profileId_, name_));
                        }
                    }
                    return(result);
                }
            }
            finally
            {
                transaction.Dispose();
            }
        }
        public async Task <Guid> CreateProfileAsync(string profileName)
        {
            //Profile might already exist.
            var result = await GetProfileByNameAsync(profileName);

            if (result.Success)
            {
                return(result.Result.ProfileId);
            }

            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();
            Guid         profileId   = Guid.NewGuid();

            try
            {
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CreateUserProfileCommand(transaction, profileId, profileName))
                    command.ExecuteNonQuery();
                transaction.Commit();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error creating user profile '{0}')", e, profileName);
                transaction.Rollback();
                throw;
            }
            return(profileId);
        }
        public Task <bool> SetUserMediaItemDataAsync(Guid profileId, Guid mediaItemId, string key, string data)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                bool result;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.DeleteUserMediaItemDataCommand(transaction, profileId, mediaItemId, key))
                    command.ExecuteNonQuery();

                // Allow "delete only", if new data is null. This is used to delete no longer required data.
                if (!string.IsNullOrEmpty(data))
                {
                    using (IDbCommand command = UserProfileDataManagement_SubSchema.CreateUserMediaItemDataCommand(transaction, profileId, mediaItemId, key, data))
                        result = command.ExecuteNonQuery() > 0;
                }
                else
                {
                    result = true;
                }

                transaction.Commit();
                return(Task.FromResult(result));
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error setting media item data '{0}' for media item '{1}' in profile '{2}'", e, key, mediaItemId, profileId);
                transaction.Rollback();
                throw;
            }
        }
Beispiel #6
0
        public bool GetUserAdditionalData(Guid profileId, string key, out string data)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                int dataIndex;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.SelectUserAdditionalDataCommand(transaction, profileId,
                                                                                                                key, out dataIndex))
                {
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            data = database.ReadDBValue <string>(reader, dataIndex);
                            return(true);
                        }
                    }
                }
                data = null;
                return(false);
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #7
0
        public void AttachClient(string clientSystemId)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = ClientManager_SubSchema.InsertAttachedClientCommand(transaction, clientSystemId, null, null))
                    command.ExecuteNonQuery();
                transaction.Commit();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("ClientManager: Error attaching client '{0}'", e, clientSystemId);
                transaction.Rollback();
                throw;
            }
            ServiceRegistration.Get <ILogger>().Info("ClientManager: Client with system ID '{0}' attached", clientSystemId);
            // Establish the UPnP connection to the client, if available in the network
            IDictionary <string, MPClientMetadata> attachedClients = ReadAttachedClientsFromDB();

            lock (_syncObj)
                _attachedClients = attachedClients;
            _controlPoint.AddAttachedClient(clientSystemId);
            ClientManagerMessaging.SendClientAttachmentChangeMessage(ClientManagerMessaging.MessageType.ClientAttached, clientSystemId);
        }
Beispiel #8
0
        public void DetachClientAndRemoveShares(string clientSystemId)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = ClientManager_SubSchema.DeleteAttachedClientCommand(transaction, clientSystemId))
                    command.ExecuteNonQuery();

                IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>();
                mediaLibrary.DeleteMediaItemOrPath(clientSystemId, null, true);
                mediaLibrary.RemoveSharesOfSystem(clientSystemId);

                transaction.Commit();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("ClientManager: Error detaching client '{0}'", e, clientSystemId);
                transaction.Rollback();
                throw;
            }
            ServiceRegistration.Get <ILogger>().Info("ClientManager: Client with system ID '{0}' detached", clientSystemId);
            // Last action: Remove the client from the collection of attached clients and disconnect the client connection, if connected
            _attachedClients = ReadAttachedClientsFromDB();
            _controlPoint.RemoveAttachedClient(clientSystemId);
            ClientManagerMessaging.SendClientAttachmentChangeMessage(ClientManagerMessaging.MessageType.ClientDetached, clientSystemId);
        }
        public Task <AsyncResult <string> > GetUserAdditionalDataAsync(Guid profileId, string key, int dataNo = 0)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                int dataIndex;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.SelectUserAdditionalDataCommand(transaction, profileId,
                                                                                                                key, dataNo, out dataIndex))
                {
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            var data = database.ReadDBValue <string>(reader, dataIndex);
                            return(Task.FromResult(new AsyncResult <string>(true, data)));
                        }
                    }
                }
                return(Task.FromResult(new AsyncResult <string>(false, null)));
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #10
0
        /// <summary>
        /// Returns a dictionary which maps the system ids of all attached clients to their last hostname.
        /// </summary>
        /// <returns>Dictionary with system ids mapped to host names.</returns>
        protected IDictionary <string, MPClientMetadata> ReadAttachedClientsFromDB()
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                int systemIdIndex;
                int lastHostNameIndex;
                int lastClientNameIndex;
                IDictionary <string, MPClientMetadata> result = new Dictionary <string, MPClientMetadata>();
                using (IDbCommand command = ClientManager_SubSchema.SelectAttachedClientsCommand(transaction, out systemIdIndex,
                                                                                                 out lastHostNameIndex, out lastClientNameIndex))
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string     clientSystemId     = database.ReadDBValue <string>(reader, systemIdIndex);
                            string     lastClientHostName = database.ReadDBValue <string>(reader, lastHostNameIndex);
                            SystemName lastHostName       = lastClientHostName == null ? null : new SystemName(lastClientHostName);
                            string     lastClientName     = database.ReadDBValue <string>(reader, lastClientNameIndex);
                            result.Add(clientSystemId, new MPClientMetadata(clientSystemId, lastHostName, lastClientName));
                        }
                    }
                return(result);
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #11
0
        private static ICollection <Share> GetMediaSources(ISQLDatabase database)
        {
            IList <Share> sources = new List <Share>();

            ITransaction transaction = database.BeginTransaction();

            IDbCommand sourcesCommand = transaction.CreateCommand();

            sourcesCommand.CommandText = "select share_id,base_resource_path,name from shares s";
            IDataReader sourcesReader = sourcesCommand.ExecuteReader();

            while (sourcesReader.Read())
            {
                Guid         sourceId     = sourcesReader.GetGuid(sourcesReader.GetOrdinal("share_id"));
                ResourcePath resourcePath = ResourcePath.Deserialize(sourcesReader.GetString(sourcesReader.GetOrdinal("base_resource_path")));

                IList <string> categories        = new List <string>();
                IDbCommand     categoriesCommand = transaction.CreateCommand();
                categoriesCommand.CommandText = "select categoryname from shares_categories where share_id=@share_id";
                database.AddParameter(categoriesCommand, "share_id", sourceId, typeof(Guid));
                IDataReader categoriesReader = categoriesCommand.ExecuteReader();
                while (categoriesReader.Read())
                {
                    categories.Add(categoriesReader.GetString(categoriesReader.GetOrdinal("categoryname")));
                }
                categoriesReader.Close();

                string name = sourcesReader.GetString(sourcesReader.GetOrdinal("name"));
                sources.Add(new Share(sourceId, null, resourcePath, name, true, categories));
            }
            sourcesReader.Close();

            return(sources);
        }
        public Guid CreateProfile(string profileName)
        {
            //Profile might already exist.
            UserProfile existingProfile;

            if (GetProfileByName(profileName, out existingProfile))
            {
                return(existingProfile.ProfileId);
            }

            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();
            Guid         profileId   = Guid.NewGuid();

            try
            {
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CreateUserProfileCommand(transaction, profileId, profileName))
                    command.ExecuteNonQuery();
                transaction.Commit();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error creating user profile '{0}')", e, profileName);
                transaction.Rollback();
                throw;
            }
            return(profileId);
        }
        public bool GetSubSchemaVersion(string subSchemaName, out int versionMajor, out int versionMinor)
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            versionMajor = 0;
            versionMinor = 0;
            int versionMajorParameterIndex;
            int versionMinorParameterIndex;

            using (ITransaction transaction = database.BeginTransaction())
            {
                using (IDbCommand command = MediaPortal_Basis_Schema.SelectVersionBySubschemaCommand(transaction, subSchemaName,
                                                                                                     out versionMajorParameterIndex, out versionMinorParameterIndex))
                    using (IDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow))
                    {
                        if (reader.Read())
                        {
                            // Versions are marked NOT NULL, so it is safe not to check for DBNull
                            versionMajor = reader.GetInt32(versionMajorParameterIndex);
                            versionMinor = reader.GetInt32(versionMinorParameterIndex);
                            return(true);
                        }
                        return(false);
                    }
            }
        }
        public int Execute()
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = transaction.CreateCommand())
                {
                    string           countAlias;
                    string           statementStr;
                    IList <BindVar>  bindVars;
                    MainQueryBuilder builder = new MainQueryBuilder(_miaManagement, new QueryAttribute[] {}, null,
                                                                    _necessaryRequestedMIATypes, new MediaItemAspectMetadata[] {}, _filter, null);
                    IDictionary <QueryAttribute, string> qa2a;
                    builder.GenerateSqlGroupByStatement(out countAlias, out qa2a, out statementStr, out bindVars);

                    command.CommandText = statementStr;
                    foreach (BindVar bindVar in bindVars)
                    {
                        database.AddParameter(command, bindVar.Name, bindVar.Value, bindVar.VariableType);
                    }

                    return(Convert.ToInt32(command.ExecuteScalar()));
                }
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #15
0
        private void InitAsync()
        {
            ServiceRegistration.Get <ILogger>().Info("SlimTvService: Initialising");
            Task.Delay(MAX_INIT_MS).ContinueWith((t) =>
            {
                if (_initComplete.Task.Status != TaskStatus.RanToCompletion)
                {
                    _initComplete.TrySetResult(false);
                    ServiceRegistration.Get <ILogger>().Error("SlimTvService: Initialization timed out.");
                }
            });

            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            if (database == null)
            {
                ServiceRegistration.Get <ILogger>().Error("SlimTvService: Database not available.");
                _initComplete.TrySetResult(false);
                return;
            }

            using (var transaction = database.BeginTransaction())
            {
                // Prepare TV database if required.
                PrepareTvDatabase(transaction);
                PrepareConnection(transaction);
            }

            // Initialize integration into host system (MP2-Server)
            PrepareIntegrationProvider();

            // Needs to be done after the IntegrationProvider is registered, so the TVCORE folder is defined.
            PrepareProgramData();

            // Register required filters
            PrepareFilterRegistrations();

            // Get all current connected clients, so we can later detect disconnections
            UpdateClientList();

            // Run the actual TV core thread(s)
            InitTvCore();
            if (_abortInit)
            {
                ServiceRegistration.Get <ILogger>().Error("SlimTvService: Initialization aborted.");
                _initComplete.TrySetResult(false);
                DeInit();
                return;
            }

            // Prepare the MP2 integration
            PrepareMediaSources();

            ServiceRegistration.Get <ILogger>().Info("SlimTvService: Initialised");
            _initComplete.TrySetResult(true);
        }
        public HomogenousMap Execute()
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = transaction.CreateCommand())
                {
                    string          valueAlias;
                    string          groupSizeAlias;
                    string          statementStr;
                    IList <BindVar> bindVars;
                    if (_selectAttribute.Cardinality == Cardinality.Inline || _selectAttribute.Cardinality == Cardinality.ManyToOne)
                    {
                        QueryAttribute   selectAttributeQA = new QueryAttribute(_selectAttribute);
                        MainQueryBuilder builder           = new MainQueryBuilder(_miaManagement,
                                                                                  new QueryAttribute[] { selectAttributeQA }, _selectProjectionFunction,
                                                                                  _necessaryRequestedMIATypes, new MediaItemAspectMetadata[] {}, _filter, null);
                        IDictionary <QueryAttribute, string> qa2a;
                        builder.GenerateSqlGroupByStatement(out groupSizeAlias, out qa2a, out statementStr, out bindVars);
                        valueAlias = qa2a[selectAttributeQA];
                    }
                    else
                    {
                        ComplexAttributeQueryBuilder builder = new ComplexAttributeQueryBuilder(_miaManagement, _selectAttribute,
                                                                                                _selectProjectionFunction, _necessaryRequestedMIATypes, _filter);
                        builder.GenerateSqlGroupByStatement(_selectAttributeFilter, out valueAlias, out groupSizeAlias,
                                                            out statementStr, out bindVars);
                    }
                    command.CommandText = statementStr;
                    foreach (BindVar bindVar in bindVars)
                    {
                        database.AddParameter(command, bindVar.Name, bindVar.Value, bindVar.VariableType);
                    }

                    Type          valueType = _projectionValueType ?? _selectAttribute.AttributeType;
                    HomogenousMap result    = new HomogenousMap(valueType, typeof(int));
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        int valueCol     = reader.GetOrdinal(valueAlias);
                        int groupSizeCol = reader.GetOrdinal(groupSizeAlias);
                        while (reader.Read())
                        {
                            result.Add(database.ReadDBValue(valueType, reader, valueCol),
                                       database.ReadDBValue <int>(reader, groupSizeCol));
                        }
                    }
                    return(result);
                }
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #17
0
        public IList <MediaItem> Query(bool singleMode)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                return(Query(database, transaction, singleMode));
            }
            finally
            {
                transaction.Dispose();
            }
        }
Beispiel #18
0
 public void ExecuteBatch(ISQLDatabase database, InstructionList instructions)
 {
     using (ITransaction transaction = database.BeginTransaction())
     {
         foreach (string instr in instructions)
         {
             using (IDbCommand cmd = transaction.CreateCommand())
             {
                 cmd.CommandText = instr;
                 cmd.ExecuteNonQuery();
             }
         }
         transaction.Commit();
     }
 }
        public Task <bool> ChangeProfileIdAsync(Guid profileId, Guid newProfileId)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                bool   result;
                int    nameIndex;
                string profileName;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.SelectUserProfileNameCommand(transaction, profileId, out nameIndex))
                {
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            profileName = database.ReadDBValue <string>(reader, nameIndex);
                        }
                        else
                        {
                            transaction.Rollback();
                            return(Task.FromResult(false));
                        }
                    }
                }
                using (IDbCommand command = UserProfileDataManagement_SubSchema.UpdateUserProfileNameCommand(transaction, profileId, profileName + "_old"))
                    command.ExecuteNonQuery();
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CopyUserProfileCommand(transaction, profileId, newProfileId, profileName))
                    result = command.ExecuteNonQuery() > 0;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CopyUserMediaItemDataCommand(transaction, profileId, newProfileId))
                    command.ExecuteNonQuery();
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CopyUserPlaylistDataCommand(transaction, profileId, newProfileId))
                    command.ExecuteNonQuery();
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CopyUserAdditionalDataCommand(transaction, profileId, newProfileId))
                    command.ExecuteNonQuery();
                using (IDbCommand command = UserProfileDataManagement_SubSchema.DeleteUserProfileCommand(transaction, profileId))
                    command.ExecuteNonQuery();
                transaction.Commit();

                return(Task.FromResult(result));
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error changing profile Id '{0}'", e, profileId);
                transaction.Rollback();
                throw;
            }
        }
        /// <summary>
        /// Gets all media item ids from the database.
        /// </summary>
        /// <returns></returns>
        protected ICollection <Guid> GetAllMediaItemIds()
        {
            HashSet <Guid> mediaItemIds = new HashSet <Guid>();

            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>();

            using (ITransaction transaction = database.BeginTransaction())
                using (IDbCommand command = MediaLibrary_SubSchema.SelectAllMediaItemIdsCommand(transaction))
                    using (var reader = command.ExecuteReader())
                        while (reader.Read())
                        {
                            mediaItemIds.Add(database.ReadDBValue <Guid>(reader, 0));
                        }

            return(mediaItemIds);
        }
        public bool UpgradeDatabase()
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);
            int          curVersionMajor;
            int          curVersionMinor;

            if (GetDatabaseVersion(out curVersionMajor, out curVersionMinor) &&
                (curVersionMajor < DATABASE_VERSION_MAJOR ||
                 (curVersionMajor == DATABASE_VERSION_MAJOR && curVersionMinor < DATABASE_VERSION_MINOR)))
            {
                //Database was not migratable before version 2.1
                if (curVersionMajor == 2 && curVersionMinor == 0)
                {
                    curVersionMinor = GuessMiniorVersion();
                }

                _upgradeInProgress = true;
                SendUpgradeProgress(0, 100);
                ServiceRegistration.Get <ILogger>().Info("DatabaseManager: Initiating update to database version {0}.{1}", DATABASE_VERSION_MAJOR, DATABASE_VERSION_MINOR);
                Version currrentVersion = new Version(curVersionMajor, curVersionMinor);
                if (database.BackupDatabase(currrentVersion.ToString(2)))
                {
                    SendUpgradeProgress(5, 100);
                    if (database.BackupTables(BACKUP_TABLE_SUFFIX))
                    {
                        SendUpgradeProgress(10, 100);
                        using (ITransaction transaction = database.BeginTransaction(IsolationLevel.Serializable))
                        {
                            ServiceRegistration.Get <ILogger>().Info("DatabaseManager: Creating subschema '{0}'", MediaPortal_Basis_Schema.SUBSCHEMA_NAME);
                            using (TextReader reader = new SqlScriptPreprocessor(MediaPortal_Basis_Schema.SubSchemaCreateScriptPath))
                                ExecuteBatch(transaction, new InstructionList(reader));
                            transaction.Commit();
                        }
                        //A newly created database will always be of the latest version
                        SetDatabaseVersion(DATABASE_VERSION_MAJOR, DATABASE_VERSION_MINOR);

                        //Set MediaLibrary in maintenance mode
                        if (ServiceRegistration.Get <IMediaLibrary>() is MediaLibrary.MediaLibrary mediaLibrary)
                        {
                            mediaLibrary.MaintenanceMode = true;
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
        public Task <AsyncResult <IEnumerable <Tuple <string, int, string> > > > GetUserSelectedAdditionalDataListAsync(Guid profileId, string[] keys, bool sortByKey = false, SortDirection sortDirection = SortDirection.Ascending,
                                                                                                                        uint?offset = null, uint?limit = null)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                int dataNoIndex;
                int dataIndex;
                int keyIndex;
                List <Tuple <string, int, string> > list = new List <Tuple <string, int, string> >();
                using (IDbCommand command = UserProfileDataManagement_SubSchema.SelectUserAdditionalDataListCommand(transaction, profileId,
                                                                                                                    keys, sortByKey, sortDirection, out keyIndex, out dataNoIndex, out dataIndex))
                {
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        var records = reader.AsEnumerable();
                        if (offset.HasValue)
                        {
                            records = records.Skip((int)offset.Value);
                        }
                        if (limit.HasValue)
                        {
                            records = records.Take((int)limit.Value);
                        }
                        foreach (var record in records)
                        {
                            list.Add(new Tuple <string, int, string>(database.ReadDBValue <string>(record, keyIndex), database.ReadDBValue <int>(record, dataNoIndex),
                                                                     database.ReadDBValue <string>(record, dataIndex)));
                        }
                    }
                }
                IEnumerable <Tuple <string, int, string> > data = null;
                if (list.Count > 0)
                {
                    data = list;
                }
                return(Task.FromResult(new AsyncResult <IEnumerable <Tuple <string, int, string> > >(data != null, data)));
            }
            finally
            {
                transaction.Dispose();
            }
        }
        protected bool GetDatabaseVersion(out int versionMajor, out int versionMinor, bool useBackupTable = false)
        {
            versionMajor = 0;
            versionMinor = 0;
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            if (!database.TableExists(MediaPortal_Basis_Schema.DATABASE_VERSION_TABLE_NAME + (useBackupTable ? BACKUP_TABLE_SUFFIX : "")))
            {
                return(false);
            }

            ITransaction transaction = database.BeginTransaction();

            try
            {
                int        versionIndex;
                IDbCommand command;
                if (useBackupTable)
                {
                    command = SelectBackupDatabaseVersionByCommand(transaction, out versionIndex);
                }
                else
                {
                    command = MediaPortal_Basis_Schema.SelectDatabaseVersionByCommand(transaction, out versionIndex);
                }
                using (command)
                    using (IDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow))
                    {
                        if (reader.Read())
                        {
                            if (Version.TryParse(reader.GetString(versionIndex), out Version version))
                            {
                                versionMajor = version.Major;
                                versionMinor = version.Minor;
                            }
                            return(true);
                        }
                        return(false);
                    }
            }
            finally
            {
                transaction.Dispose();
            }
        }
        public Task <bool> ClearUserMediaItemDataKeyAsync(Guid profileId, string key)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = UserProfileDataManagement_SubSchema.DeleteUserMediaItemDataCommand(transaction, profileId, null, key))
                    command.ExecuteNonQuery();
                transaction.Commit();
                return(Task.FromResult(true));
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error clearing user media item data for profile '{0}'", e, profileId);
                transaction.Rollback();
                throw;
            }
        }
        private Guid CreateProfileInternal(Guid profileId, string profileName, UserProfileType profileType, string profilePassword)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                using (IDbCommand command = UserProfileDataManagement_SubSchema.CreateUserProfileCommand(transaction, profileId, profileName, profileType, profilePassword))
                    command.ExecuteNonQuery();
                transaction.Commit();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error creating user profile '{0}')", e, profileName);
                transaction.Rollback();
                throw;
            }
            return(profileId);
        }
        public ICollection <string> GetDatabaseSubSchemas()
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            using (ITransaction transaction = database.BeginTransaction())
            {
                int nameIndex;
                using (IDbCommand command = MediaPortal_Basis_Schema.SelectAllSubSchemaNames(transaction, out nameIndex))
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        ICollection <string> result = new List <string>();
                        while (reader.Read())
                        {
                            result.Add(database.ReadDBValue <string>(reader, nameIndex));
                        }
                        return(result);
                    }
            }
        }
        public void Startup()
        {
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            if (database == null)
            {
                throw new IllegalCallException("There is no database present in the system");
            }

            if (!_migrationScriptPlaceholders.ContainsKey(SQL_CONCAT_PLACEHOLDER))
            {
                _migrationScriptPlaceholders.Add(SQL_CONCAT_PLACEHOLDER, database.ConcatOperator);
            }
            if (!_migrationScriptPlaceholders.ContainsKey(SQL_LEN_PLACEHOLDER))
            {
                _migrationScriptPlaceholders.Add(SQL_LEN_PLACEHOLDER, database.LengthFunction);
            }

            // Prepare schema
            if (!database.TableExists(MediaPortal_Basis_Schema.MEDIAPORTAL_BASIS_TABLE_NAME))
            {
                ServiceRegistration.Get <ILogger>().Info("DatabaseManager: Creating subschema '{0}'", MediaPortal_Basis_Schema.SUBSCHEMA_NAME);
                using (ITransaction transaction = database.BeginTransaction(IsolationLevel.Serializable))
                {
                    using (TextReader reader = new SqlScriptPreprocessor(MediaPortal_Basis_Schema.SubSchemaCreateScriptPath))
                        ExecuteBatch(transaction, new InstructionList(reader));
                    transaction.Commit();
                }
                //A newly created database will be of the latest version
                SetDatabaseVersion(DATABASE_VERSION_MAJOR, DATABASE_VERSION_MINOR);
            }
            // Hint: Table MEDIAPORTAL_BASIS contains a sub schema entry for "MEDIAPORTAL_BASIS" with version number 1.0
            int versionMajor;
            int versionMinor;

            if (!GetSubSchemaVersion(MediaPortal_Basis_Schema.SUBSCHEMA_NAME, out versionMajor, out versionMinor))
            {
                throw new UnexpectedStateException("{0} schema is not present or corrupted", MediaPortal_Basis_Schema.SUBSCHEMA_NAME);
            }
            ServiceRegistration.Get <ILogger>().Info("DatabaseManager: Subschema '{0}' present in version {1}.{2}",
                                                     MediaPortal_Basis_Schema.SUBSCHEMA_NAME, versionMajor, versionMinor);
        }
Beispiel #28
0
        public bool DeleteProfile(Guid profileId)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                bool result;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.DeleteUserProfileCommand(transaction, profileId))
                    result = command.ExecuteNonQuery() > 0;
                transaction.Commit();
                return(result);
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error deleting profile '{0}'", e, profileId);
                transaction.Rollback();
                throw;
            }
        }
        private void InitAsync()
        {
            ServiceRegistration.Get <ILogger>().Info("SlimTvService: Initialising");

            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            if (database == null)
            {
                ServiceRegistration.Get <ILogger>().Error("SlimTvService: Database not available.");
                return;
            }

            using (var transaction = database.BeginTransaction())
            {
                // Prepare TV database if required.
                PrepareTvDatabase(transaction);
                PrepareConnection(transaction);
            }

            // Initialize integration into host system (MP2-Server)
            PrepareIntegrationProvider();

            // Needs to be done after the IntegrationProvider is registered, so the TVCORE folder is defined.
            PrepareProgramData();

            // Register required filters
            PrepareFilterRegistrations();

            // Run the actual TV core thread(s)
            InitTvCore();
            if (_abortInit)
            {
                DeInit();
                return;
            }

            // Prepare the MP2 integration
            PrepareMediaSources();

            ServiceRegistration.Get <ILogger>().Info("SlimTvService: Initialised");
        }
        public Task <bool> LoginProfileAsync(Guid profileId)
        {
            ISQLDatabase database    = ServiceRegistration.Get <ISQLDatabase>();
            ITransaction transaction = database.BeginTransaction();

            try
            {
                bool result;
                using (IDbCommand command = UserProfileDataManagement_SubSchema.LoginUserProfileCommand(transaction, profileId))
                    result = command.ExecuteNonQuery() > 0;
                transaction.Commit();

                return(Task.FromResult(result));
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("UserProfileDataManagement: Error logging in profile '{0}'", e, profileId);
                transaction.Rollback();
                throw;
            }
        }
 public void ExecuteBatch(ISQLDatabase database, InstructionList instructions)
 {
   using (ITransaction transaction = database.BeginTransaction())
   {
     foreach (string instr in instructions)
       using (IDbCommand cmd = transaction.CreateCommand())
       {
         cmd.CommandText = instr;
         cmd.ExecuteNonQuery();
       }
     transaction.Commit();
   }
 }