SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicStringEscape    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicStringEscape]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicStringEscape]
GO

--==============================================================================================
--==用户函数，给出一个字符串，将其中的单引号 （'） 转换成两个单引号 （''），就是，将其中的单引号逃逸
--==这个 UDF 用在有动态语句存在的场合，用来逃逸输入参数中的单引号，因为如果不逃逸，将发生类似  WHERE GoodsName='Lady's Overcoat' 的尴尬局面；同时可以阻止 SQL 注射攻击
--==为了满足所有场合，该函数的输出输出参数都为 NVARCHAR(4000)
--==============================================================================================
--==输入参数：@InputString -- 将被处理的字符串
--==返回结果：nvarchar -- 逃逸处理后的字符串
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicStringEscape (@InputString NVARCHAR(4000))  

RETURNS nvarchar(4000) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	RETURN REPLACE(@InputString,'''','''''')
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ










GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicStringEscape]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserCurrent    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserCurrent]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserCurrent]
GO

--==============================================================================================
--==用户函数，返回当前用户名
--==实际就是CONVERT(Varchar(20),SYSTEM_USER)
--==============================================================================================
--==输入参数：无
--==返回结果：nvarchar -- 当前用户名
--==目前本 UDF 已经没有实际用处 （可以删除）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserCurrent ()  

RETURNS nvarchar(50) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	RETURN CONVERT(nvarchar(50),SYSTEM_USER)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ









GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserCurrent]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserAdmin    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserAdmin]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserAdmin]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为 Admin  级别的用户
--==对于 Admin  级别的用户，其拥有整个站点所有的权利
--==如果一个用户的 UserRole 名字为 'Admin'，则，他为 Admin  级别的用户
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否 Admin
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserAdmin (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsAdmin INT
	SET @IsAdmin=0	

	/*
	--==========================================
	--==当前用户
	--==========================================
	DECLARE @CurrentUser NVARCHAR(50)

	IF @Name IS NULL
		BEGIN
			SET @CurrentUser=dbo.UDF_UserCurrent()
		END
	ELSE
		BEGIN
			SET @CurrentUser=@Name
		END

	*/

	--==========================================
	--==如果当前用户的 UserRole 的名字为 'Admin' ，则为 Admin
	--==========================================
	IF EXISTS (SELECT [ID] FROM dbo.Users Where [Name]=@Name AND UserRole=dbo.UDF_UserRoleID(N'Admin'))
	BEGIN
		SET @IsAdmin=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsAdmin
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserAdmin]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserRoleID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserRoleID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserRoleID]
GO

--==============================================================================================
--==用户函数，给出 UserRoleName ，查询 UserRole 表，返回 UserRoleID
--==============================================================================================
--==输入参数：@UserRoleName -- 指定的角色名
--==返回结果：Int -- 角色的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserRoleID(@UserRoleName nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @UserRoleID INT
	SET @UserRoleID=0

	--==========================================
	--==当前 @UserRoleName 对应的 UserRole ID
	--==========================================
	IF EXISTS (Select [ID] From dbo.UserRole Where RTRIM(LTRIM([Name]))=RTRIM(LTRIM(@UserRoleName)))
	BEGIN
		SET @UserRoleID=(Select [ID] From dbo.UserRole Where RTRIM(LTRIM([Name]))=RTRIM(LTRIM(@UserRoleName)))
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @UserRoleID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ











GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserRoleID]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserModerator    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserModerator]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserModerator]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为某个 Forum 的 Moderator  用户
--==对于 Moderator  用户，可以全面管理本论坛（浏览，发贴，回复，删除，设置帖子状态，移动复制）
--==如果一个用户出现在某个 Forum 或其上级 Community 的 Moderator 中 （lily,cici），则，他为该 Forum 的 Moderator
--==============================================================================================
--==输入参数：@Name -- 用户名
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- 1/0 是/否 Moderator
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserModerator (@Name nvarchar(50),@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsModerator INT
	SET @IsModerator=0	

	--==========================================
	--==从给定 Forum 中获得 Moderator 项目
	--==========================================
	DECLARE @Moderator NVARCHAR(4000)
	SELECT @Moderator=fp.Moderator FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

	--==========================================
	--==如果当前用户的 Moderator=1 ，且其属于指定 Forum，则为 Moderator
	--==========================================
	IF @Name IN (Select Element From dbo.UDF_PublicSplit(@Moderator,N','))
	BEGIN
		SET @IsModerator=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsModerator
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserModerator]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserCommunity    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserCommunity]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserCommunity]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为 Community  级别的用户
--==只有 Community  级别的用户才可以发帖
--==如果一个用户的 UserRole 名字为 'Community'，则，他为 Community  级别的用户
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否 Community
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserCommunity (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsCommunity INT
	SET @IsCommunity=0	

	/*
	--==========================================
	--==当前用户
	--==========================================
	DECLARE @CurrentUser NVARCHAR(50)

	IF @Name IS NULL
		BEGIN
			SET @CurrentUser=dbo.UDF_UserCurrent()
		END
	ELSE
		BEGIN
			SET @CurrentUser=@Name
		END
	*/
	
	--==========================================
	--==如果当前用户的 UserRole 的名字为 'Community' ，则为 Community
	--==========================================
	IF EXISTS (SELECT [ID] FROM dbo.Users Where [Name]=@Name AND UserRole=dbo.UDF_UserRoleID(N'Community'))
	BEGIN
		SET @IsCommunity=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsCommunity
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserCommunity]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetForumIDFromFollowUpID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetForumIDFromFollowUpID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetForumIDFromFollowUpID]
GO

--==============================================================================================
--==用户函数，给出 FollowUpID ，返回 ForumID
--==============================================================================================
--==输入参数：@FollowUpID -- 跟帖的 ID
--==返回结果：Int -- Forum 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetForumIDFromFollowUpID(@FollowUpID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ForumID INT
	SET @ForumID=0

	--==========================================
	--==获得
	--==========================================
	SET @ForumID=(Select ForumID From dbo.Topic Where [ID] =(select TopicID from dbo.FollowUp where [ID]=@FollowUpID))

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ForumID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ












GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetForumIDFromFollowUpID]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetForumIDFromTopicID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetForumIDFromTopicID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetForumIDFromTopicID]
GO

--==============================================================================================
--==用户函数，给出 TopicID ，返回 ForumID
--==============================================================================================
--==输入参数：@TopicID -- 主题的 ID
--==返回结果：Int -- Forum 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetForumIDFromTopicID(@TopicID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ForumID INT
	SET @ForumID=0

	--==========================================
	--==获得
	--==========================================
	SET @ForumID=(Select ForumID From dbo.Topic Where [ID] =@TopicID)

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ForumID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ













GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetForumIDFromTopicID]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetTopicIDFromFollowUpID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetTopicIDFromFollowUpID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetTopicIDFromFollowUpID]
GO

--==============================================================================================
--==用户函数，给出 FollowUpID ，返回 TopicID
--==============================================================================================
--==输入参数：@FollowUpID -- 跟帖的 ID
--==返回结果：Int -- Topic 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetTopicIDFromFollowUpID(@FollowUpID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @TopicID INT
	SET @TopicID=0

	--==========================================
	--==获得
	--==========================================
	SET @TopicID=(Select TopicID From dbo.FollowUp Where [ID] =@FollowUpID)

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @TopicID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ













GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetTopicIDFromFollowUpID]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicLoginExists    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicLoginExists]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicLoginExists]
GO

--==============================================================================================
--==用户函数，返回给定用户是否存在于  master..syslogins 
--==如果存在，返回 1 ，否则，返回 0
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 存在/不存在
--==该 UDF 目前已经没有实用价值（可以删除）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicLoginExists (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @LoginExists INT
	SET @LoginExists=0	
	
	--==========================================
	--==如果给定用户存在于  master.dbo.syslogins 则，返回 1 
	--==========================================
	IF @Name IN (Select [name] From master.dbo.syslogins)
	BEGIN
		SET @LoginExists=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @LoginExists
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ













GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicLoginExists]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicProfileExists    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicProfileExists]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicProfileExists]
GO

--==============================================================================================
--==用户函数，返回给定用户的 Profile 是否已经存在于 Users 表，
--==三个函数 UDF_PublicLoginExists(),UDF_PublicUserExists(),UDF_PublicProfileExists() 一起用来确定一个本系统用户的存在是否完整（必须 Login,User,Profile都存在才算完整）
--==如果存在，返回 1 ，否则，返回 0
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0  存在/不存在
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-01-28
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicProfileExists (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @ProfileExists INT
	SET @ProfileExists=0		
	
	--==========================================
	--==如果给定用户存在于 Users 表 则，返回 1 
	--==========================================
	IF @Name IN (Select [Name] From dbo.Users) 
	BEGIN
		SET @ProfileExists=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ProfileExists
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicProfileExists]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicUserExists    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicUserExists]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicUserExists]
GO

--==============================================================================================
--==用户函数，返回给定用户是否存在于当前数据库的  sysusers 表
--==如果存在，返回 1 ，否则，返回 0
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 存在/不存在
--==目前该 UDF 已经没有实际用处 （可以删除）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicUserExists (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @UserExists INT
	SET @UserExists=0	
	
	--==========================================
	--==如果给定用户存在于  dbo.sysusers 则，返回 1 
	--==========================================
	IF @Name IN (Select [name] From dbo.sysusers) 
	BEGIN
		SET @UserExists=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @UserExists
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ














GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicUserExists]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicLoginOnline    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicLoginOnline]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicLoginOnline]
GO

--==============================================================================================
--==用户函数，返回给定用户是否在线,  用 SP_WHO （这里实际是从 SP_WHO 中获得了一些代码，因为 UDF 中无法访问 SP 中返回的记录）
--==如果存在，返回 1 ，否则，返回 0
--==============================================================================================
--==输入参数：@Name -- 用户
--==返回结果：Int -- 1/0  在线/不在线
--==目前该 UDF 已经没有实际用处（可以删除）
--==这个 UDF 目前暂停使用，因为我们现在使用 Table 级用户系统，不再使用 master.dbo.sysprocesses 获得用户在线信息，目前我们强迫返回 0 表示不在线。以后可以考虑建立新的在线检查机制
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicLoginOnline (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @LoginOnline INT
	SET @LoginOnline=0	
	
	--==========================================
	--==如果给定用户存在于  master.dbo.sysprocesses 则，返回 1 
	--==========================================
	/*
	IF EXISTS (SELECT spid FROM  master.dbo.sysprocesses WHERE spid >= 0 AND spid <= 32767 AND LTRIM(RTRIM(loginame))=LTRIM(RTRIM(@Name)))
	BEGIN
		SET @LoginOnline=1
	END
	*/

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @LoginOnline
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicLoginOnline]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetCommunityIDFromForumID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetCommunityIDFromForumID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetCommunityIDFromForumID]
GO

--==============================================================================================
--==用户函数，给出 ForumID ，返回 CommunityID
--==============================================================================================
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- Community 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetCommunityIDFromForumID(@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @CommunityID INT
	SET @CommunityID=0

	--==========================================
	--==获得
	--==========================================
	SET @CommunityID=(Select CommunityID From dbo.Forum Where [ID] =@ForumID)

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @CommunityID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ














GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetCommunityIDFromForumID]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserRoleJoin    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserRoleJoin]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserRoleJoin]
GO

--==============================================================================================
--==用户函数，根据给定的用户名，从 Users 表获得该用户所有 UserRole  明细，生成 1,2 一样的字符串
--==这个字符串在具体应用中将被还原成 UserRole 列表
--==被 SP UserAccountSelect 调用
--==用于 UI.Admin.Account.UserAccountUI.cs DataBind() 方法
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：连接起来的字符串（例如：1,2）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserRoleJoin (@Name nvarchar(50))  

RETURNS nvarchar(4000) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--================================
	--==返回的字符串
	--================================
	DECLARE @UserRoles NVARCHAR(4000)

	--================================
	--==将从 Users 返回的 UserRole 用 “，” 连接 （用 COALESCE() 函数实现）
	--================================
	SELECT 

		@UserRoles=COALESCE(@UserRoles+N',',N'') + CONVERT(NVARCHAR(20),UserRole)

	FROM dbo.Users

	WHERE [Name]=@Name


	--================================
	--==结果返回
	--================================
	RETURN @UserRoles
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserRoleJoin]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_ModeratorClean    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_ModeratorClean]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_ModeratorClean]
GO

--==============================================================================================
--==用户函数，在为 Forum 分配 Moderator 的时候，给出的 Moderator 可能不存在，即某些用户可能根本就没有出现在 Users 表
--==这个函数就是将这样的用户从  @Moderator 列表中剔除
--==被 SP ForumSave, ForumModify 调用
--==============================================================================================
--==输入参数：@Moderator -- 斑竹列表（以 “,”  隔开）
--==返回结果：连接起来的字符串（以 “,”  隔开）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_ModeratorClean (@Moderator nvarchar(1000))  

RETURNS nvarchar(1000) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--================================
	--==返回的字符串
	--================================
	DECLARE @ModeratorClean NVARCHAR(1000)

	--================================
	--==净化
	--================================
	SELECT 

		@ModeratorClean=COALESCE(@ModeratorClean+N',',N'')+ [Name] 

	FROM (Select Distinct Element From dbo.UDF_PublicSplit(@Moderator,N',')) mol 

	INNER JOIN (Select Distinct [Name] From dbo.Users) usr ON mol.Element=usr.[Name]


	--================================
	--==结果返回
	--================================
	RETURN @ModeratorClean
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_ModeratorClean]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserDedicatedTo    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserDedicatedTo]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserDedicatedTo]
GO

--==============================================================================================
--==用户函数，返回当前用户是否在某个 Knowledge 的 DedicatedTo 范围内
--==是为 1， 不是为 0
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否 DedicatedTo 范围内
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserDedicatedTo (@Name nvarchar(50), @DedicatedTo NVARCHAR(4000))

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsDedicatedTo INT
	SET @IsDedicatedTo=0	

	--==========================================
	--==查看当前用户是否位于 DedicatedTo 列表
	--==========================================
	IF @Name IN (Select [User] From dbo.UDF_UserResolve(@DedicatedTo))
	BEGIN
		SET @IsDedicatedTo=1
	END
	
	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsDedicatedTo
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserDedicatedTo]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetForumIDFromCommunityID    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetForumIDFromCommunityID]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetForumIDFromCommunityID]
GO

--==============================================================================================
--==用户函数，给出 CommunityID ，返回该 Community 下第一个可以返回的 Forum 的 ID
--==要考虑不同权限
--==============================================================================================
--==输入参数：@CommunityID -- 社区的 ID
--==返回结果：Int -- Forum 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetForumIDFromCommunityID(@User nvarchar(50),@CommunityID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ForumID INT
	SET @ForumID=0

	--==========================================
	--==获得
	--==========================================
	SET @ForumID=(Select Top 1 fo.[ID] FROM dbo.Forum fo Where fo.CommunityID = @CommunityID And dbo.UDF_ForumReadable(@User,fo.[ID])=1 Order By fo.Serial)

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ForumID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetForumIDFromCommunityID]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_KnowledgeCommentsPermission    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_KnowledgeCommentsPermission]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_KnowledgeCommentsPermission]
GO


--==============================================================================================
--==用户函数，返回给定知识是否在当前用户 context 可以评论
--==值 0： 任何用户都不可以评论（客户端不输出评论界面）（注：none 拥有绝对权威，只要 CommentsPermission 中包含一个 none，则不管其它权限如何定义，都禁止评论）
--==值 1： 任何用户都可以评论（客户端输出评论输入框和一个用户名框，用户可以随意输入用户名，不参与验证）
--==值 2： 当前用户已经登陆，同时符合评论权限（客户端输出一个评论输入框即可，不需要输出用户密码输入框，系统自动调用当前登陆帐户信息）
--==值 3： 当前用户没有登陆，但当前知识允许指定用户评论（客户端输出评论界面，同时输出用户名，密码输入框，用户除了输入评论外，还要输入帐户信息）
--==============================================================================================
--==输入参数：@KnowledgeID -- 给定知识的 ID
--==输入参数：@User -- 给定用户
--==返回结果：Int -- 0/1/2 /3
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--==============================================================================================

CREATE FUNCTION dbo.UDF_KnowledgeCommentsPermission (@KnowledgeID INT, @User NVARCHAR(50))

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @Result INT
	SET @Result=0	

	--==========================================
	--==给定知识的 CommentsPermission 属性  （使用 View_KnowledgePermission 获取累积的 View_KnowledgePermission）
	--==========================================
	DECLARE @CommentsPermission  NVARCHAR(4000)

	SELECT @CommentsPermission =RTRIM(LTRIM(nowp.CommentsPermission))
	FROM dbo.Knowledge now 
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]	
	WHERE [ID]=@KnowledgeID
	
	--==========================================
	--==各种情形
	--==========================================
	--IF LOWER(@CommentsPermission)=N'none'
	IF N'none' IN (Select [Element] From dbo.UDF_PublicSplit(@CommentsPermission,N','))

		BEGIN
			--==========================================
			--==CommentsPermission=N'none'，则肯定不允许评论 （即使是 admin 也不允许）（none 拥有绝对权威，不管 MainDirectory, SubDirectory, PageDirectory, Knowledge 如何定义，只要出现一个 none，所有其它定义自动失效，none 起作用）
			--==========================================
			SET @Result=0	
		END

	--ELSE IF (@CommentsPermission IS NULL) OR (@CommentsPermission=N'') OR (@CommentsPermission=N'*' )
	--ELSE IF (@CommentsPermission IS NULL) OR @CommentsPermission=N''
	ELSE IF REPLACE(@CommentsPermission,N',',N'')=N''

		BEGIN
			--==========================================
			--==CommentsPermission 为空字符则肯定允许评论  （任何人都允许，即使不登陆）
			--==========================================
			SET @Result=1
		END

	ELSE IF dbo.UDF_UserAdmin(@User)=1
	--ELSE IF (@CommentsPermission=N'*'  AND dbo.UDF_UserClient(@User)=1) OR dbo.UDF_UserAdmin(@User)=1

		BEGIN
			--==========================================
			--==当前用户是 Admin，则允许评论 （已经登陆）
			--==========================================
			SET @Result=2
		END

	--ELSE IF @User IN (Select [Element] From dbo.UDF_PublicSplit(@CommentsPermission,N','))
	ELSE IF @User IN (Select [User] From dbo.UDF_UserResolve(@CommentsPermission))

		BEGIN
			--==========================================
			--==当前用户位于允许评论用户列表中，则允许评论（已经登陆）
			--==========================================
			SET @Result=2
		END

	ELSE

		BEGIN
			--==========================================
			--==其它情形，指示客户端 Render 用户名，密码输入框，同时 Render 评论输入框，用户输入 Comments 的同时，输入用户名密码，让系统在保存评论之前，先验证用户是否合法
			--==========================================
			SET @Result=3	
		END


	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @Result
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




































GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_KnowledgeCommentsPermission]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserChiefEditor    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserChiefEditor]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserChiefEditor]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为 Chief Editor
--==对于 Chief Editor  级别的用户，其拥有整个站点的内容编辑权限
--==如果一个用户的 UserRole 名字为 ' Chief Editor'，则，他为  Chief Editor  级别的用户
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否  Chief Editor
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-16 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserChiefEditor (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsChiefEditor INT
	SET @IsChiefEditor=0	

	--==========================================
	--==如果当前用户的 UserRole 的名字为 'Chief Editor' ，则为 Chief Editor
	--==========================================
	IF EXISTS (SELECT [ID] FROM dbo.Users Where [Name]=@Name AND UserRole=dbo.UDF_UserRoleID(N'Chief Editor'))
	BEGIN
		SET @IsChiefEditor=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsChiefEditor
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ



















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserChiefEditor]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserAdminEditor    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserAdminEditor]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserAdminEditor]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为 Admin 或 Chief Editor, Column Editor   级别的用户
--==在 SP KnowledgeGet, SP MenuMainDirectorySubDirectoryPageDirectory 等场合，我们用得到 这个 级别的用户
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否 AdminEditor
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-17 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserAdminEditor (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsAdminEditor INT
	SET @IsAdminEditor=0	

	--==========================================
	--==如果当前用户的 UserRole 的名字为 'Admin'  或 'Chief Editor' 或 'Column Editor'，则为 AdminEditor
	--==========================================
	IF EXISTS (SELECT [ID] FROM dbo.Users Where [Name]=@Name AND UserRole IN (dbo.UDF_UserRoleID(N'Admin'),dbo.UDF_UserRoleID(N'Chief Editor'),dbo.UDF_UserRoleID(N'Column Editor')))
	BEGIN
		SET @IsAdminEditor=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsAdminEditor
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserAdminEditor]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserColumnEditor    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserColumnEditor]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserColumnEditor]
GO

--==============================================================================================
--==用户函数，返回当前用户是否为 Column Editor
--==本 UDF 的作用是告诉 Menu 对象（结合 UDF_UserChiefEditor），当前用户属于 Editor
--==如果一个用户的 UserRole 名字为 ' Column Editor'，则，他为  Column Editor  级别的用户
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否  Column Editor
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-16 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserColumnEditor (@Name nvarchar(50))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsColumnEditor INT
	SET @IsColumnEditor=0	

	--==========================================
	--==如果当前用户的 UserRole 的名字为 'Column Editor' ，则为 Column Editor
	--==========================================
	IF EXISTS (SELECT [ID] FROM dbo.Users Where [Name]=@Name AND UserRole=dbo.UDF_UserRoleID(N'Column Editor'))
	BEGIN
		SET @IsColumnEditor=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsColumnEditor
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_UserColumnEditor]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GroupMembersJoin    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GroupMembersJoin]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GroupMembersJoin]
GO

--==============================================================================================
--==用户函数，根据给定的 Group 名，从 UserGroups 表获得该 Group 所有成员，生成 eleanor,jackie,henry 一样的字符串
--==被 SP UserGroupSelect 调用
--==用于 UI.Admin.Account.UserGroupUI.cs DataBind() 方法
--==============================================================================================
--==输入参数：@GroupName -- 组名
--==返回结果：连接起来的字符串（例如：eleanor,jackie,henry）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--==本 UDF 因为 GroupMembers 可能数量庞大的缘故，暂时弃用（如果某个 Group 下的用户数量庞大，则这里返回的结果可能超过 nvarchar(4000)）
--==============================================================================================

CREATE FUNCTION dbo.UDF_GroupMembersJoin (@GroupName nvarchar(50))  

RETURNS nvarchar(4000) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--================================
	--==返回的字符串
	--================================
	DECLARE @GroupMembers NVARCHAR(4000)

	--================================
	--==将从 UserGroups 返回的 GroupMember 用 “,” 连接 （用 COALESCE() 函数实现）
	--================================
	SELECT 

		@GroupMembers=COALESCE(@GroupMembers+N',',N'') + CONVERT(NVARCHAR(50),[User])

	FROM dbo.UserGroups ugs
	LEFT JOIN dbo.UserGroup ug ON ug.[ID]=ugs.UserGroupID

	WHERE ug.GroupName=@GroupName


	--================================
	--==结果返回
	--================================
	RETURN @GroupMembers
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GroupMembersJoin]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_EditorDedicatedTo    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_EditorDedicatedTo]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_EditorDedicatedTo]
GO

--==============================================================================================
--==用户函数，返回当前用户是否在某个 Directory (MainDirectory, SubDirectory, PageDirectory, Knowledge)  的 Editor  范围内
--==是为 1， 不是为 0
--==该 UDF 和 UDF_UserDedicatedTo 效用是一样的，但用在 Editor 场合更语义一些
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：Int -- 1/0 是/否 Editor 范围内
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--==============================================================================================

CREATE FUNCTION dbo.UDF_EditorDedicatedTo (@Name nvarchar(50), @DedicatedTo NVARCHAR(4000))

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsDedicatedTo INT
	SET @IsDedicatedTo=0	

	--==========================================
	--==查看当前用户是否位于 DedicatedTo 列表 （同时，也要保证用户确实是 AdminEditor 权限，防止为某个栏目分配编辑权限时输入了某个用户，然而该用户却并非 AdminEditor 情形）
	--==========================================
	IF (@Name IN (Select [User] From dbo.UDF_UserResolve(@DedicatedTo))) AND (dbo.UDF_UserAdminEditor(@Name)=1)
	BEGIN
		SET @IsDedicatedTo=1
	END
	
	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsDedicatedTo
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ





GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_EditorDedicatedTo]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetOverviewPageDirectory    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetOverviewPageDirectory]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetOverviewPageDirectory]
GO

--==============================================================================================
--==用户函数，给出 MainDirectory | SubDirectory Flag, 以及其 ID，返回该 MainDirectory 或 SubDirectory 的 Overview PageDirectory ID
--==============================================================================================
--==输入参数：@KnowledgeDirectory - MainDirectory | SubDirectory
--==输入参数：@KnowledgeItem - 其 ID
--==返回结果：其 Overview PageDirectory 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-04-08
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetOverviewPageDirectory(@KnowledgeDirectory nvarchar(100),@KnowledgeItem int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ReturnValue INT
	SET @ReturnValue=0

	--==========================================
	--==如果是 MainDirectory
	--==========================================
	IF @KnowledgeDirectory=N'MainDirectory'

	BEGIN
		SELECT 
		
			@ReturnValue=pd.[ID]
	
		FROM dbo.PageDirectory pd
		LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
		LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
		
		WHERE pd.Overview=1 AND sd.Overview=1 AND md.[ID]=@KnowledgeItem
	END

	--==========================================
	--==如果是 SubDirectory
	--==========================================
	ELSE IF @KnowledgeDirectory=N'SubDirectory'

	BEGIN
		SELECT 
		
			@ReturnValue=pd.[ID]
	
		FROM dbo.PageDirectory pd
		LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
		
		WHERE pd.Overview=1 AND sd.[ID]=@KnowledgeItem
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ReturnValue
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ














GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetOverviewPageDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicCultures    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicCultures]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicCultures]
GO

--==============================================================================================
--==用户函数，返回系统 Cultures 列表
--==============================================================================================
--==输入参数：无
--==返回结果：表 -- 语种列表 （en-us  |  zh-cn  | zh-tw）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-03-22
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicCultures()  

--============================================
--==返回的表结构
--============================================
RETURNS @Cultures TABLE 
					(
					Culture nvarchar(100) COLLATE database_default
					)

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 

	--==========================================
	--==从 Option 表返回 Cultures 记录
	--==========================================
	DECLARE @CultureSetting NVARCHAR(4000)
	SELECT @CultureSetting=CONVERT(NVARCHAR(4000),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'Cultures'

	--==========================================
	--==返回语种列表
	--==========================================
	INSERT @Cultures(Culture) SELECT LEFT(CONVERT(NVARCHAR(4000),[Element]),CHARINDEX(N':',CONVERT(NVARCHAR(4000),[Element]))-1) FROM dbo.UDF_PublicSplit(@CultureSetting,N',')

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ






























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  SELECT  ON [dbo].[UDF_PublicCultures]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_MultiCultureOptionValueGet    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_MultiCultureOptionValueGet]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_MultiCultureOptionValueGet]
GO

--==============================================================================================
--==用户函数，从 Option 表返回指定 Key 指定 Culture 下的 Value
--==需要解析类似 <culture name="zh-cn" value="" /><culture name="" value="en-us" /> 一类的值
--==本 UDF 是 ASPX 端 CommonHelper.MultiCultureOptionValueGet() 函数的 SQL 版 (但输入参数不一样)
--==注意：本 UDF 有两个限制：1. 只能解析总长度在 4000 字符之内的值；  2.不能 unescape 值中的 XML escape 字符 （多语种 Option Value 是经过了 XML escape 处理的） ： 因此，该 UDF 的应用范围只限于 SP SubDirectoryCreateOverviewPageDirectoryContent
--==============================================================================================
--==输入参数：@Key nvarchar(100) - Option 表中的哪个项
--==输入参数：@Culture nvarchar(100) - 哪个语种下的
--==返回结果：nvarchar(4000) -- 该 Option 在 @Culture 语种下的 value
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-03-22
--==============================================================================================

CREATE FUNCTION dbo.UDF_MultiCultureOptionValueGet (@Key nvarchar(100),@Culture nvarchar(100))  

RETURNS nvarchar(4000) 

AS  


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 

	--===========================================
	--==结果变量
	--===========================================
	DECLARE @ReturnValue NVARCHAR(4000)
	SET @ReturnValue=N''

	--===========================================
	--==结果变量
	--===========================================
	DECLARE @Value NVARCHAR(4000)
	SELECT @Value=opt.[Value] FROM dbo.[Option] opt WHERE opt.[Key]=@Key

	--===========================================
	--==使用 Split 函数，将 @Value 分解成 单个 Instance 并构建 CURSOR
	--===========================================
	DECLARE @ValueCurrent NVARCHAR(4000)

	DECLARE Value_Cursor CURSOR FOR SELECT [Element] FROM dbo.UDF_PublicSplit(@Value,N'/><culture')
	OPEN Value_Cursor
	FETCH NEXT FROM Value_Cursor INTO @ValueCurrent

	WHILE @@FETCH_STATUS=0
	BEGIN

		--===========================================
		--==从当前语种值分解出 Value
		--===========================================
		DECLARE @CulturePattern NVARCHAR(100)
		SELECT @CulturePattern=N'name="' + @Culture + N'"'

		IF CHARINDEX(@CulturePattern,@ValueCurrent)>0
		BEGIN

			--===========================================
			--==获取 
			--===========================================
			DECLARE @ValuePosition INT
			SELECT @ValuePosition=CHARINDEX(N'value="',@ValueCurrent)

			--===========================================
			--==解析
			--===========================================
			SELECT @ReturnValue=REPLACE(REPLACE(SUBSTRING(@ValueCurrent,@ValuePosition,LEN(@ValueCurrent)-@ValuePosition+1),N'value="',N''),N'"',N'')

			--===========================================
			--==假如字符串最后还包括 "/>" 部分，则去掉
			--===========================================
			IF RIGHT(@ReturnValue,2)=N'/>'

			BEGIN
				
				SELECT @ReturnValue=LEFT(@ReturnValue,LEN(@ReturnValue)-2)

			END

		END

		--===========================================
		--==下一个
		--===========================================
		FETCH NEXT FROM Value_Cursor INTO @ValueCurrent

	END

	CLOSE Value_Cursor
	DEALLOCATE Value_Cursor


	--===========================================
	--==返回结果
	--===========================================
	RETURN @ReturnValue

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ










GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_MultiCultureOptionValueGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicListStrictMatch    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicListStrictMatch]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicListStrictMatch]
GO

--==============================================================================================
--==用户函数，给定两个列表，看看第一个列表中的项目是否全部包含在第二个列表的项目中
--==该 UDF 用于 SP ResourcesQueryByTag ，在该 SP 中，我们将借助这个 UDF 判断某个被搜索的 Tag 列表是否完整包含在某个 Resource 资源的 Tag 中
--==比如，我们想返回 Tag 中包含 N'Products+Video+HD' 的资源（意思是 Tag 中同时包含 Products + Video + HD），而资源中有一个其 Tag 为 N'Products,Video,HD,RMVB' 的资源，则，该资源将被返回，而如果只有 N'Products,Video,RMVB' 的资源，该资源将不会被返回
--==系统在针对 Tag 进行资源搜索的时候，有两种搜索模式，第一种：搜索 Tag 字符串表示为 N'Products,Video,HD'，则只要其 Tag 中包含这三个关键词中任何一个的资源都会被返回； 第二种：N'Products+Video+HD'，则表示必须同时包含这三个关键词的资源才会被返回
--==如果匹配，返回 1 ，否则，返回 0
--==============================================================================================
--==输入参数：@List1 -- 被查找的列表
--==输入参数：@List1Delimiter -- 被查找的列表的分隔符
--==输入参数：@List2 -- 目标列表
--==输入参数：@List2Delimiter -- 目标列表的分隔符
--==返回结果：Int -- 1/0  严格匹配 / 不匹配
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-07-11
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicListStrictMatch (@List1 nvarchar(1000),@List1Delimiter nvarchar(100),@List2 nvarchar(1000),@List2Delimiter nvarchar(100))  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @Match INT
	SET @Match=0	

	--==========================================
	--==临时变量
	--==========================================
	DECLARE @Count1 INT
	DECLARE @Count2 INT

	--==========================================
	--==将 @List1 进行 Split 处理，看看返回多少个单独的项目（非空的）
	--==========================================
	SELECT @Count1=COUNT(l1.[Element]) FROM dbo.UDF_PublicSplit(@List1,@List1Delimiter) l1 WHERE l1.[Element]<>N''

	--==========================================
	--==然后将 @List1 和 @List2 进行 Join 并对比，返回二者匹配的项目数（非空的）
	--==========================================
	SELECT 

		@Count2=COUNT(l1.[Element])

	FROM dbo.UDF_PublicSplit(@List1,@List1Delimiter) l1
	LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@List2,@List2Delimiter)) l2 on (RTRIM(LTRIM(l2.[Element])) LIKE (N'%' + RTRIM(LTRIM(l1.[Element])) + N'%')) 

	WHERE l2.[Element] IS NOT NULL AND l2.[Element]<>N'' AND l1.[Element]<>N''

	--==========================================
	--==比较 @Count1 和 @Count2，如果二者相等，则匹配，否则不匹配
	--==========================================
	IF @Count1=@Count2

	BEGIN
		SET @Match=1
	END
	
	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @Match
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ






















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicListStrictMatch]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetOverviewSubDirectory    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetOverviewSubDirectory]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetOverviewSubDirectory]
GO

--==============================================================================================
--==用户函数，给出 MainDirectory  ID，返回该 MainDirectory 的 Overview SubDirectory ID
--==============================================================================================
--==输入参数：@KnowledgeItem - 其 ID
--==返回结果：其 Overview SubDirectory 的 ID
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-07-20
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetOverviewSubDirectory(@KnowledgeItem int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ReturnValue INT
	SET @ReturnValue=0


	SELECT 
		
		@ReturnValue=sd.[ID]
	
	FROM dbo.SubDirectory sd
	LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
		
	WHERE sd.Overview=1 AND md.[ID]=@KnowledgeItem


	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ReturnValue
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetOverviewSubDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_GetOverviewPageDirectoryName    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_GetOverviewPageDirectoryName]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_GetOverviewPageDirectoryName]
GO

--==============================================================================================
--==用户函数，给出 MainDirectory | SubDirectory Flag, 以及其 ID，返回该 MainDirectory 或 SubDirectory 的 Overview PageDirectory Name
--==============================================================================================
--==输入参数：@KnowledgeDirectory - MainDirectory | SubDirectory
--==输入参数：@KnowledgeItem - 其 ID
--==返回结果：其 Overview PageDirectory 的 Name
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-08-08
--==============================================================================================

CREATE FUNCTION dbo.UDF_GetOverviewPageDirectoryName(@KnowledgeDirectory nvarchar(100),@KnowledgeItem int)  

RETURNS NVARCHAR(100)

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果返回变量
	--==========================================
	DECLARE @ReturnValue NVARCHAR(100)
	SET @ReturnValue=N''

	--==========================================
	--==如果是 MainDirectory
	--==========================================
	IF @KnowledgeDirectory=N'MainDirectory'

	BEGIN
		SELECT 
		
			@ReturnValue=pd.[Name]
	
		FROM dbo.PageDirectory pd
		LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
		LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
		
		WHERE pd.Overview=1 AND sd.Overview=1 AND md.[ID]=@KnowledgeItem
	END

	--==========================================
	--==如果是 SubDirectory
	--==========================================
	ELSE IF @KnowledgeDirectory=N'SubDirectory'

	BEGIN
		SELECT 
		
			@ReturnValue=pd.[Name]
	
		FROM dbo.PageDirectory pd
		LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
		
		WHERE pd.Overview=1 AND sd.[ID]=@KnowledgeItem
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @ReturnValue
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_GetOverviewPageDirectoryName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicResolveFileName    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicResolveFileName]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicResolveFileName]
GO

--==============================================================================================
--==用户函数，从 /Resource/Initial/Content/remind.jpg 一类的文件路径中分离出 remind.jpg 文件名
--==被 SP ResourcesApproveQuery 调用
--==============================================================================================
--==输入参数：@LogicalPath
--==返回结果：FileName
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-09-09
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicResolveFileName (@LogicalPath nvarchar(2000))  

RETURNS nvarchar(2000) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--================================
	--==返回的字符串
	--================================
	DECLARE @FileName NVARCHAR(2000)

	--================================
	--==进行可能的 NULL 处理
	--================================
	SELECT @LogicalPath=ISNULL(@LogicalPath,N'')

	--================================
	--==如果 LogicalPath 中根本不存在 N'/' 则直接返回（说明是纯粹的文件名 - 这种情形理论上是不会发生的）
	--================================
	IF CHARINDEX(N'/',@LogicalPath)=0
	
	BEGIN

		--================================
		--==直接返回
		--================================
		SELECT @FileName=@LogicalPath

	END

	ELSE

	BEGIN

		--================================
		--==取反
		--================================
		DECLARE @ReverseLogicalPath NVARCHAR(2000)
		SELECT @ReverseLogicalPath=REVERSE(@LogicalPath)

		--================================
		--==解析
		--================================
		SELECT @FileName=REVERSE(LEFT(@ReverseLogicalPath,CHARINDEX(N'/',@ReverseLogicalPath)-1))

	END

	--================================
	--==结果返回
	--================================
	RETURN @FileName
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_PublicResolveFileName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicLoginSpid    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicLoginSpid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicLoginSpid]
GO

--==============================================================================================
--==用户函数，返回给定用户的 SPID 列表,  用 SP_WHO （这里实际是从 SP_WHO 中获得了一些代码，因为 UDF 中无法访问 SP 中返回的记录）
--==该函数用于 SP AdminUserAccountDelete ，在删除用户前，首先检查其 SPID ，如果存在，则首先终止这些 SPID 所代表的 Connection 进程 （就是强迫用户下线），然后才可以删除用户
--==如果参数 @Name='' ，则返回整个 数据库中所有 SPID （暂时没有用处）
--==============================================================================================
--==输入参数：@Name -- 用户名
--==返回结果：表 -- Spid 记录表（可能一个，可能多个）
--==目前该 UDF 已经没有实际用处 （可以删除）
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_PublicLoginSpid (@Name nvarchar(50))  

--==========================================
--==返回的表结构
--==========================================
RETURNS @Spid TABLE
			(
			SPID SMALLINT
			)

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==分 @Name 等于合法用户名和空值两种情形
	--==========================================
	IF LEN(LTRIM(RTRIM(@Name)))>0
		BEGIN
			--==========================================
			--==从  master.dbo.sysprocesses 查获指定用户所有 SPID  （可能多个）
			--==========================================
			INSERT @Spid(SPID) SELECT spid FROM  master.dbo.sysprocesses WHERE spid >= 0 AND spid <= 32767 AND LTRIM(RTRIM(loginame))=LTRIM(RTRIM(@Name))
		END
	ELSE
		BEGIN
			--==========================================
			--==从  master.dbo.sysprocesses 查获整个数据库所有 SPID  （可能多个）
			--==========================================
			INSERT @Spid(SPID) SELECT spid FROM  master.dbo.sysprocesses WHERE spid >= 0 AND spid <= 32767 AND dbid=db_id(DB_NAME())
		END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ















GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  SELECT  ON [dbo].[UDF_PublicLoginSpid]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_PublicSplit    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_PublicSplit]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_PublicSplit]
GO

--============================================================================================
--==这个UDF模拟 Split() 函数功能，SQL Server 中并没有数组数据类型，这个函数返回“表”数据类型
--==注：该函数不支持 @Delimiter 为空格的情形，因为这种情况下，不管有多少空格 LEN(@Delimiter) 始终为 0
--==将被分隔符分隔的字符串分开，返回分隔符之间的单元 
--============================================================================================
--==输入参数：@DelimitedString -- 被处理的字符串
--==输入参数：@Delimiter -- 分隔符 （不支持空格情形）
--==返回结果：表 -- 拆分出来的单元列表
--============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--============================================================================================

CREATE FUNCTION dbo.UDF_PublicSplit (@DelimitedString nvarchar(4000), @Delimiter nvarchar(100))

--============================================
--==返回的表结构
--============================================
RETURNS @Array TABLE 
			(
			[ID] int IDENTITY(1,1), 
			Element nvarchar(1000) COLLATE database_default
			)

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN
	--------------------------------------------------------
	--本地变量
	--------------------------------------------------------
	DECLARE @Index INT
	DECLARE @Start INT
	DECLARE @DelimiterSize INT

	--------------------------------------------------------
	--分隔符的长度
	--------------------------------------------------------
	SET @DelimiterSize = LEN(@Delimiter)
	
	--------------------------------------------------------
	--遍历被分隔字符串，将每个分隔单元添加到表
	--------------------------------------------------------
	WHILE LEN(@DelimitedString) > 0
	BEGIN
		SET @Index = CHARINDEX(@Delimiter, @DelimitedString)

		--------------------------------------------------------
		--如果只有一个单独的分隔单元，即并没有分隔标志出现在被分割字符串
		--------------------------------------------------------
		IF @Index = 0
			BEGIN
				INSERT INTO @Array(Element) VALUES(@DelimitedString)
				BREAK
			END

		--------------------------------------------------------
		--如果有多个分隔单元
		--------------------------------------------------------
		ELSE
			BEGIN
				INSERT INTO @Array(Element) VALUES(SUBSTRING(@DelimitedString, 1,@Index - 1))
				SET @Start = @Index + @DelimiterSize
				SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1)
			END
	END
	
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ










GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  SELECT  ON [dbo].[UDF_PublicSplit]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserResolve    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserResolve]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserResolve]
GO

--============================================================================================
--==这个 UDF 将 N'its,eleanor,john,市场部,总部,北美组,timothy' 一类的，混合了具体用户和组的用户列表，最终解析出具体用户
--==即：将组中的用户解析出来，加入到列表中（剔除 重复的），输出用户表
--============================================================================================
--==输入参数：@UserList -- 混合了具体用户和组的用户列表
--==返回结果：表 -- 最终解析出来的用户表
--============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--============================================================================================

CREATE FUNCTION dbo.UDF_UserResolve (@UserList nvarchar(4000))

--============================================
--==返回的表结构
--============================================
RETURNS @Array TABLE 
			(
			[User] nvarchar(50) COLLATE database_default
			)

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN
	--============================================
	--==解析
	--============================================	
	INSERT INTO @Array

	SELECT DISTINCT

	[User]=

		CASE 
			WHEN ugs.[User] IS NULL THEN split.[Element]  ELSE ugs.[User]
		END


	FROM dbo.UDF_PublicSplit(@UserList,N',') split 

	LEFT JOIN dbo.View_UserGroups ugs ON ugs.GroupName=split.Element  AND ugs.[User]<>N''

	WHERE split.[Element]<>N'' 

	--============================================
	--==返回
	--============================================	
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ













GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  SELECT  ON [dbo].[UDF_UserResolve]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_UserRoles    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_UserRoles]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_UserRoles]
GO

--==============================================================================================
--==用户函数，返回用户所可以操作的角色列表
--==这个 UDF 暂时没有用场
--==============================================================================================
--==输入参数：@Name -- 给定的用户名
--==返回结果：表 -- 该用户覆盖的角色列表
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-10-26 
--==============================================================================================

CREATE FUNCTION dbo.UDF_UserRoles(@Name nvarchar(50))  

--============================================
--==返回的表结构
--============================================
RETURNS @UserRoles TABLE 
					(
					[ID] int,
					UserRole nvarchar(50) COLLATE database_default,
					UserRoleC nvarchar(50) COLLATE database_default
					)

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	/*
	--==========================================
	--==当前用户
	--==========================================
	DECLARE @CurrentUser NVARCHAR(50)

	IF @Name IS NULL
		BEGIN
			SET @CurrentUser=dbo.UDF_UserCurrent()
		END
	ELSE
		BEGIN
			SET @CurrentUser=@Name
		END
	*/

	--==========================================
	--==返回用户角色列表
	--==========================================
	INSERT @UserRoles([ID],UserRole,UserRoleC) SELECT ur.[ID],ur.[Name],ur.NameC FROM dbo.UserRole ur WHERE ur.[ID] IN (Select UserRole From dbo.Users Where [Name]=@Name)

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ






























GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  SELECT  ON [dbo].[UDF_UserRoles]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_ForumReadable    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_ForumReadable]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_ForumReadable]
GO

--==============================================================================================
--==用户函数，返回给定用户是否可以浏览给定论坛
--==有以下情形下之一的，Forum 是可以浏览的：
--==该 Forum 以及其上级 Community 的 ReadPermission 为空
--==该 Forum 或其上级 Community 设置了 Public 属性
--==当前用户是 Admin
--==当前用户是该 Forum 的 Moderator
--==当前用户落在该 Forum 或其上级 Community 的 ReadPermission 清单中
--==============================================================================================
--==输入参数：@Name -- 用户名
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- 1/0 是/否
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_ForumReadable (@Name nvarchar(50),@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsReadable INT
	SET @IsReadable=0	

	--==========================================
	--==从给定 Forum 中获得 ReadPermission 项目
	--==========================================
	DECLARE @ReadPermission NVARCHAR(4000)
	SELECT @ReadPermission=fp.ReadPermission FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

	--==========================================
	--==如果当前用户位于 @ReadPermission 清单，或者，当前用户是 Admin，或者当前用户是当前 Forum 的 Moderator， 或者当前 Forum 的 @ReadPermission 为空，则当前用户拥有 Read 权限
	--==注：这里和 UDF_ForumTopicWritable 以及 UDF_ForumFollowUpWritable 不同，不需要  @Name<>N'' （因为未登录用户也可以浏览 @ReadPermission 为空的论坛，但不能发贴和跟贴）
	--==========================================
	IF (dbo.UDF_UserDedicatedTo(@Name,@ReadPermission)=1) OR (REPLACE(@ReadPermission,N',',N'')=N'') OR (@ReadPermission=Null) OR (@ReadPermission Is Null) OR (dbo.UDF_UserAdmin(@Name)=1) OR (dbo.UDF_UserModerator(@Name,@ForumID)=1) OR (dbo.UDF_ForumPublic(@ForumID)=1)
	BEGIN
		SET @IsReadable=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsReadable
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ











GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_ForumReadable]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_ForumPublic    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_ForumPublic]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_ForumPublic]
GO

--==============================================================================================
--==用户函数，返回给定论坛是否 Public
--==有以下情形下之一的，Forum 是 Public：
--==该 Forum 的 Public 属性是 True
--==该 Forum 的上级 Community 的 Public 属性是 True
--==============================================================================================
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- 1/0 是/否
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_ForumPublic(@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsPublic INT
	SET @IsPublic=0	

	--==========================================
	--==从给定 Forum 中获得 Public 项目
	--==========================================
	DECLARE @Public NVARCHAR(4000)
	SELECT @Public=fp.[Public] FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

	--==========================================
	--==如果当前用户位于 @ReadPermission 清单，或者，当前用户是 Admin，或者当前用户是当前 Forum 的 Moderator， 或者当前 Forum 的 @ReadPermission 为空，则当前用户拥有 Read 权限
	--==========================================
	IF EXISTS (Select [ID] From dbo.UDF_PublicSplit(@Public,N',') Where [Element]=N'true')
	BEGIN
		SET @IsPublic=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsPublic
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ






GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_ForumPublic]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_ForumTopicWritable    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_ForumTopicWritable]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_ForumTopicWritable]
GO

--==============================================================================================
--==用户函数，返回给定用户是否可以在给定论坛下发帖
--==有以下情形下之一的，Forum 是可以发贴的：
--==该 Forum 以及其上级 Community 的 TopicWritePermission 为空
--==该 Forum 或其上级 Community 设置了 Public 属性
--==当前用户是 Admin
--==当前用户是该 Forum 的 Moderator
--==当前用户落在该 Forum 或其上级 Community 的 TopicWritePermission 清单中
--==============================================================================================
--==输入参数：@Name -- 用户名
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- 1/0 是/否
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_ForumTopicWritable (@Name nvarchar(50),@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsTopicWritable INT
	SET @IsTopicWritable=0	

	--==========================================
	--==从给定 Forum 中获得 TopicWritePermission 项目
	--==========================================
	DECLARE @TopicWritePermission NVARCHAR(4000)
	SELECT @TopicWritePermission=fp.TopicWritePermission FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

	--==========================================
	--==如果当前用户位于 @TopicWritePermission 清单，或者，当前用户是 Admin，或者当前用户是当前 Forum 的 Moderator， 或者当前 Forum 的 @TopicWritePermission 为空，或者当前 Forum 或其上级 Community 为 Public，则当前用户拥有 Topic Write 权限
	--==========================================
	IF (dbo.UDF_UserDedicatedTo(@Name,@TopicWritePermission)=1) OR (REPLACE(@TopicWritePermission,N',',N'')=N'' And @Name<>N'') OR (@TopicWritePermission=Null And @Name<>N'') OR (@TopicWritePermission Is Null And @Name<>N'') OR (dbo.UDF_UserAdmin(@Name)=1) OR (dbo.UDF_UserModerator(@Name,@ForumID)=1) OR (dbo.UDF_ForumPublic(@ForumID)=1)
	BEGIN
		SET @IsTopicWritable=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsTopicWritable
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ









GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_ForumTopicWritable]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_ForumFollowUpWritable    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_ForumFollowUpWritable]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_ForumFollowUpWritable]
GO

--==============================================================================================
--==用户函数，返回给定用户是否可以在给定论坛下跟帖
--==有以下情形下之一的，Forum 是可以跟贴的：
--==该 Forum 以及其上级 Community 的 FollowUpWritePermission 为空
--==该 Forum 或其上级 Community 设置了 Public 属性
--==当前用户是 Admin
--==当前用户是该 Forum 的 Moderator
--==当前用户落在该 Forum 或其上级 Community 的 FollowUpWritePermission 清单中
--==============================================================================================
--==输入参数：@Name -- 用户名
--==输入参数：@ForumID -- 论坛的 ID
--==返回结果：Int -- 1/0 是/否
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_ForumFollowUpWritable (@Name nvarchar(50),@ForumID int)  

RETURNS INT

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--==========================================
	--==结果变量
	--==========================================
	DECLARE @IsFollowUpWritable INT
	SET @IsFollowUpWritable=0	

	--==========================================
	--==从给定 Forum 中获得 FollowUpWritePermission 项目
	--==========================================
	DECLARE @FollowUpWritePermission NVARCHAR(4000)
	SELECT @FollowUpWritePermission=fp.FollowUpWritePermission FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

	--==========================================
	--==如果当前用户位于 @FollowUpWritePermission 清单，或者，当前用户是 Admin，或者当前用户是当前 Forum 的 Moderator， 或者当前 Forum 的 @FollowUpWritePermission 为空，或者当前 Forum 或其上级 Community 为 Public，则当前用户拥有 Topic Write 权限
	--==========================================
	IF (dbo.UDF_UserDedicatedTo(@Name,@FollowUpWritePermission)=1) OR (REPLACE(@FollowUpWritePermission,N',',N'')=N'' And @Name<>N'') OR (@FollowUpWritePermission=Null And @Name<>N'') OR (@FollowUpWritePermission Is Null And @Name<>N'') OR (dbo.UDF_UserAdmin(@Name)=1) OR (dbo.UDF_UserModerator(@Name,@ForumID)=1) OR (dbo.UDF_ForumPublic(@ForumID)=1)
	BEGIN
		SET @IsFollowUpWritable=1
	END

	--==========================================
	--==函数返回结果
	--==========================================
	RETURN @IsFollowUpWritable
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ










GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_ForumFollowUpWritable]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  User Defined Function dbo.UDF_TopicStatusDescription    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UDF_TopicStatusDescription]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UDF_TopicStatusDescription]
GO

--==============================================================================================
--==用户函数，给定 @ForumID, @Culture 和 @TopicStatus 从 View_ForumUiCustomization 查询对应的 TopicStatusCustomization<xxx> 设定
--==以便在 TopicQuery.cs 中，显示定制的帖子状态描述
--==============================================================================================
--==输入参数：@ForumID -- 论坛 ID
--==输入参数：@Culture -- 语种
--==输入参数：@TopicStatus -- 帖子状态
--==返回结果：对应的 Topic Status 定制 Description
--==============================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--==============================================================================================

CREATE FUNCTION dbo.UDF_TopicStatusDescription (@ForumID int,  @Culture nvarchar(50), @TopicStatus int)  

RETURNS nvarchar(50) 

AS  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

BEGIN 
	--================================
	--==返回的字符串
	--================================
	DECLARE @TopicStatusDescription NVARCHAR(50)

	--================================
	--==从 View_ForumUiCustomization 中查询
	--================================
	SELECT 

		@TopicStatusDescription=

		CASE

			WHEN @TopicStatus=1 THEN TopicStatusCustomizationEmptyTopic
			WHEN @TopicStatus=2 THEN TopicStatusCustomizationSolidTopic
			WHEN @TopicStatus=3 THEN TopicStatusCustomizationHotTopic
			WHEN @TopicStatus=4 THEN TopicStatusCustomizationEliteTopic
			WHEN @TopicStatus=5 THEN TopicStatusCustomizationTabooTopic
			WHEN @TopicStatus=6 THEN TopicStatusCustomizationStickyTopic
			ELSE TopicStatusCustomizationEmptyTopic

		END

	FROM dbo.View_ForumUiCustomization fuc

	WHERE fuc.ForumID=@ForumID AND fuc.Culture=@Culture

	--================================
	--==结果返回
	--================================
	RETURN @TopicStatusDescription
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UDF_TopicStatusDescription]  TO [public]
GO

