/// <summary>
        /// Get all blocks.
        /// </summary>
        /// <param name="controlType">A value to filter blocks by its control connections.</param>
        /// <returns>A list of blocks controlable with accessory decoders.</returns>
        public IEnumerable <ElementBase> GetAll(ControlModule.ModuleType controlType)
        {
            string             sql   = string.Empty;
            ElementBase        item  = null;
            List <ElementBase> items = new List <ElementBase>();

            Logger.LogDebug(this, "[CLASS].GetAll({0})", controlType);

            try
            {
                Connect();

                sql = @"SELECT 
                        " + ElementManager.SQL_FIELDS_SELECT + @" 
                    FROM 
                        " + ElementManager.SQL_TABLE + @" 
                    ORDER BY 
                        name Asc, 
                        id   Asc";

                using (SQLiteDataReader reader = ExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        item = ElementManager.ReadEntityRecord(reader);
                        if (item != null &&
                            (controlType == ControlModule.ModuleType.Undefined ||
                             controlType == ControlModule.ModuleType.Accessory && item.AccessoryConnections != null && item.AccessoryConnections.Length > 0 ||
                             controlType == ControlModule.ModuleType.Sensor && item.FeedbackConnections != null && item.FeedbackConnections.Length > 0))
                        {
                            items.Add(item);
                        }
                    }
                }

                return(items);
            }
            catch (Exception ex)
            {
                Logger.LogError(this, ex);

                throw;
            }
            finally
            {
                Disconnect();
            }
        }
        /// <summary>
        /// Gets all elements from a specified switchboard panel.
        /// </summary>
        /// <param name="panel">The switchboard panel.</param>
        /// <returns>The requested list of <see cref="ElementBase"/>.</returns>
        public List <ElementBase> GetByPanel(SwitchboardPanel panel)
        {
            string             sql   = string.Empty;
            ElementBase        item  = null;
            List <ElementBase> items = new List <ElementBase>();

            Logger.LogDebug(this, "[CLASS].GetByPanel([{0}])", panel);

            try
            {
                Connect();

                sql = @"SELECT 
                        " + ElementManager.SQL_FIELDS_SELECT + @" 
                    FROM 
                        " + ElementManager.SQL_TABLE + @" 
                    WHERE 
                        panelid = @panelid";

                SetParameter("panelid", panel.ID);

                using (SQLiteDataReader reader = ExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        item = ElementManager.ReadEntityRecord(reader);
                        if (item != null)
                        {
                            item.SwitchboardPanel = panel;
                            items.Add(item);
                        }
                    }
                }

                return(items);
            }
            catch (Exception ex)
            {
                Logger.LogError(this, ex);

                throw;
            }
            finally
            {
                Disconnect();
            }
        }
        /// <summary>
        /// Get a element by its coordinates.
        /// </summary>
        /// <param name="coords">The element position.</param>
        /// <returns>The requested instance of <see cref="ElementBase"/> or <c>null</c> if the element cannot be found.</returns>
        public ElementBase GetByCoordinates(Coordinates coords)
        {
            int    id;
            string sql = string.Empty;

            Logger.LogDebug(this, "[CLASS].GetByCoordinates([{0}])", coords);

            try
            {
                Connect();

                sql = @"SELECT 
                        " + ElementManager.SQL_FIELDS_SELECT + @" 
                    FROM 
                        " + ElementManager.SQL_TABLE + @" 
                    WHERE 
                        x = @x And 
                        y = @y";

                SetParameter("x", coords.X);
                SetParameter("y", coords.Y);

                using (SQLiteDataReader reader = ExecuteReader(sql))
                {
                    if (reader.Read())
                    {
                        return(ElementManager.ReadEntityRecord(reader));
                    }
                }

                return(null);
            }
            catch (Exception ex)
            {
                Logger.LogError(this, ex);

                throw;
            }
            finally
            {
                Disconnect();
            }
        }
        /// <summary>
        /// Read a category from the current reader record.
        /// </summary>
        internal static ElementBase ReadEntityRecord(SQLiteDataReader reader)
        {
            //"id, panelid, name, x, y, rotation, type, status"

            ElementBase record = ElementManager.CreateInstance(reader.GetInt32(6));

            record.ID = reader.GetInt32(0);
            record.SwitchboardPanel = new SwitchboardPanel(reader.GetInt32(1));
            record.Name             = reader.IsDBNull(2) ? string.Empty : reader.GetString(2);
            record.X        = reader.IsDBNull(3) ? 1 : reader.GetInt32(3);
            record.Y        = reader.IsDBNull(4) ? 1 : reader.GetInt32(4);
            record.Rotation = reader.IsDBNull(5) ? ElementBase.RotationStep.Step0 : (ElementBase.RotationStep)reader.GetInt32(5);

            if (ElementBase.IsAccessoryElement(record))
            {
                ((IAccessory)record).SetAccessoryStatus(reader.IsDBNull(7) ? ElementBase.STATUS_UNDEFINED : reader.GetInt32(7), false);
            }

            return(record);
        }
        /// <summary>
        /// Recupera las propiedades de una Administración/Operadora.
        /// </summary>
        /// <param name="id">The element unique identifier (DB).</param>
        /// <returns>The requested instance of <see cref="ElementBase"/> or <c>null</c> if the element cannot be found.</returns>
        public ElementBase GetByID(Int64 id)
        {
            string sql = string.Empty;

            Logger.LogDebug(this, "[CLASS].GetByID({0})", id);

            try
            {
                Connect();

                sql = @"SELECT 
                        " + ElementManager.SQL_FIELDS_SELECT + @" 
                    FROM 
                        " + ElementManager.SQL_TABLE + @" 
                    WHERE 
                        id = @id";

                SetParameter("id", id);

                using (SQLiteDataReader reader = ExecuteReader(sql))
                {
                    if (reader.Read())
                    {
                        return(ElementManager.ReadEntityRecord(reader));
                    }
                }

                return(null);
            }
            catch (Exception ex)
            {
                Logger.LogError(this, ex);

                throw;
            }
            finally
            {
                Disconnect();
            }
        }
 /// <summary>
 /// Creates a element instance from the specified type.
 /// </summary>
 /// <param name="elementType">Element type corresponding of the enumeration type.</param>
 /// <returns>The requested instance.</returns>
 public static ElementBase CreateInstance(int elementType)
 {
     return(ElementManager.CreateInstance((ElementBase.ElementType)elementType));
 }