* * @brief: Type:创建的文件的类型;name:文件名称;后面则是文件初始的操作权限 * @return: 插入正确返回true;否则返回false * @notes: 文件被创建的时候默认打开,即引用计数为1,能够插入文件证明客户端的InstanceSeq是目录的 */
(InstanceSeq uint64, Type int, name string, ReadAcl *[]uint64, WriteAcl *[]uint64, ModifyAcl *[]uint64)
| 181 | * @notes: 文件被创建的时候默认打开,即引用计数为1,能够插入文件证明客户端的InstanceSeq是目录的 |
| 182 | */ |
| 183 | func (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 |
no test coverage detected