From: Karel M. <kar...@gm...> - 2009-04-19 21:56:50
|
Hi, As some might know by my previous post "Rmdir via GUI = recursive through virtual folders", I'm working on a combination of a hierarchical and tag-based filesystem and I'm running into another problem. When you want to save a file from within an application, you browse through the hierarchy to select the folder to save it in. It is possible to immediately add tags to the file by browsing deeper into a +ADD folder. So when you save a file in /photos/+ADD/photo/vacation, it will be saved in /photos and be tagged as "photo" and "vacation". Off-course you also want the ability to use new tags while in the save dialog. This is implemented by making a new directory when in the +ADD folder or any of its subfolders. In terminal this goes fine. In the GUI (Finder), this works too. Its only when using the save dialog that things get weird. That is, after adding the folder ("tag"), I see the content of it (other tags) for a moment and then the save dialog jumps back to the parent directory and doesn't even show the new folder ("tag"). However, when I select another folder ("tag") and see a list of all other possible folders ("tags"), the new folder is in there! The tag information is stored in a xapian database. When a tag is added by executing the mkdir, it is added to the database. When a readdir on +ADD is performed, all tags from the database are displayed as folders. A readdir on /+ADD/tag1 returns a list of all tags minus "tag1". All this testing is done on an OS X Leopard installation. As an example I used an empty database and filesystem (except for some virtual folders that are always there). I try to save a file in the root and want to tag it as "test", thus go to /+ADD and try a mkdir of "test". After doing so, the save dialog jumps back to the root display. Below I'm including the output from debug. Lines prefixed by "------" are lines I put out myself. This is simply the name of the method called and the values of the parameters. There are also some getattr requests on files starting with "._". Mac OS X uses this to store metadata of files on storage not formatted as HFS. Thanks in advance, Karel ------------------------------------------------------------------------------------------------------------------------------------- unique: 0, opcode: GETATTR (3), nodeid: 1, insize: 40 ------ Getattr: ------ path = / unique: 0, error: 0 (Unknown error: 0), outsize: 128 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 44 LOOKUP /._. ------ Getattr: ------ path = /._. unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: OPENDIR (27), nodeid: 1, insize: 48 unique: 2, error: 0 (Unknown error: 0), outsize: 32 unique: 4, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 4, error: 0 (Unknown error: 0), outsize: 96 unique: 5, opcode: READDIR (28), nodeid: 1, insize: 64 ------ Readdir: ------ path = / ------ offset = 0 unique: 5, error: 0 (Unknown error: 0), outsize: 144 unique: 0, opcode: READDIR (28), nodeid: 1, insize: 64 unique: 0, error: 0 (Unknown error: 0), outsize: 16 unique: 1, opcode: RELEASEDIR (29), nodeid: 1, insize: 64 unique: 1, error: 0 (Unknown error: 0), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /+TRASH ------ Getattr: ------ path = /+TRASH NODEID: 2 unique: 3, error: 0 (Unknown error: 0), outsize: 152 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /._+TRASH ------ Getattr: ------ path = /._+TRASH unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 46 LOOKUP /+FIND ------ Getattr: ------ path = /+FIND NODEID: 3 unique: 4, error: 0 (Unknown error: 0), outsize: 152 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /._+FIND ------ Getattr: ------ path = /._+FIND unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 45 LOOKUP /+ADD ------ Getattr: ------ path = /+ADD NODEID: 4 unique: 0, error: 0 (Unknown error: 0), outsize: 152 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /+REMOVE ------ Getattr: ------ path = /+REMOVE NODEID: 5 unique: 3, error: 0 (Unknown error: 0), outsize: 152 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /._+REMOVE ------ Getattr: ------ path = /._+REMOVE unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /.hidden ------ Getattr: ------ path = /.hidden unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /.DS_Store ------ Getattr: ------ path = /.DS_Store unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: GETATTR (3), nodeid: 1, insize: 40 ------ Getattr: ------ path = / unique: 0, error: 0 (Unknown error: 0), outsize: 128 unique: 1, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 1, error: 0 (Unknown error: 0), outsize: 96 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 44 LOOKUP /._. ------ Getattr: ------ path = /._. unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /._+TRASH ------ Getattr: ------ path = /._+TRASH unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /._+FIND ------ Getattr: ------ path = /._+FIND unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /._+REMOVE ------ Getattr: ------ path = /._+REMOVE unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /.DS_Store ------ Getattr: ------ path = /.DS_Store unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /._+FIND ------ Getattr: ------ path = /._+FIND unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /._+REMOVE ------ Getattr: ------ path = /._+REMOVE unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /._+TRASH ------ Getattr: ------ path = /._+TRASH unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 44 LOOKUP /._. ------ Getattr: ------ path = /._. unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /._+TRASH ------ Getattr: ------ path = /._+TRASH unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 48 LOOKUP /._+FIND ------ Getattr: ------ path = /._+FIND unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /._+REMOVE ------ Getattr: ------ path = /._+REMOVE unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 50 LOOKUP /.DS_Store ------ Getattr: ------ path = /.DS_Store unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: GETATTR (3), nodeid: 4, insize: 40 ------ Getattr: ------ path = /+ADD unique: 3, error: 0 (Unknown error: 0), outsize: 128 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: GETATTR (3), nodeid: 1, insize: 40 ------ Getattr: ------ path = / unique: 4, error: 0 (Unknown error: 0), outsize: 128 unique: 5, opcode: OPENDIR (27), nodeid: 4, insize: 48 unique: 5, error: 0 (Unknown error: 0), outsize: 32 unique: 0, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 0, error: 0 (Unknown error: 0), outsize: 96 unique: 1, opcode: READDIR (28), nodeid: 4, insize: 64 ------ Readdir: ------ path = /+ADD ------ offset = 0 unique: 1, error: 0 (Unknown error: 0), outsize: 48 unique: 3, opcode: READDIR (28), nodeid: 4, insize: 64 unique: 3, error: 0 (Unknown error: 0), outsize: 16 unique: 2, opcode: RELEASEDIR (29), nodeid: 4, insize: 64 unique: 2, error: 0 (Unknown error: 0), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/+TRASH ------ Getattr: ------ path = /+ADD/+TRASH NODEID: 6 unique: 4, error: 0 (Unknown error: 0), outsize: 152 unique: 5, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 0, error: 0 (Unknown error: 0), outsize: 96 unique: 1, opcode: GETATTR (3), nodeid: 4, insize: 40 ------ Getattr: ------ path = /+ADD unique: 1, error: 0 (Unknown error: 0), outsize: 128 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 4, insize: 56 LOOKUP /+ADD/untitled folder ------ Getattr: ------ path = /+ADD/untitled folder unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 4, insize: 56 LOOKUP /+ADD/untitled folder ------ Getattr: ------ path = /+ADD/untitled folder unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 4, insize: 42 LOOKUP /+ADD/t ------ Getattr: ------ path = /+ADD/t unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 4, insize: 43 LOOKUP /+ADD/te ------ Getattr: ------ path = /+ADD/te unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 4, insize: 44 LOOKUP /+ADD/tes ------ Getattr: ------ path = /+ADD/tes unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 4, insize: 45 LOOKUP /+ADD/test ------ Getattr: ------ path = /+ADD/test unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 4, insize: 45 LOOKUP /+ADD/test ------ Getattr: ------ path = /+ADD/test unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: GETATTR (3), nodeid: 4, insize: 40 ------ Getattr: ------ path = /+ADD unique: 3, error: 0 (Unknown error: 0), outsize: 128 unique: 2, opcode: MKDIR (9), nodeid: 4, insize: 53 MKDIR /+ADD/test ------ Mkdir: ------ path = /+ADD/test ------ mode = 16877 ------ Getattr: ------ path = /+ADD/test NODEID: 7 unique: 2, error: 0 (Unknown error: 0), outsize: 152 unique: 4, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/._test ------ Getattr: ------ path = /+ADD/._test unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: GETATTR (3), nodeid: 4, insize: 40 ------ Getattr: ------ path = /+ADD unique: 5, error: 0 (Unknown error: 0), outsize: 128 unique: 0, opcode: GETATTR (3), nodeid: 1, insize: 40 ------ Getattr: ------ path = / unique: 0, error: 0 (Unknown error: 0), outsize: 128 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 44 LOOKUP /._. ------ Getattr: ------ path = /._. unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/._test ------ Getattr: ------ path = /+ADD/._test unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/._test ------ Getattr: ------ path = /+ADD/._test unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: OPENDIR (27), nodeid: 7, insize: 48 unique: 3, error: 0 (Unknown error: 0), outsize: 32 unique: 2, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 2, error: 0 (Unknown error: 0), outsize: 96 unique: 4, opcode: READDIR (28), nodeid: 7, insize: 64 ------ Readdir: ------ path = /+ADD/test ------ offset = 0 unique: 4, error: 0 (Unknown error: 0), outsize: 48 unique: 5, opcode: READDIR (28), nodeid: 7, insize: 64 unique: 5, error: 0 (Unknown error: 0), outsize: 16 unique: 0, opcode: RELEASEDIR (29), nodeid: 7, insize: 64 unique: 0, error: 0 (Unknown error: 0), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 7, insize: 47 LOOKUP /+ADD/test/+TRASH ------ Getattr: ------ path = /+ADD/test/+TRASH NODEID: 8 unique: 1, error: 0 (Unknown error: 0), outsize: 152 unique: 3, opcode: LOOKUP (1), nodeid: 7, insize: 49 LOOKUP /+ADD/test/._+TRASH ------ Getattr: ------ path = /+ADD/test/._+TRASH unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: GETATTR (3), nodeid: 7, insize: 40 ------ Getattr: ------ path = /+ADD/test unique: 4, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 2, error: 0 (Unknown error: 0), outsize: 128 unique: 5, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/._test ------ Getattr: ------ path = /+ADD/._test unique: 4, error: 0 (Unknown error: 0), outsize: 96 unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 4, insize: 47 LOOKUP /+ADD/._test ------ Getattr: ------ path = /+ADD/._test unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 7, insize: 49 LOOKUP /+ADD/test/._+TRASH ------ Getattr: ------ path = /+ADD/test/._+TRASH unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 7, insize: 49 LOOKUP /+ADD/test/._+TRASH ------ Getattr: ------ path = /+ADD/test/._+TRASH unique: 4, opcode: GETATTR (3), nodeid: 6, insize: 40 unique: 2, error: -2 (No such file or directory), outsize: 16 ------ Getattr: ------ path = /+ADD/+TRASH unique: 4, error: 0 (Unknown error: 0), outsize: 128 unique: 5, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 5, error: -2 (No such file or directory), outsize: 16 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 44 LOOKUP /._. ------ Getattr: ------ path = /._. unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 1, error: -2 (No such file or directory), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 3, error: -2 (No such file or directory), outsize: 16 unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 2, error: -2 (No such file or directory), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 49 LOOKUP /Contents ------ Getattr: ------ path = /Contents unique: 4, error: -2 (No such file or directory), outsize: 16 unique: 5, opcode: STATFS (17), nodeid: 1, insize: 40 unique: 5, error: 0 (Unknown error: 0), outsize: 96 unique: 0, opcode: LOOKUP (1), nodeid: 1, insize: 47 LOOKUP /._+ADD ------ Getattr: ------ path = /._+ADD unique: 0, error: -2 (No such file or directory), outsize: 16 unique: 1, opcode: LOOKUP (1), nodeid: 4, insize: 49 LOOKUP /+ADD/._+TRASH ------ Getattr: ------ path = /+ADD/._+TRASH unique: 1, error: -2 (No such file or directory), outsize: 16 |