static int generate_thumbnail_cache(const dt_mipmap_size_t max_mip) { fprintf(stderr, _("creating cache directories\n")); for(dt_mipmap_size_t k = DT_MIPMAP_0; k <= max_mip; k++) { char dirname[PATH_MAX] = { 0 }; snprintf(dirname, sizeof(dirname), "%s.d/%d", darktable.mipmap_cache->cachedir, k); fprintf(stderr, _("creating cache directory '%s'\n"), dirname); if(g_mkdir_with_parents(dirname, 0750)) { fprintf(stderr, _("could not create directory '%s'!\n"), dirname); return 1; } } // some progress counter sqlite3_stmt *stmt; size_t image_count = 0, counter = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select count(id) from images", -1, &stmt, 0); if(sqlite3_step(stmt) == SQLITE_ROW) { image_count = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); } else { return 1; } // go through all images: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id from images", -1, &stmt, 0); while(sqlite3_step(stmt) == SQLITE_ROW) { const uint32_t imgid = sqlite3_column_int(stmt, 0); for(int k = max_mip; k >= DT_MIPMAP_0; k--) { char filename[PATH_MAX] = { 0 }; snprintf(filename, sizeof(filename), "%s.d/%d/%d.jpg", darktable.mipmap_cache->cachedir, k, imgid); // if the thumbnail is already on disc - do nothing if(!access(filename, R_OK)) continue; // else, generate thumbnail and store in mipmap cache. dt_mipmap_buffer_t buf; dt_mipmap_cache_get(darktable.mipmap_cache, &buf, imgid, k, DT_MIPMAP_BLOCKING, 'r'); dt_mipmap_cache_release(darktable.mipmap_cache, &buf); } // and immediately write thumbs to disc and remove from mipmap cache. dt_mimap_cache_evict(darktable.mipmap_cache, imgid); counter++; fprintf(stderr, "image %zu/%zu (%.02f%%)\n", counter, image_count, 100.0 * counter / (float)image_count); } sqlite3_finalize(stmt); fprintf(stderr, "done\n"); return 0; }
static int generate_thumbnail_cache(const dt_mipmap_size_t min_mip, const dt_mipmap_size_t max_mip, const int32_t min_imgid, const int32_t max_imgid) { fprintf(stderr, _("creating cache directories\n")); for(dt_mipmap_size_t k = min_mip; k <= max_mip; k++) { char dirname[PATH_MAX] = { 0 }; snprintf(dirname, sizeof(dirname), "%s.d/%d", darktable.mipmap_cache->cachedir, k); fprintf(stderr, _("creating cache directory '%s'\n"), dirname); if(g_mkdir_with_parents(dirname, 0750)) { fprintf(stderr, _("could not create directory '%s'!\n"), dirname); return 1; } } // some progress counter sqlite3_stmt *stmt; size_t image_count = 0, counter = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT COUNT(*) FROM main.images WHERE id >= ?1 AND id <= ?2", -1, &stmt, 0); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, min_imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, max_imgid); if(sqlite3_step(stmt) == SQLITE_ROW) { image_count = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); } else { return 1; } if(!image_count) { fprintf(stderr, _("warning: no images are matching the requested image id range\n")); if(min_imgid > max_imgid) { fprintf(stderr, _("warning: did you want to swap these boundaries?\n")); } } // go through all images: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id FROM main.images WHERE id >= ?1 AND id <= ?2", -1, &stmt, 0); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, min_imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, max_imgid); while(sqlite3_step(stmt) == SQLITE_ROW) { const int32_t imgid = sqlite3_column_int(stmt, 0); for(int k = max_mip; k >= min_mip && k >= 0; k--) { char filename[PATH_MAX] = { 0 }; snprintf(filename, sizeof(filename), "%s.d/%d/%d.jpg", darktable.mipmap_cache->cachedir, k, imgid); // if the thumbnail is already on disc - do nothing if(!access(filename, R_OK)) continue; // else, generate thumbnail and store in mipmap cache. dt_mipmap_buffer_t buf; dt_mipmap_cache_get(darktable.mipmap_cache, &buf, imgid, k, DT_MIPMAP_BLOCKING, 'r'); dt_mipmap_cache_release(darktable.mipmap_cache, &buf); } // and immediately write thumbs to disc and remove from mipmap cache. dt_mimap_cache_evict(darktable.mipmap_cache, imgid); counter++; fprintf(stderr, "image %zu/%zu (%.02f%%)\n", counter, image_count, 100.0 * counter / (float)image_count); } sqlite3_finalize(stmt); fprintf(stderr, "done\n"); return 0; }