@ViewName SYSNAME,
@Timeout int
AS
SET NOCOUNT ON

declare @Cachever varchar(20)
declare @Pjver varchar(20)
declare @ObjName varchar(MAX)
declare @Avatar varchar(36)
declare @CacheAvatar varchar(36)
DECLARE @SQL1 NVARCHAR(MAX) = ''
DECLARE @SQL2 NVARCHAR(MAX) = ''
declare @LockResource varchar(100)
declare @CacheViewVer varchar(20)
declare @ViewVer varchar(20)
DECLARE @ProcName VARCHAR(MAX) = NULL -- use stored procedure to create the cache
DECLARE @Prefix VARCHAR(20) = 'cache'  -- this is a prefix for tables


SET @ObjName = @Prefix + @ViewName
 -- check if exists an stored procedure with the name 
SET @ProcName = (SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME =  @ViewName )
--SELECT  @ProcName ,  @Viewname



IF (NOT EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_NAME = 'EZViewerCacheTable'))
BEGIN
    create table EZViewerCacheTable(
       name varchar(200),
       pjver varchar(20),
       avatar varchar(36),
       vversion varchar(20),
    )
END

SELECT  @Cachever = pjver, 
        @CacheAvatar = avatar, 
	   @CacheViewVer = vversion  
FROM EZViewerCacheTable 
WHERE NAME = @ObjName

SET @Pjver = (select version from VC_Container where type = 0)
SET @Avatar = (select avatar from VC_Version)
SET @LockResource = @ObjName
SET @ViewVer = (select version from EZReportsStoredProcedures where name = COALESCE(@ProcName, @ViewName) )



DECLARE @result int

if (@Cachever is null or @Avatar is null or @CacheViewVer is null or @Avatar <> @CacheAvatar or @Cachever <> @Pjver or @CacheViewVer <> @ViewVer)
begin

begin transaction
    
EXEC @result = sp_getapplock @Resource = @LockResource, @LockMode = 'Exclusive', @LockTimeout=@Timeout
If @result < 0     
    Begin
       ROLLBACK TRANSACTION
    End 
else    
    begin
		begin try
	        	
			delete from EZViewerCacheTable where name = @ObjName
		
		     SELECT @SQL1 = 'if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = ''' +@ObjName + ''' ) begin DROP TABLE ' + QUOTENAME(@ObjName) + ' end';
		
		     IF(@ProcName IS NULL)
				 BEGIN
					  SELECT @SQL2 = 'select * into ' + QUOTENAME(@ObjName) + ' from ' + QUOTENAME(@ViewName) + '';
				 END 
		     ELSE
			     BEGIN 
		                 SELECT @SQL2 = ' EXEC ' + QUOTENAME(@ProcName) + ' ' 
		                 
			     END

			--PRINT @SQL1
			EXEC SP_EXECUTESQL @SQL1
		    
		     --PRINT @SQL2
			EXEC SP_EXECUTESQL @SQL2



			INSERT INTO EZViewerCacheTable (name, pjver, avatar, vversion) VALUES (@ObjName, @Pjver, @Avatar, @ViewVer)
		
	          EXEC @result = sp_releaseapplock @Resource = @LockResource

		end try
		begin catch
			   EXEC @result = sp_releaseapplock @Resource = @LockResource
		end catch
    COMMIT TRANSACTION
end
return @result
end
