예제 #1
0
 public void DirnameTest()
 {
     Assert.AreEqual("/a", PathLib.Dirname("/a/b/"));
     Assert.AreEqual("/a", PathLib.Dirname("/a/b"));
     Assert.AreEqual("/", PathLib.Dirname("/a"));
     Assert.AreEqual(".", PathLib.Dirname(""));
     Assert.AreEqual("/", PathLib.Dirname("/"));
     Assert.AreEqual("/", PathLib.Dirname("////"));
     Assert.AreEqual("//", PathLib.Dirname("//a"));
     Assert.AreEqual(".", PathLib.Dirname("foo"));
 }
예제 #2
0
    private async ValueTask <long> IndexFile(
        IDbTransaction transaction,
        string path,
        FileHandle fileHandle,
        FileStats fileStats,
        FileChangeEventBuilder eventBuilder)
    {
        if (path == "/")
        {
            return(0);
        }

        var fileType    = fileStats.Type;
        var isDirectory = fileStats.Type.HasFlag(FileType.Directory);

        var oldFile = await _databaseTable.SelectByPathAsync(transaction, path);

        if (oldFile == null)
        {
            long?parentId = await CreateDirectory(transaction, PathLib.Dirname(path), eventBuilder);

            var newId = await _databaseTable.InsertAsync(
                transaction,
                path,
                parentId,
                fileType.HasFlag(FileType.Directory),
                fileHandle.Identifier,
                fileStats.Hash.ContentTag);

            eventBuilder.Created(fileHandle);
            return(newId);
        }

        if (oldFile.IsDirectory != isDirectory)
        {
            await Delete(transaction, oldFile, eventBuilder);

            var parentId = await CreateDirectory(transaction, PathLib.Dirname(path), eventBuilder);

            var newId = await _databaseTable.InsertAsync(
                transaction,
                path,
                parentId,
                fileType.HasFlag(FileType.Directory),
                fileHandle.Identifier,
                fileStats.Hash.ContentTag);

            eventBuilder.Created(fileHandle);
            return(newId);
        }

        if (oldFile.IdentifierTag == null)
        {
            await _databaseTable.UpdateIdentifierTagByIdAsync(
                transaction,
                oldFile.Id,
                fileHandle.Identifier,
                fileStats.Hash.ContentTag);

            eventBuilder.Created(fileHandle);
            return(oldFile.Id);
        }

        if (oldFile.IdentifierTag != fileHandle.Identifier)
        {
            await Delete(transaction, oldFile, eventBuilder);

            var parentId = await CreateDirectory(transaction, PathLib.Dirname(path), eventBuilder);

            var newId = await _databaseTable.InsertAsync(
                transaction,
                path,
                parentId,
                fileType.HasFlag(FileType.Directory),
                fileHandle.Identifier,
                fileStats.Hash.ContentTag);

            eventBuilder.Created(fileHandle);
            return(newId);
        }

        if (oldFile.ContentTag != fileStats.Hash.ContentTag)
        {
            await _databaseTable.UpdateStatsByIdAsync(
                transaction,
                oldFile.Id,
                fileStats.Hash.ContentTag);

            await _databaseTable.DeletePropertyOnFileUpdated(transaction, oldFile.Id);

            eventBuilder.Changed(fileHandle);
            return(oldFile.Id);
        }

        return(oldFile.Id);
    }