Lucy

 view release on metacpan or  search on metacpan

cfcore/Lucy/Store/RAMFolder.c  view on Meta::CPAN

    if (!RAMFolder_is_a(inner_from_folder, RAMFOLDER)) {
        Err_set_error(Err_new(Str_newf("Not a RAMFolder, but a '%o'",
                                       Obj_get_class_name((Obj*)inner_from_folder))));
        return false;
    }
    if (!RAMFolder_is_a(inner_to_folder, RAMFOLDER)) {
        Err_set_error(Err_new(Str_newf("Not a RAMFolder, but a '%o'",
                                       Obj_get_class_name((Obj*)inner_to_folder))));
        return false;
    }

    // Find the original element.
    elem = Hash_Fetch(RAMFolder_IVARS(inner_from_folder)->entries, from_name);
    if (!elem) {
        if (Folder_is_a(from_folder, COMPOUNDFILEREADER)
            && Folder_Local_Exists(from_folder, from_name)
           ) {
            Err_set_error(Err_new(Str_newf("Source file '%o' is virtual",
                                           from)));
        }
        else {
            Err_set_error(Err_new(Str_newf("File not found: '%o'", from)));
        }
        return false;
    }

    // Execute the rename/hard-link.
    if (op == OP_RENAME) {
        Obj *existing = Hash_Fetch(RAMFolder_IVARS(inner_to_folder)->entries,
                                   to_name);
        if (existing) {
            bool conflict = false;

            // Return success fast if file is copied on top of itself.
            if (inner_from_folder == inner_to_folder
                && Str_Equals(from_name, (Obj*)to_name)
               ) {
                return true;
            }

            // Don't allow clobbering of different entry type.
            if (Obj_is_a(elem, RAMFILE)) {
                if (!Obj_is_a(existing, RAMFILE)) {
                    conflict = true;
                }
            }
            else if (Obj_is_a(elem, FOLDER)) {
                if (!Obj_is_a(existing, FOLDER)) {
                    conflict = true;
                }
            }
            if (conflict) {
                Err_set_error(Err_new(Str_newf("Can't clobber a %o with a %o",
                                               Obj_get_class_name(existing),
                                               Obj_get_class_name(elem))));
                return false;
            }
        }

        // Perform the store first, then the delete. Inform Folder objects
        // about the relocation.
        Hash_Store(RAMFolder_IVARS(inner_to_folder)->entries,
                   to_name, INCREF(elem));
        DECREF(Hash_Delete(RAMFolder_IVARS(inner_from_folder)->entries,
                           from_name));
        if (Obj_is_a(elem, FOLDER)) {
            String *newpath = S_fullpath(inner_to_folder, to_name);
            Folder_Set_Path((Folder*)elem, newpath);
            DECREF(newpath);
        }
    }
    else if (op == OP_HARD_LINK) {
        if (!Obj_is_a(elem, RAMFILE)) {
            Err_set_error(Err_new(Str_newf("'%o' isn't a file, it's a %o",
                                           from, Obj_get_class_name(elem))));
            return false;
        }
        else {
            Obj *existing
                = Hash_Fetch(RAMFolder_IVARS(inner_to_folder)->entries,
                             to_name);
            if (existing) {
                Err_set_error(Err_new(Str_newf("'%o' already exists", to)));
                return false;
            }
            else {
                Hash_Store(RAMFolder_IVARS(inner_to_folder)->entries,
                           to_name, INCREF(elem));
            }
        }
    }
    else {
        THROW(ERR, "Unexpected op: %i32", (int32_t)op);
    }

    return true;
}

bool
RAMFolder_Rename_IMP(RAMFolder *self, String* from,
                     String *to) {
    Folder *from_folder = RAMFolder_Enclosing_Folder(self, from);
    Folder *to_folder   = RAMFolder_Enclosing_Folder(self, to);
    String *from_name   = IxFileNames_local_part(from);
    String *to_name     = IxFileNames_local_part(to);
    bool result = S_rename_or_hard_link(self, from, to, from_folder, to_folder,
                                        from_name, to_name, OP_RENAME);
    if (!result) { ERR_ADD_FRAME(Err_get_error()); }
    DECREF(to_name);
    DECREF(from_name);
    return result;
}

bool
RAMFolder_Hard_Link_IMP(RAMFolder *self, String *from,
                        String *to) {
    Folder *from_folder = RAMFolder_Enclosing_Folder(self, from);
    Folder *to_folder   = RAMFolder_Enclosing_Folder(self, to);
    String *from_name   = IxFileNames_local_part(from);
    String *to_name     = IxFileNames_local_part(to);
    bool result = S_rename_or_hard_link(self, from, to, from_folder, to_folder,



( run in 0.961 second using v1.01-cache-2.11-cpan-71847e10f99 )