MCPcopy Create free account
hub / github.com/Super-long/ChubbyGo / Insert

Method Insert

BaseServer/fileSystem.go:183–241  ·  view source on GitHub ↗

* * @brief: Type:创建的文件的类型;name:文件名称;后面则是文件初始的操作权限 * @return: 插入正确返回true;否则返回false * @notes: 文件被创建的时候默认打开,即引用计数为1,能够插入文件证明客户端的InstanceSeq是目录的 */

(InstanceSeq uint64, Type int, name string, ReadAcl *[]uint64, WriteAcl *[]uint64, ModifyAcl *[]uint64)

Source from the content-addressed store, hash-verified

181 * @notes: 文件被创建的时候默认打开,即引用计数为1,能够插入文件证明客户端的InstanceSeq是目录的
182 */
183func (Fsn *FileSystemNode) Insert(InstanceSeq uint64, Type int, name string, ReadAcl *[]uint64, WriteAcl *[]uint64, ModifyAcl *[]uint64) (uint64, uint64, error) {
184 if InstanceSeq < Fsn.instanceSeq {
185 return 0, 0, ChubbyGoFileSystemError(InstanceSeqError)
186 }
187
188 if Fsn.fileType != Directory { // 仅目录允许创建新文件
189 return 0, 0, ChubbyGoFileSystemError(OnlyDirectoriesCanCreateFiles)
190 }
191
192 // 文件名只要不包含'/'和' '就可以了,后面加上url判断以后需要修改这里
193 bytesFileName := str2sbyte(name)
194 bytesLength := len(bytesFileName)
195 for i:=0; i<bytesLength;i++{
196 if bytesFileName[i] == '/' || bytesFileName[i] == ' '{
197 return 0, 0, ChubbyGoFileSystemError(FileNameError)
198 }
199 }
200
201 // 目录与文件不可以重名
202 _, IsExist := Fsn.next[name]
203 if IsExist { // Fsn中存在着与这个文件文件名相同的文件
204 return 0, 0, ChubbyGoFileSystemError(PathError)
205 }
206
207 NewNode := &FileSystemNode{}
208
209 NewNode.fileType = Type
210 if Type == Directory {
211 NewNode.next = make(map[string]*FileSystemNode)
212 NewNode.nextNameCache = make(map[string]uint64)
213 }
214
215 NewNode.fileName = name
216 NewNode.readACLs = ReadAcl
217 NewNode.writeACLs = WriteAcl
218 NewNode.modifyACLs = ModifyAcl
219
220 // 初始值设定为2,协定0为无效值.1为delete的删除值
221 if Seq, ok:=Fsn.nextNameCache[name]; ok{
222 NewNode.instanceSeq = Seq // 使用的时候直接用就好,delete的时候会递增
223 } else {
224 NewNode.instanceSeq = 2
225 Fsn.nextNameCache[name] = 2
226 }
227 NewNode.tokenSeq = 2 // 使用的时候先递增,再取值,也就是说TockenSeq最低有效值是2
228 NewNode.aCLsSeq = 0
229 NewNode.checksum = NewNode.makeCheckSum()
230
231 NewNode.nowLockType = NotLock
232 NewNode.readLockReferenceCount = 0
233 // 需要在每一个Cell中保证唯一性
234 NewNode.nowPath = Fsn.nowPath + "/" + name
235 NewNode.OpenReferenceCount = 1
236 Fsn.next[name] = NewNode
237
238 RootFileOperation.pathToFileSystemNodePointer[NewNode.nowPath] = NewNode
239
240 return NewNode.instanceSeq, NewNode.checksum, nil

Callers 1

acceptFromRaftDaemonMethod · 0.80

Calls 3

makeCheckSumMethod · 0.95
ChubbyGoFileSystemErrorTypeAlias · 0.85
str2sbyteFunction · 0.85

Tested by

no test coverage detected