jcs
/subtext
/amendments
/185
db: Create and check for folder directories, sort boards/folders
jcs made amendment 185 over 3 years ago
--- db.c	Wed Jun 29 09:35:09 2022
+++ db.c	Thu Jul  7 17:30:23 2022
@@ -401,6 +401,8 @@ db_cache_boards(struct db *tdb)
 {
 	Str255 db_filename, board_filename;
 	size_t n, size;
+	unsigned long *ids;
+	short error;
 	struct bile_object *obj;
 	char *data = NULL;
 
@@ -417,7 +419,8 @@ db_cache_boards(struct db *tdb)
 		panic("getpath failed on %s", PtoCstr(tdb->bile->filename));
 	PtoCstr(db_filename);
 
-	tdb->nboards = bile_count_by_type(tdb->bile, DB_BOARD_RTYPE);
+	tdb->nboards = bile_sorted_ids_by_type(tdb->bile, DB_BOARD_RTYPE,
+	  &ids);
 	if (!tdb->nboards)
 		return;
 	tdb->boards = xcalloc(tdb->nboards, sizeof(struct board));
@@ -427,10 +430,10 @@ db_cache_boards(struct db *tdb)
 	 * fix/recreate each bile, which may change their order in the map
 	 */
 	for (n = 0; n < tdb->nboards; n++) {
-		obj = bile_get_nth_of_type(tdb->bile, n, DB_BOARD_RTYPE);
+		obj = bile_find(tdb->bile, DB_BOARD_RTYPE, ids[n]);
 		if (obj == NULL)
 			break;
-	
+		
 		size = bile_read_alloc(tdb->bile, DB_BOARD_RTYPE, obj->id,
 		  &data);
 		bile_unmarshall_object(tdb->bile, board_object_fields,
@@ -439,6 +442,8 @@ db_cache_boards(struct db *tdb)
 		free(data);
 	}
 	
+	free(ids);
+	
 	for (n = 0; n < tdb->nboards; n++) {
 		snprintf((char *)board_filename, sizeof(board_filename),
 		  "%s:%ld.%s", db_filename, tdb->boards[n].id, BOARD_FILENAME_EXT);
@@ -514,8 +519,9 @@ db_board_create(struct db *tdb, struct board *board)
 void
 db_cache_folders(struct db *tdb)
 {
-	Str255 db_filename, folder_filename;
+	Str255 db_filename, folder_filename, folder_dir;
 	size_t n, size;
+	unsigned long *ids;
 	struct bile_object *obj;
 	char *data = NULL;
 
@@ -532,7 +538,8 @@ db_cache_folders(struct db *tdb)
 		panic("getpath failed on %s", PtoCstr(tdb->bile->filename));
 	PtoCstr(db_filename);
 
-	tdb->nfolders = bile_count_by_type(tdb->bile, DB_FOLDER_RTYPE);
+	tdb->nfolders = bile_sorted_ids_by_type(tdb->bile, DB_FOLDER_RTYPE,
+	  &ids);
 	if (!tdb->nfolders)
 		return;
 	tdb->folders = xcalloc(tdb->nfolders, sizeof(struct folder));
@@ -542,7 +549,7 @@ db_cache_folders(struct db *tdb)
 	 * fix/recreate each bile, which may change their order in the map
 	 */
 	for (n = 0; n < tdb->nfolders; n++) {
-		obj = bile_get_nth_of_type(tdb->bile, n, DB_FOLDER_RTYPE);
+		obj = bile_find(tdb->bile, DB_FOLDER_RTYPE, ids[n]);
 		if (obj == NULL)
 			break;
 	
@@ -553,6 +560,8 @@ db_cache_folders(struct db *tdb)
 		free(data);
 	}
 	
+	free(ids);
+	
 	for (n = 0; n < tdb->nfolders; n++) {
 		snprintf((char *)folder_filename, sizeof(folder_filename),
 		  "%s:%ld.%s", db_filename, tdb->folders[n].id,
@@ -586,15 +595,24 @@ db_cache_folders(struct db *tdb)
 			panic("Failed to create folder file %s: %d",
 			  folder_filename, bile_error(NULL));
 	}
+	
+	for (n = 0; n < tdb->nfolders; n++) {
+		/* make sure directory exists */
+		memcpy(folder_dir, tdb->folders[n].path, sizeof(folder_dir));
+		CtoPstr(folder_dir);
+		if (!FIsDir(folder_dir))
+			panic("Folder %ld path %s does not exist",
+			  tdb->folders[n].id, tdb->folders[n].path);
+	}
 }
 
 struct bile *
 db_folder_create(struct db *tdb, struct folder *folder)
 {
-	Str255 db_filename, folder_filename;
+	Str255 db_filename, folder_filename, folder_dir;
 	struct bile *folder_bile;
 	size_t size;
-	short ret;
+	short ret, newid, error;
 	char *data;
 	
 	ret = bile_marshall_object(tdb->bile, folder_object_fields,
@@ -623,6 +641,14 @@ db_folder_create(struct db *tdb, struct folder *folder
 	if (folder_bile == NULL)
 		panic("Failed creating new folder bile at %s: %d",
 		  PtoCstr(folder_filename), bile_error(NULL));
+
+	memcpy(folder_dir, folder->path, sizeof(folder_dir));
+	CtoPstr(folder_dir);
+	if (!FIsDir(folder_dir)) {
+		error = DirCreate(tdb->bile->vrefnum, 0, folder_dir, &newid);
+		if (error)
+			warn("Failed creating %s: %d", folder->path, error);
+	}
 	
 	return folder_bile;  
 }