Exemple #1
0
        private IList <PageBE> GetTaggedPages(TagBE tag)
        {
            IList <ulong>  pageIds = _session.Tags_GetPageIds(tag.Id);
            IList <PageBE> pages   = PageBL.GetPagesByIdsPreserveOrder(pageIds);

            return(PermissionsBL.FilterDisallowed(_user, pages, false, Permissions.BROWSE));
        }
Exemple #2
0
        public XDoc GetTagXml(TagBE tag, bool showPages, string pageFilterLanguage)
        {
            string uriText = null, titleText = null;

            switch (tag.Type)
            {
            case TagType.DEFINE:
                uriText   = Utils.AsPublicUiUri(tag.DefinedTo.Title);
                titleText = tag.Name;
                break;

            case TagType.DATE:
                uriText = _dekiContext.UiUri.Uri.AtPath("Special:Events").With("from", tag.Name).ToString();
                DateTime date = DateTime.ParseExact(tag.Name, "yyyy-MM-dd", _culture, DateTimeStyles.None);
                titleText = date.ToString("D", _culture);
                break;

            case TagType.TEXT:
                if (null != tag.DefinedTo)
                {
                    uriText = Utils.AsPublicUiUri(tag.DefinedTo.Title);
                }
                else
                {
                    uriText = _dekiContext.UiUri.AtPath("Special:Tags").With("tag", tag.Name).ToString();
                }
                titleText = tag.Name;
                break;
            }
            XDoc result = new XDoc("tag");

            result.Attr("value", tag.PrefixedName);
            result.Attr("id", tag.Id);
            result.Attr("href", _dekiContext.ApiUri.At("site", "tags", tag.Id.ToString()).ToString());
            if (tag.OccuranceCount > 0)
            {
                result.Attr("count", tag.OccuranceCount);
            }

            result.Elem("type", tag.Type.ToString().ToLowerInvariant());
            result.Elem("uri", uriText);
            result.Elem("title", titleText);
            if (null != tag.RelatedPages)
            {
                result.Add(PageBL.GetPageListXml(tag.RelatedPages, "related"));
            }

            if (showPages)
            {
                IList <PageBE> pages = GetTaggedPages(tag);
                if (pageFilterLanguage != null)
                {
                    // filter pages by language
                    pages = (from page in pages where page.Language == pageFilterLanguage select page).ToList();
                }
                result.Add(PageBL.GetPageListXml(pages, "pages"));
            }
            return(result);
        }
Exemple #3
0
        private TagBE Tags_Populate(IDataReader dr)
        {
            TagBE tag = new TagBE();

            tag._Type = dr.Read <uint>("tag_type");
            tag.Id    = dr.Read <uint>("tag_id");
            tag.Name  = dr.Read <string>("tag_name");
            return(tag);
        }
Exemple #4
0
        private void UpdateTag(TagBE tag)
        {
            _session.Tags_Update(tag);

            // update tagged pages
            var taggedPages = GetTaggedPages(tag);

            foreach (var page in taggedPages)
            {
                PageBL.Touch(page, _dekiContext.Now);
                _eventSink.PageTagsUpdate(_dekiContext.Now, page, _user);
            }
        }
Exemple #5
0
        public void Tags_Update(TagBE tag)
        {
            Catalog.NewQuery(@" /* Tags_Update */
UPDATE tags SET 
tag_name = ?TAGNAME,
tag_type = ?TAGTYPE
WHERE tag_id = ?TAGID;
")
            .With("TAGNAME", tag.Name)
            .With("TAGTYPE", tag.Type)
            .With("TAGID", tag.Id)
            .Execute();
            _log.DebugFormat("tag '{0}'({1}) updated", tag.Name, tag.Type);
        }
Exemple #6
0
        private List <TagBE> ReadTagsListXml(XDoc tagsDoc)
        {
            List <TagBE> result = new List <TagBE>();

            foreach (XDoc tagDoc in tagsDoc["tag/@value"])
            {
                TagBE tag = ParseTag(tagDoc.Contents);
                if (null != tag)
                {
                    result.Add(tag);
                }
            }
            return(result);
        }
Exemple #7
0
        public bool Tags_ValidateDefineTagMapping(TagBE tag)
        {
            if (tag == null)
            {
                throw new ArgumentNullException("tag");
            }
            if (tag.Type != TagType.DEFINE)
            {
                throw new ArgumentException("Tag has to be of type DEFINE");
            }
            return(Catalog.NewQuery(@" /* Tags_ValidateDefineTagMapping */
DELETE FROM tag_map WHERE tagmap_tag_id = ?TAGID AND (SELECT COUNT(*) FROM pages WHERE page_id = tagmap_page_id) = 0;
SELECT COUNT(*) FROM tag_map WHERE tagmap_tag_id = ?TAGID;")
                   .With("TAGID", tag.Id).ReadAsInt() > 0);
        }
Exemple #8
0
        public TagBE ParseTag(string prefixedName)
        {
            TagBE tag = null;

            // retrieve the tag type
            prefixedName = prefixedName.Trim();
            if (0 < prefixedName.Length)
            {
                tag = new TagBE();
                if (prefixedName.StartsWithInvariantIgnoreCase(TagPrefix.DEFINE))
                {
                    tag.Type = TagType.DEFINE;
                }
                else if (prefixedName.StartsWithInvariantIgnoreCase(TagPrefix.DATE))
                {
                    tag.Type = TagType.DATE;
                }
                else if (prefixedName.StartsWithInvariantIgnoreCase(TagPrefix.USER))
                {
                    tag.Type = TagType.USER;
                }

                // remove the prefix from the tag
                int prefixLength = tag.Prefix.Length;
                if (prefixLength < prefixedName.Length)
                {
                    tag.Name = prefixedName.Substring(prefixLength);
                }
                else
                {
                    throw new TagInvalidArgumentException(prefixedName);
                }

                // the tag is a date and not valid, change its type to text
                if (TagType.DATE == tag.Type)
                {
                    DateTime date;
                    if (!DateTime.TryParseExact(tag.Name, "yyyy-MM-dd", _culture, DateTimeStyles.None, out date))
                    {
                        tag.Type = TagType.TEXT;
                        tag.Name = prefixedName;
                    }
                }
            }

            return(tag);
        }
Exemple #9
0
        public TagBE Tags_GetById(uint tagid)
        {
            TagBE tag = null;

            Catalog.NewQuery(@" /* Tags_GetById */
SELECT `tag_id`, `tag_name`, `tag_type` 
FROM `tags` 
WHERE `tag_id` = ?TAGID;")
            .With("TAGID", tagid)
            .Execute(delegate(IDataReader dr) {
                while (dr.Read())
                {
                    tag = Tags_Populate(dr);
                }
            });
            return(tag);
        }
Exemple #10
0
        public uint Tags_Insert(TagBE tag)
        {
            try {
                return(Catalog.NewQuery(@" /* Tags_Insert */
INSERT INTO tags (tag_name, tag_type) VALUES (?TAGNAME, ?TAGTYPE);
SELECT LAST_INSERT_ID();")
                       .With("TAGNAME", tag.Name)
                       .With("TAGTYPE", tag.Type)
                       .ReadAsUInt() ?? 0);
            } catch (MySqlException e) {
                if (e.Number == 1062)
                {
                    _log.DebugFormat("tag '{0}'({1}) already exists, returning 0", tag.Name, tag.Type);
                    return(0);
                }
                throw;
            }
        }
Exemple #11
0
        public void PutTags(PageBE page, string[] tags)
        {
            List <TagBE> newTags = new List <TagBE>();

            foreach (string tagName in tags)
            {
                TagBE tag = ParseTag(tagName);
                if (null != tag)
                {
                    newTags.Add(tag);
                }
            }
            if (newTags.Count == 0)
            {
                return;
            }
            PutTags(page, newTags);
        }
Exemple #12
0
        public TagBE Tags_GetByNameAndType(string tagName, TagType type)
        {
            TagBE tag = null;

            Catalog.NewQuery(@" /* Tags_GetByNameAndType */
SELECT `tag_id`, `tag_name`, `tag_type`
FROM `tags`
WHERE `tag_name` = ?TAGNAME 
AND `tag_type` = ?TAGTYPE;")
            .With("TAGNAME", tagName)
            .With("TAGTYPE", type)
            .Execute(delegate(IDataReader dr) {
                while (dr.Read())
                {
                    tag = Tags_Populate(dr);
                }
            });
            return(tag);
        }
Exemple #13
0
        public TagBE GetTagFromPathSegment(string tagPathSegment)
        {
            TagBE tag = null;
            uint  id  = 0;

            string tagId = tagPathSegment;

            if (uint.TryParse(tagId, out id))
            {
                tag = _session.Tags_GetById(id);
            }
            else
            {
                if (tagId.StartsWith("="))
                {
                    string prefixedName = tagId.Substring(1);
                    prefixedName = XUri.Decode(prefixedName);
                    TagBE tmpTag = ParseTag(prefixedName);
                    tag = _session.Tags_GetByNameAndType(tmpTag.Name, tmpTag.Type);
                }
            }
            if (tag != null)
            {
                IList <TagBE> tags = new List <TagBE>();
                tags.Add(tag);
                tags = FilterDisallowed(tags);
                if (tags.Count == 0)
                {
                    tag = null;
                }
            }
            if (tag == null)
            {
                throw new TagNotFoundException();
            }

            return(tag);
        }
Exemple #14
0
        public IList <TagBE> Tags_GetByPageId(ulong pageid)
        {
            // retrieve the tags associated with a specified page id
            List <TagBE> tags = new List <TagBE>();

            Catalog.NewQuery(@" /* Tags_GetByPageId */
SELECT `tag_id`, `tag_name`, `tag_type`  
FROM `tag_map`  
JOIN `tags` 
    ON `tag_map`.`tagmap_tag_id`=`tags`.`tag_id`  
WHERE `tagmap_page_id` = ?PAGEID; ")
            .With("PAGEID", (uint)pageid)
            .Execute(delegate(IDataReader dr) {
                while (dr.Read())
                {
                    TagBE t = Tags_Populate(dr);
                    if (t != null)
                    {
                        tags.Add(t);
                    }
                }
            });
            return(tags);
        }
Exemple #15
0
        public IList <TagBE> Tags_GetByQuery(string partialName, TagType type, DateTime from, DateTime to)
        {
            // retrieve the tags associated with a specified page id
            List <TagBE>  tags     = new List <TagBE>();
            bool          hasWhere = false;
            StringBuilder query    = new StringBuilder();

            query.Append(@" /* Tags_GetByQuery */
SELECT `tag_id`, `tag_name`, `tag_type` 
FROM tags ");
            if (!string.IsNullOrEmpty(partialName))
            {
                query.AppendFormat("WHERE tag_name LIKE '{0}%' ", DataCommand.MakeSqlSafe(partialName));
                hasWhere = true;
            }
            if (type != TagType.ALL)
            {
                if (hasWhere)
                {
                    query.Append("AND ");
                }
                else
                {
                    query.Append("WHERE ");
                }

                query.AppendFormat(" tag_type={0} ", (int)type);
                hasWhere = true;
            }
            if ((type == TagType.DATE) && (from != DateTime.MinValue))
            {
                if (hasWhere)
                {
                    query.Append("AND ");
                }
                else
                {
                    query.Append("WHERE ");
                }

                query.AppendFormat("tag_name >= '{0}' ", from.ToString("yyyy-MM-dd"));
                hasWhere = true;
            }
            if ((type == TagType.DATE) && (to != DateTime.MaxValue))
            {
                if (hasWhere)
                {
                    query.Append("AND ");
                }
                else
                {
                    query.Append("WHERE ");
                }

                query.AppendFormat("tag_name <= '{0}' ", to.ToString("yyyy-MM-dd"));
            }

            Catalog.NewQuery(query.ToString())
            .Execute(delegate(IDataReader dr) {
                while (dr.Read())
                {
                    TagBE t = Tags_Populate(dr);
                    tags.Add(t);
                }
            });
            return(tags);
        }
Exemple #16
0
        private DekiResourceBuilder CompareTagSets(List <TagBE> current, List <TagBE> proposed, out List <TagBE> added, out List <uint> removed)
        {
            // perform a subtraction of tags (in both directions) to determine which tags were added and removed from one set to another
            added   = new List <TagBE>();
            removed = new List <uint>();
            TagComparer tagComparer = new TagComparer();

            current.Sort(tagComparer);
            proposed.Sort(tagComparer);

            // determine which pages have been added
            StringBuilder addedSummary = new StringBuilder();
            List <TagBE>  addedList    = new List <TagBE>();

            foreach (TagBE proposedTag in proposed)
            {
                if ((current.BinarySearch(proposedTag, tagComparer) < 0))
                {
                    // only add the tag if is not already being added
                    bool includeTag = (added.BinarySearch(proposedTag, tagComparer) < 0);
                    if (includeTag && (TagType.TEXT == proposedTag.Type))
                    {
                        TagBE proposedTagDefine = new TagBE();
                        proposedTagDefine.Type = TagType.DEFINE;
                        proposedTagDefine.Name = proposedTag.Name;
                        if (0 <= proposed.BinarySearch(proposedTagDefine, tagComparer))
                        {
                            includeTag = false;
                        }
                    }
                    if (includeTag)
                    {
                        added.Add(proposedTag);
                        if (1 < added.Count)
                        {
                            addedSummary.Append(", ");
                        }
                        addedSummary.Append(proposedTag.PrefixedName);
                    }
                }
            }

            // determine which pages have been removed
            StringBuilder removedSummary = new StringBuilder();

            foreach (TagBE currentTag in current)
            {
                if (proposed.BinarySearch(currentTag, tagComparer) < 0)
                {
                    removed.Add(currentTag.Id);
                    if (1 < removed.Count)
                    {
                        removedSummary.Append(", ");
                    }
                    removedSummary.Append(currentTag.PrefixedName);
                }
            }

            // create a diff summary string
            var diffSummary = new DekiResourceBuilder();

            if (0 < addedSummary.Length)
            {
                diffSummary.Append(DekiResources.TAG_ADDED(addedSummary.ToString()));
            }
            if (0 < removedSummary.Length)
            {
                if (!diffSummary.IsEmpty)
                {
                    diffSummary.Append(" ");
                }
                diffSummary.Append(DekiResources.TAG_REMOVED(removedSummary.ToString()));
            }
            return(diffSummary);
        }