VictoriaFreSh 2021.7.31 → 2022.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/victoriafresh.rb +49 -25
- metadata +9 -16
- data/lib/VictoriaFreSh/filemessage_pb.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6d26d764e0e7243cad77fbf9b9bfa0ab0e3a622dd55df6d606d897cf79cf2ae
|
4
|
+
data.tar.gz: 5beff4aba458395347cb1c58ef5af643fc92b9061593571336ee73ad603b328e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02c1a6374fe1a446bcd471956fd31e96491826a7dbfe24249f8ffd0e5e6d5d07308dc68fa33334752af9b44a517fdba6e98c3ffcf05f8fface38bb14fd505528
|
7
|
+
data.tar.gz: 414857f4e1c24ce4a72350769661cdeef8a9f6c67d67e2d9a3c83e71d2b96b415c697ddf36b24b1d2f579ba2b7efe16a1e23a26eff9a489727b3955b8d780b88
|
data/lib/victoriafresh.rb
CHANGED
@@ -4,6 +4,7 @@ require 'pathname'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'cbor'
|
6
6
|
require 'get_process_mem'
|
7
|
+
require 'digest'
|
7
8
|
|
8
9
|
# require File.dirname(__FILE__)+'/VictoriaFreSh/filemessage_pb.rb'
|
9
10
|
|
@@ -25,6 +26,21 @@ class VictoriaFresh
|
|
25
26
|
@currentDiskFlushSuffix=0 #当前的磁盘文件后缀
|
26
27
|
@bufferLength=0 #缓冲区总长度
|
27
28
|
@externalDataFile={} #外部数据文件对象
|
29
|
+
@nextFileIdToUse=1 # 下一个要用的文件编号。
|
30
|
+
@md5FileIdMap={} # MD5 与文件编号之间的映射
|
31
|
+
@fileIdPathMap={} # 文件编号与它的实际路径之间的映射
|
32
|
+
end
|
33
|
+
|
34
|
+
# 计算文件内容的MD5。
|
35
|
+
def calculateMd5(currentFileContent)
|
36
|
+
Digest::MD5.hexdigest currentFileContent #=> "90015098..."
|
37
|
+
end
|
38
|
+
|
39
|
+
# 下一个可用的文件编号
|
40
|
+
def nextFileId
|
41
|
+
result=@nextFileIdToUse # 结果
|
42
|
+
|
43
|
+
@nextFileIdToUse=@nextFileIdToUse+1
|
28
44
|
end
|
29
45
|
|
30
46
|
def checkMemoryUsage(lineNumber)
|
@@ -57,15 +73,24 @@ class VictoriaFresh
|
|
57
73
|
def writeFileExternalDataFile(pathPrefix, packagedFile) #写入文件
|
58
74
|
timeObject=getTimeObject(packagedFile) #构造时间戳对象
|
59
75
|
|
60
|
-
|
61
|
-
|
62
|
-
victoriaFreshData=@externalDataFile.read(packagedFile['file_length']) #读取内容
|
76
|
+
is_duplicate=packagedFile['is_duplicate'] # 是否是重复文件。
|
77
|
+
|
63
78
|
|
64
|
-
#
|
65
|
-
|
79
|
+
if is_duplicate # 是重复文件。
|
80
|
+
sameFileId=packagedFile['same_file_id'] # 找到相同文件的编号。
|
81
|
+
|
82
|
+
sameFilePath=@fileIdPathMap[sameFileId] # 获取原始相同文件的路径。
|
83
|
+
|
84
|
+
victoriaFreshData=File.read(sameFilePath) # 读取原始相同文件的内容。
|
85
|
+
else # 不是重复文件。
|
86
|
+
@externalDataFile.seek(packagedFile['file_start_index']) #定位到起始位置
|
87
|
+
|
88
|
+
victoriaFreshData=@externalDataFile.read(packagedFile['file_length']) #读取内容
|
89
|
+
end # if is_duplicate # 是重复文件。
|
66
90
|
|
67
|
-
# pathToMake=pathPrefix + '/' + packagedFile.name #构造文件名
|
68
91
|
pathToMake=pathPrefix + '/' + packagedFile['name'] #构造文件名
|
92
|
+
|
93
|
+
@fileIdPathMap[fileId]=pathToMake # 记录文件编号与路径之间的映射。
|
69
94
|
|
70
95
|
begin
|
71
96
|
victoriaFreshDataFile=File.new(pathToMake , "wb", packagedFile['permission']) #数据文件。
|
@@ -80,8 +105,6 @@ class VictoriaFresh
|
|
80
105
|
elsif #带权限字段
|
81
106
|
File.chmod(permissionNumber, pathToMake) #设置权限
|
82
107
|
end #if (permissionNumber.nil?) #不带权限字段
|
83
|
-
|
84
|
-
|
85
108
|
rescue Errno::ENOENT # File not exist
|
86
109
|
puts "Rescued by Errno::ENOENT statement. #{pathToMake}" #报告错误
|
87
110
|
rescue Errno::EACCES # File permission error
|
@@ -320,8 +343,6 @@ class VictoriaFresh
|
|
320
343
|
@diskWriteFileObject.syswrite(contentToWrite) #写入内容
|
321
344
|
|
322
345
|
@diskWriteFileObject.close
|
323
|
-
|
324
|
-
|
325
346
|
else #单个磁盘文件
|
326
347
|
@diskWriteFileObject.syswrite(contentToWrite) #写入内容
|
327
348
|
|
@@ -377,19 +398,29 @@ class VictoriaFresh
|
|
377
398
|
|
378
399
|
if isFile #是文件,不用再列出其子文件了。
|
379
400
|
packagedFile['file_length']=directoryPathName.size #记录文件的内容长度。
|
401
|
+
packagedFile['id']= nextFileId # 设置下一个文件编号
|
380
402
|
|
381
403
|
#读取文件内容:
|
382
404
|
fileToReadContent=File.new(directoryPath,"rb") #创建文件。
|
383
405
|
currentFileContent=fileToReadContent.read #全部读取
|
384
|
-
|
385
|
-
|
386
|
-
|
406
|
+
|
407
|
+
currentContentMd5=calculateMd5(currentFileContent) # 计算文件内容的MD5。
|
408
|
+
|
409
|
+
sameFileId=@md5FileIdMap[currentContentMd5] # 尝试寻找对应的相同文件的编号。
|
410
|
+
|
411
|
+
if sameFileId.nil? # 不存在相同的文件
|
412
|
+
@contentPartArray << currentFileContent
|
413
|
+
@bufferLength=@bufferLength+ currentFileContent.length #记录缓冲区总长度
|
414
|
+
@md5FileIdMap[currentContentMd5]=packagedFile['id'] # 尝试寻找对应的相同文件的编号。
|
415
|
+
else # 存在相同的文件
|
416
|
+
packagedFile['is_duplicate']=true # 是重复文件。
|
417
|
+
packagedFile['same_file_id']=sameFileId # 设置相同文件的编号。
|
418
|
+
end # if sameFileId.nil? # 不存在相同的文件
|
387
419
|
|
388
420
|
assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
|
389
421
|
elsif (isSymLink) #是符号链接
|
390
422
|
linkTarget=directoryPathName.readlink #获取链接目标
|
391
423
|
|
392
|
-
# 待续,设置内容长度。符号链接字符串的长度
|
393
424
|
packagedFile['file_length']=linkTarget.to_s.bytesize #记录文件的内容长度。
|
394
425
|
|
395
426
|
#读取文件内容:
|
@@ -397,12 +428,9 @@ class VictoriaFresh
|
|
397
428
|
currentFileContent=StringIO.new(linkTarget.to_s).binmode.read #全部读取。
|
398
429
|
@contentPartArray << currentFileContent #加入数组
|
399
430
|
@bufferLength=@bufferLength + currentFileContent.length #记录缓冲区总长度
|
400
|
-
# @contentString= @contentString + StringIO.new(linkTarget.to_s).binmode.read #全部读取。
|
401
431
|
|
402
432
|
assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
|
403
|
-
|
404
433
|
else #是目录。
|
405
|
-
# contentString="" #容纳内容的字符串。
|
406
434
|
subFileStartIndex=startIndex #子文件的起始位置,以此目录的起始位置为基准。
|
407
435
|
|
408
436
|
packagedFile['file_length']=0 #本目录的内容长度。
|
@@ -410,20 +438,13 @@ class VictoriaFresh
|
|
410
438
|
puts "Listing for #{directoryPathName}" # Debug
|
411
439
|
|
412
440
|
directoryPathName.each_child do |subFile| #一个个文件地处理。
|
413
|
-
|
414
|
-
# checkMemoryUsage(221)
|
441
|
+
begin
|
415
442
|
realPath=subFile.expand_path #获取绝对路径。
|
416
443
|
|
417
444
|
packagedSubFile,subFileContent=checkOnce(realPath,subFileStartIndex, layer+1) #打包这个子文件。
|
418
445
|
|
419
446
|
packagedFile['sub_files'] << packagedSubFile #加入到子文件列表中。
|
420
447
|
|
421
|
-
# puts("sub file content: #{subFileContent}, nil?: #{subFileContent.nil?}" ) #Debug
|
422
|
-
|
423
|
-
# puts(" content: #{contentString}, nil?: #{contentString.nil? }") #Debug
|
424
|
-
|
425
|
-
# contentString = contentString + subFileContent #串接文件内容。
|
426
|
-
|
427
448
|
assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
|
428
449
|
|
429
450
|
|
@@ -432,6 +453,9 @@ class VictoriaFresh
|
|
432
453
|
# puts("237, content string length: #{contentString.length}") #Debug
|
433
454
|
|
434
455
|
packagedFile['file_length']+=packagedSubFile['file_length'] #随着子文件的打包而更新本目录的总长度。
|
456
|
+
rescue Errno::EMFILE # File not exist
|
457
|
+
puts "Rescued by Errno::EMFILE statement. #{subFile}" #报告错误
|
458
|
+
end
|
435
459
|
end #directoryPathName.each_child do |subFile| #一个个文件地处理。
|
436
460
|
end #if (isFile) #是文件,不用再列出其子文件了。
|
437
461
|
|
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: VictoriaFreSh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2022.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hxcan Cai
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: hx_cbor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.5.9
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: 2021.8.20
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.5.9
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: 2021.8.20
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: get_process_mem
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,14 +44,13 @@ executables: []
|
|
50
44
|
extensions: []
|
51
45
|
extra_rdoc_files: []
|
52
46
|
files:
|
53
|
-
- lib/VictoriaFreSh/filemessage_pb.rb
|
54
47
|
- lib/victoriafresh.rb
|
55
48
|
- victoriafresh.example.rb
|
56
49
|
homepage: http://rubygems.org/gems/VictoriaFreSh
|
57
50
|
licenses:
|
58
51
|
- MIT
|
59
52
|
metadata: {}
|
60
|
-
post_install_message:
|
53
|
+
post_install_message:
|
61
54
|
rdoc_options: []
|
62
55
|
require_paths:
|
63
56
|
- lib
|
@@ -72,8 +65,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
65
|
- !ruby/object:Gem::Version
|
73
66
|
version: '0'
|
74
67
|
requirements: []
|
75
|
-
rubygems_version: 3.
|
76
|
-
signing_key:
|
68
|
+
rubygems_version: 3.1.6
|
69
|
+
signing_key:
|
77
70
|
specification_version: 4
|
78
71
|
summary: VictoriaFreSh
|
79
72
|
test_files: []
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# source: filemessage.proto
|
3
|
-
|
4
|
-
require 'google/protobuf'
|
5
|
-
|
6
|
-
require 'google/protobuf/timestamp_pb'
|
7
|
-
Google::Protobuf::DescriptorPool.generated_pool.build do
|
8
|
-
add_message "com.stupidbeauty.victoriafresh.FileMessage" do
|
9
|
-
optional :name, :string, 1
|
10
|
-
repeated :sub_files, :message, 2, "com.stupidbeauty.victoriafresh.FileMessage"
|
11
|
-
optional :is_file, :bool, 3
|
12
|
-
optional :file_start_index, :int32, 5
|
13
|
-
optional :file_length, :int32, 6
|
14
|
-
optional :timestamp, :message, 8, "google.protobuf.Timestamp"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
module Com
|
19
|
-
module Stupidbeauty
|
20
|
-
module Victoriafresh
|
21
|
-
FileMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("com.stupidbeauty.victoriafresh.FileMessage").msgclass
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|