using System.Data.SqlClient; using System.Linq; using Dapper; using System.IO; using System; using log4net; using Agent.Models; using System.Configuration; namespace Agent.Services { class FileTableService { private static readonly ILog log = LogManager.GetLogger(typeof(FileTableService)); /// /// 디렉토리 조회 /// public string GetDirectory(SqlConnection con, string name) { try { var sql = $@" SELECT TOP 1 path_locator.ToString() FROM DI_FILE.[dbo].[di_backup_file] WHERE 1=1 AND name = @DirectoryName AND is_directory = 1 "; return con.Query(sql, new { DirectoryName = name }).SingleOrDefault(); } catch (Exception) { throw; } } /// /// 디렉토리 생성 /// public string CreateDirectory(SqlConnection con, SqlTransaction transaction, string name, string parentId) { try { var sql = @" DECLARE @parent_node hierarchyid, @node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator) OUTPUT INSERTED.path_locator.ToString() VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL)) "; return con.Query(sql, new { @Name = name, @ParentId = parentId }, transaction).SingleOrDefault(); } catch (Exception) { throw; } } public string CreateDirectory(string name, string parentId) { try { var sql = @" DECLARE @parent_node hierarchyid, @node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator) OUTPUT INSERTED.path_locator.ToString() VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL)) "; using (var con = new SqlConnection(App._myConnection)) { con.Open(); return con.Query(sql, new { @Name = name, @ParentId = parentId }).SingleOrDefault(); } } catch (Exception) { return null; } } /// /// 디렉토리 생성(시간으로 이름지정) /// /// /// /// /// public string CreateDirectory(SqlConnection con, SqlTransaction transaction, string parentId) { try { var sql = @" DECLARE @name nvarchar(100), @parent_node hierarchyid, @node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node SELECT @name = Convert(varchar(10),Getdate(),112) + Replace(Convert(varchar(8),Getdate(),108),':','') INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator) OUTPUT INSERTED.path_locator.ToString() VALUES (@name, 1, @parent_node.GetDescendant(@node, NULL)) "; return con.Query(sql, new { @ParentId = parentId }, transaction).SingleOrDefault(); } catch (Exception) { throw; } } public string CreateDirectory(string parentId) { try { var sql = @" DECLARE @name nvarchar(100), @parent_node hierarchyid, @node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node SELECT @name = Convert(varchar(10),Getdate(),112) + Replace(Convert(varchar(8),Getdate(),108),':','') INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator) OUTPUT INSERTED.path_locator.ToString() VALUES (@name, 1, @parent_node.GetDescendant(@node, NULL)) "; using (var con = new SqlConnection(App._myConnection)) { con.Open(); return con.Query(sql, new { @ParentId = parentId }).SingleOrDefault(); } } catch (Exception) { return null; } } /// /// 디렉토리 생성(루트) /// /// /// /// /// public string CreateDirectoryToRoot(SqlConnection con, SqlTransaction transaction, string name) { try { var sql = @" DECLARE @parent_node hierarchyid, @node hierarchyid SET @parent_node = hierarchyid::GetRoot() SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator) OUTPUT INSERTED.path_locator.ToString() VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL)) "; return con.Query(sql, new { @Name = name }, transaction).SingleOrDefault(); } catch (Exception) { throw; } } /// /// 파일 업로드 /// /// /// /// /// /// public Guid UploadFile(SqlConnection con, SqlTransaction transaction, string srcPath, string parentId) { try { var sql = @" DECLARE @parent_node hierarchyid, @node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], file_stream, path_locator) OUTPUT INSERTED.file_stream.PathName() AS Path, INSERTED.stream_id AS StreamId VALUES (@Name, @Binary, @parent_node.GetDescendant(@node, NULL)) "; var fileBinary = File.ReadAllBytes(srcPath); var insertedFile = con.Query(sql, new { @Name = Path.GetFileName(srcPath), Binary = fileBinary, @ParentId = parentId }, transaction).SingleOrDefault(); return insertedFile.StreamId; } catch (Exception) { throw; } } /// /// 파일 다운로드 /// /// /// /// /// /// public string DownloadFile(SqlConnection con, SqlTransaction transaction, string dstPath, Guid streamId) { try { if (!Directory.Exists(Path.GetDirectoryName(dstPath))) { Directory.CreateDirectory(Path.GetDirectoryName(dstPath)); } var sql = @" SELECT TOP 1 file_stream AS binary, file_stream.PathName() AS Path, name FROM DI_FILE.[dbo].[di_backup_file] WHERE stream_id = @StreamId "; var file = con.Query(sql, new { @StreamId = streamId }, transaction).SingleOrDefault(); var tmpDstPath = $@"{Path.GetDirectoryName(dstPath)}\tmp_{Path.GetFileName(dstPath)}"; File.WriteAllBytes(tmpDstPath, file.Binary); return tmpDstPath; } catch (Exception ex) { throw; } } /// /// 디렉터리 삭제 (자식노드 포함) /// /// /// /// public bool RemoveDirectory(string parentId) { try { var sql = @" DECLARE @parent_node hierarchyid SET @parent_node = CAST(@ParentId AS hierarchyid) DELETE FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.IsDescendantOf(@parent_node) = 1 "; using (var con = new SqlConnection(App._myConnection)) { con.Open(); return 0 < con.Execute(sql, new { ParentId = parentId }); } } catch (Exception) { return false; } } } }