Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
d0e69a04
提交
d0e69a04
authored
3月 06, 2015
作者:
Juan Batiz-Benet
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #865 from jbenet/ipns/refactor-unixfs
Ipns/refactor unixfs
上级
f17521b7
0e9772c5
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
103 行增加
和
26 行删除
+103
-26
dagbuilder.go
importer/helpers/dagbuilder.go
+7
-2
helpers.go
importer/helpers/helpers.go
+40
-3
format.go
unixfs/format.go
+50
-16
format_test.go
unixfs/format_test.go
+6
-5
没有找到文件。
importer/helpers/dagbuilder.go
浏览文件 @
d0e69a04
...
...
@@ -78,6 +78,11 @@ func (db *DagBuilderHelper) Next() []byte {
return
d
}
// GetDagServ returns the dagservice object this Helper is using
func
(
db
*
DagBuilderHelper
)
GetDagServ
()
dag
.
DAGService
{
return
db
.
dserv
}
// FillNodeLayer will add datanodes as children to the give node until
// at most db.indirSize ndoes are added
//
...
...
@@ -86,7 +91,7 @@ func (db *DagBuilderHelper) FillNodeLayer(node *UnixfsNode) error {
// while we have room AND we're not done
for
node
.
NumChildren
()
<
db
.
maxlinks
&&
!
db
.
Done
()
{
child
:=
NewUnixfs
Node
()
child
:=
NewUnixfs
Block
()
if
err
:=
db
.
FillNodeWithData
(
child
);
err
!=
nil
{
return
err
...
...
@@ -110,7 +115,7 @@ func (db *DagBuilderHelper) FillNodeWithData(node *UnixfsNode) error {
return
ErrSizeLimitExceeded
}
node
.
s
etData
(
data
)
node
.
S
etData
(
data
)
return
nil
}
...
...
importer/helpers/helpers.go
浏览文件 @
d0e69a04
...
...
@@ -38,20 +38,51 @@ var ErrSizeLimitExceeded = fmt.Errorf("object size limit exceeded")
// of unixfs DAG trees
type
UnixfsNode
struct
{
node
*
dag
.
Node
ufmt
*
ft
.
MultiBlock
ufmt
*
ft
.
FSNode
}
// NewUnixfsNode creates a new Unixfs node to represent a file
func
NewUnixfsNode
()
*
UnixfsNode
{
return
&
UnixfsNode
{
node
:
new
(
dag
.
Node
),
ufmt
:
new
(
ft
.
MultiBlock
)
,
ufmt
:
&
ft
.
FSNode
{
Type
:
ft
.
TFile
}
,
}
}
// NewUnixfsBlock creates a new Unixfs node to represent a raw data block
func
NewUnixfsBlock
()
*
UnixfsNode
{
return
&
UnixfsNode
{
node
:
new
(
dag
.
Node
),
ufmt
:
&
ft
.
FSNode
{
Type
:
ft
.
TRaw
},
}
}
// NewUnixfsNodeFromDag reconstructs a Unixfs node from a given dag node
func
NewUnixfsNodeFromDag
(
nd
*
dag
.
Node
)
(
*
UnixfsNode
,
error
)
{
mb
,
err
:=
ft
.
FSNodeFromBytes
(
nd
.
Data
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
UnixfsNode
{
node
:
nd
,
ufmt
:
mb
,
},
nil
}
func
(
n
*
UnixfsNode
)
NumChildren
()
int
{
return
n
.
ufmt
.
NumChildren
()
}
func
(
n
*
UnixfsNode
)
GetChild
(
i
int
,
ds
dag
.
DAGService
)
(
*
UnixfsNode
,
error
)
{
nd
,
err
:=
n
.
node
.
Links
[
i
]
.
GetNode
(
ds
)
if
err
!=
nil
{
return
nil
,
err
}
return
NewUnixfsNodeFromDag
(
nd
)
}
// addChild will add the given UnixfsNode as a child of the receiver.
// the passed in DagBuilderHelper is used to store the child node an
// pin it locally so it doesnt get lost
...
...
@@ -83,7 +114,13 @@ func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error {
return
nil
}
func
(
n
*
UnixfsNode
)
setData
(
data
[]
byte
)
{
// Removes the child node at the given index
func
(
n
*
UnixfsNode
)
RemoveChild
(
index
int
)
{
n
.
ufmt
.
RemoveBlockSize
(
index
)
n
.
node
.
Links
=
append
(
n
.
node
.
Links
[
:
index
],
n
.
node
.
Links
[
index
+
1
:
]
...
)
}
func
(
n
*
UnixfsNode
)
SetData
(
data
[]
byte
)
{
n
.
ufmt
.
Data
=
data
}
...
...
unixfs/format.go
浏览文件 @
d0e69a04
...
...
@@ -9,6 +9,13 @@ import (
pb
"github.com/jbenet/go-ipfs/unixfs/pb"
)
const
(
TRaw
=
pb
.
Data_Raw
TFile
=
pb
.
Data_File
TDirectory
=
pb
.
Data_Directory
TMetadata
=
pb
.
Data_Metadata
)
var
ErrMalformedFileFormat
=
errors
.
New
(
"malformed data in file format"
)
var
ErrInvalidDirLocation
=
errors
.
New
(
"found directory node in unexpected place"
)
var
ErrUnrecognizedType
=
errors
.
New
(
"unrecognized node type"
)
...
...
@@ -98,33 +105,60 @@ func DataSize(data []byte) (uint64, error) {
}
}
type
MultiBlock
struct
{
Data
[]
byte
type
FSNode
struct
{
Data
[]
byte
// total data size for each child
blocksizes
[]
uint64
subtotal
uint64
// running sum of blocksizes
subtotal
uint64
// node type of this node
Type
pb
.
Data_DataType
}
func
FSNodeFromBytes
(
b
[]
byte
)
(
*
FSNode
,
error
)
{
pbn
:=
new
(
pb
.
Data
)
err
:=
proto
.
Unmarshal
(
b
,
pbn
)
if
err
!=
nil
{
return
nil
,
err
}
n
:=
new
(
FSNode
)
n
.
Data
=
pbn
.
Data
n
.
blocksizes
=
pbn
.
Blocksizes
n
.
subtotal
=
pbn
.
GetFilesize
()
-
uint64
(
len
(
n
.
Data
))
n
.
Type
=
pbn
.
GetType
()
return
n
,
nil
}
// AddBlockSize adds the size of the next child block of this node
func
(
n
*
FSNode
)
AddBlockSize
(
s
uint64
)
{
n
.
subtotal
+=
s
n
.
blocksizes
=
append
(
n
.
blocksizes
,
s
)
}
func
(
mb
*
MultiBlock
)
AddBlockSize
(
s
uint64
)
{
mb
.
subtotal
+=
s
mb
.
blocksizes
=
append
(
mb
.
blocksizes
,
s
)
func
(
n
*
FSNode
)
RemoveBlockSize
(
i
int
)
{
n
.
subtotal
-=
n
.
blocksizes
[
i
]
n
.
blocksizes
=
append
(
n
.
blocksizes
[
:
i
],
n
.
blocksizes
[
i
+
1
:
]
...
)
}
func
(
mb
*
MultiBlock
)
GetBytes
()
([]
byte
,
error
)
{
func
(
n
*
FSNode
)
GetBytes
()
([]
byte
,
error
)
{
pbn
:=
new
(
pb
.
Data
)
t
:=
pb
.
Data_File
pbn
.
Type
=
&
t
pbn
.
Filesize
=
proto
.
Uint64
(
uint64
(
len
(
mb
.
Data
))
+
mb
.
subtotal
)
pbn
.
Blocksizes
=
mb
.
blocksizes
pbn
.
Data
=
mb
.
Data
pbn
.
Type
=
&
n
.
Type
pbn
.
Filesize
=
proto
.
Uint64
(
uint64
(
len
(
n
.
Data
))
+
n
.
subtotal
)
pbn
.
Blocksizes
=
n
.
blocksizes
pbn
.
Data
=
n
.
Data
return
proto
.
Marshal
(
pbn
)
}
func
(
mb
*
MultiBlock
)
FileSize
()
uint64
{
return
uint64
(
len
(
mb
.
Data
))
+
mb
.
subtotal
func
(
n
*
FSNode
)
FileSize
()
uint64
{
return
uint64
(
len
(
n
.
Data
))
+
n
.
subtotal
}
func
(
mb
*
MultiBlock
)
NumChildren
()
int
{
return
len
(
mb
.
blocksizes
)
func
(
n
*
FSNode
)
NumChildren
()
int
{
return
len
(
n
.
blocksizes
)
}
type
Metadata
struct
{
...
...
unixfs/format_test.go
浏览文件 @
d0e69a04
...
...
@@ -7,15 +7,16 @@ import (
pb
"github.com/jbenet/go-ipfs/unixfs/pb"
)
func
TestMultiBlock
(
t
*
testing
.
T
)
{
mbf
:=
new
(
MultiBlock
)
func
TestFSNode
(
t
*
testing
.
T
)
{
fsn
:=
new
(
FSNode
)
fsn
.
Type
=
TFile
for
i
:=
0
;
i
<
15
;
i
++
{
mbf
.
AddBlockSize
(
100
)
fsn
.
AddBlockSize
(
100
)
}
mbf
.
Data
=
make
([]
byte
,
128
)
fsn
.
Data
=
make
([]
byte
,
128
)
b
,
err
:=
mbf
.
GetBytes
()
b
,
err
:=
fsn
.
GetBytes
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论