#ifndef LARDON3D_PROJECT_DB_H #define LARDON3D_PROJECT_DB_H #include #include #include #include #include #include #include enum { /* v26 additively stores Capture-owned observed geometric state and exact * calibration applicability. Migration does not infer state from v23 * configuration or historical calibration selections. */ LARDON3D_PROJECT_DB_SCHEMA_VERSION = 26, LARDON3D_PROJECT_DB_ID_CAPACITY = 65, LARDON3D_PROJECT_DB_KIND_CAPACITY = 65, LARDON3D_PROJECT_DB_PATH_CAPACITY = 4096, LARDON3D_PROJECT_DB_ERROR_CAPACITY = 256, LARDON3D_PROJECT_DB_RECOVERY_PAGE_MAX = 256, LARDON3D_PROJECT_DB_CATALOG_PAGE_MAX = 256, LARDON3D_PROJECT_DB_CANDIDATE_PAIR_PAGE_MAX = 256, LARDON3D_PROJECT_DB_MATCH_RESULT_PAGE_MAX = 256, LARDON3D_PROJECT_DB_GEOMETRIC_RESULT_PAGE_MAX = 256, LARDON3D_PROJECT_DB_TRACK_PAGE_MAX = 64, LARDON3D_PROJECT_DB_INLIER_MASK_MAX = 1024, LARDON3D_PROJECT_DB_FUNDAMENTAL_COEFFICIENTS = 9, LARDON3D_PROJECT_DB_SCANSET_NAME_CAPACITY = 256, LARDON3D_PROJECT_DB_IMAGE_NAME_CAPACITY = 256, LARDON3D_PROJECT_DB_SHA256_SIZE = 32, }; typedef struct Lardon3DProjectDb Lardon3DProjectDb; typedef enum { LARDON3D_PROJECT_DB_OK = 0, LARDON3D_PROJECT_DB_INVALID_ARGUMENT, LARDON3D_PROJECT_DB_NOT_FOUND, LARDON3D_PROJECT_DB_BUSY, LARDON3D_PROJECT_DB_UNSUPPORTED_SCHEMA, LARDON3D_PROJECT_DB_CORRUPT, LARDON3D_PROJECT_DB_CONSTRAINT, LARDON3D_PROJECT_DB_IO_ERROR } Lardon3DProjectDbResult; typedef enum { LARDON3D_DB_CHECKPOINT_DURABLE = 0, LARDON3D_DB_CHECKPOINT_PUBLISHED_NOT_DURABLE } Lardon3DProjectDbCheckpointDurability; typedef enum { LARDON3D_DB_ARTIFACT_STAGED = 0, LARDON3D_DB_ARTIFACT_READY } Lardon3DProjectDbArtifactState; typedef struct { char stable_id[LARDON3D_PROJECT_DB_ID_CAPACITY]; char name[LARDON3D_TASK_NAME_CAPACITY]; int64_t created_at; int64_t updated_at; } Lardon3DProjectDbProject; typedef struct { char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint32_t format_version; Lardon3DProjectDbCheckpointDurability durability; int64_t updated_at; } Lardon3DProjectDbCheckpoint; typedef struct { uint64_t task_id; char name[LARDON3D_TASK_NAME_CAPACITY]; bool has_task_kind; char task_kind[LARDON3D_TASK_KIND_CAPACITY]; uint32_t task_kind_version; Lardon3DTaskState saved_state; Lardon3DTaskState recovery_state; unsigned int progress; unsigned int sequence_count; struct timespec started_at; struct timespec finished_at; int64_t updated_at; bool has_checkpoint; Lardon3DProjectDbCheckpoint checkpoint; } Lardon3DProjectDbTask; typedef struct { char artifact_id[LARDON3D_PROJECT_DB_ID_CAPACITY]; char kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; Lardon3DProjectDbArtifactState state; uint64_t size_bytes; bool has_producer_task; uint64_t producer_task_id; int64_t created_at; int64_t updated_at; } Lardon3DProjectDbArtifact; typedef struct { uint64_t task_id; char source_path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t scanset_id; } Lardon3DProjectDbImageImport; typedef struct { uint64_t task_id; uint64_t scanset_id; /* Zero-based next-work position in 0..group_count. Its numeric value is the * number of one-based campaign groups whose Capture mapping is durable. */ uint32_t next_group_id; uint32_t group_count; const unsigned char *request; size_t request_size; } Lardon3DProjectDbAcquisitionCampaignTask; typedef struct { uint32_t group_id; uint64_t capture_id; } Lardon3DProjectDbAcquisitionCampaignCapture; typedef struct { uint64_t task_id; uint64_t scanset_id; /* Canonical one-based group ID of the next work item. Valid durable values * are 1..group_count+1, where group_count+1 denotes completion. */ uint32_t next_group_id; uint32_t group_count; const unsigned char *request; size_t request_size; } Lardon3DProjectDbPhotoQualityTask; typedef enum { LARDON3D_RAW_DEVELOPMENT_TASK_PENDING = 1, LARDON3D_RAW_DEVELOPMENT_TASK_PUBLISHED = 2, } Lardon3DProjectDbRawDevelopmentTaskPhase; typedef struct { uint64_t task_id; uint64_t capture_id; uint64_t source_asset_id; Lardon3DProjectDbRawDevelopmentTaskPhase phase; bool has_image; uint64_t image_id; } Lardon3DProjectDbRawDevelopmentTask; typedef struct { uint64_t task_id; /* Selected execution owns the ordered scientific inputs and durable cursor. * This typed Task row deliberately copies none of those identities. */ uint64_t selected_execution_id; } Lardon3DProjectDbRawDevelopmentBatchTask; typedef struct { uint64_t task_id; uint32_t group_id; uint32_t proxy_source_index; Lardon3DPhotoQualityMetrics metrics; Lardon3DPhotoQualityOverride override_value; } Lardon3DProjectDbPhotoQualityResult; typedef enum { LARDON3D_SELECTED_EXECUTION_REPRESENTATIONS = 1, LARDON3D_SELECTED_EXECUTION_CALIBRATION = 2, LARDON3D_SELECTED_EXECUTION_READY = 3, } Lardon3DProjectDbSelectedExecutionStage; typedef struct { uint64_t execution_id; uint64_t quality_task_id; uint64_t campaign_task_id; bool has_calibration_scope; uint64_t calibration_scope_id; Lardon3DProjectDbSelectedExecutionStage stage; uint32_t next_item_index; uint32_t item_count; int64_t created_at; } Lardon3DProjectDbSelectedExecution; typedef enum { /* The selected representation is an existing source image; no RAW * development identity is present or may be inferred later. */ LARDON3D_SELECTED_REPRESENTATION_SOURCE_IMAGE = 1, /* source_asset_id explicitly identifies the Capture-owned SOURCE RAW whose * deterministic S3-B1 representation is required. */ LARDON3D_SELECTED_REPRESENTATION_RAW_ASSET = 2, } Lardon3DProjectDbSelectedRepresentationSource; typedef struct { uint32_t item_index; uint32_t quality_group_id; uint32_t campaign_group_id; uint64_t capture_id; Lardon3DProjectDbSelectedRepresentationSource representation_source; uint64_t source_asset_id; bool has_image; uint64_t image_id; } Lardon3DProjectDbSelectedExecutionItem; typedef struct { uint64_t scanset_id; char name[LARDON3D_PROJECT_DB_SCANSET_NAME_CAPACITY]; int64_t created_at; int64_t updated_at; } Lardon3DProjectDbScanSet; typedef enum { LARDON3D_DB_IMAGE_ASSET_READY = 1 } Lardon3DProjectDbImageAssetState; typedef struct { uint64_t asset_id; unsigned char sha256[LARDON3D_PROJECT_DB_SHA256_SIZE]; char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t size_bytes; Lardon3DProjectDbImageAssetState state; int64_t created_at; } Lardon3DProjectDbImageAsset; typedef struct { uint64_t image_id; uint64_t scanset_id; uint64_t asset_id; char original_name[LARDON3D_PROJECT_DB_IMAGE_NAME_CAPACITY]; char source_path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; bool has_producer_task; uint64_t producer_task_id; int64_t imported_at; } Lardon3DProjectDbImage; typedef struct { uint64_t capture_id; uint64_t scanset_id; int64_t created_at; } Lardon3DProjectDbCapture; typedef enum { LARDON3D_DB_CAPTURE_ASSET_SOURCE = 1, LARDON3D_DB_CAPTURE_ASSET_DERIVED = 2, } Lardon3DProjectDbCaptureAssetRole; typedef struct { uint64_t capture_id; uint64_t asset_id; Lardon3DProjectDbCaptureAssetRole role; } Lardon3DProjectDbCaptureAsset; typedef enum { LARDON3D_DB_CAPTURE_SOURCE_JPEG = 1, LARDON3D_DB_CAPTURE_SOURCE_RAW = 2, } Lardon3DProjectDbCaptureSourceKind; typedef struct { uint64_t capture_id; uint64_t asset_id; Lardon3DProjectDbCaptureSourceKind source_kind; } Lardon3DProjectDbCaptureSourceAsset; typedef enum { LARDON3D_DB_ASSET_DERIVATION_GENERIC_VERSIONED = 1, } Lardon3DProjectDbAssetDerivationKind; typedef struct { uint64_t parent_asset_id; uint64_t child_asset_id; Lardon3DProjectDbAssetDerivationKind kind; uint32_t version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; bool has_producer_task; uint64_t producer_task_id; int64_t created_at; } Lardon3DProjectDbAssetDerivation; typedef struct { uint64_t candidate_pair_id; uint64_t image_id_a; uint64_t image_id_b; int64_t created_at; } Lardon3DProjectDbCandidatePair; typedef struct { uint64_t task_id; uint64_t after_candidate_pair_id; char feature_extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t feature_extractor_version; unsigned char feature_parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; int matcher_kind; float ratio_threshold; } Lardon3DProjectDbMatcherTask; typedef struct { uint64_t task_id; uint64_t after_match_result_id; double threshold_pixels; double confidence; uint32_t max_iterations; uint32_t min_inlier_count; double min_inlier_ratio; uint32_t seed_policy_version; uint32_t canonicalization_version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; } Lardon3DProjectDbGeometricVerifierTask; typedef struct { uint64_t task_id; char builder_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t builder_version; unsigned char builder_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; int verifier_kind; uint32_t verifier_version; unsigned char verifier_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; unsigned char input_scope_hash[LARDON3D_PROJECT_DB_SHA256_SIZE]; uint64_t gvr_count; char scope_path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t scope_size_bytes; unsigned char scope_sha256[LARDON3D_PROJECT_DB_SHA256_SIZE]; uint32_t scope_format_version; } Lardon3DProjectDbTrackBuilderTask; typedef struct { uint64_t match_result_id; uint64_t candidate_pair_id; uint64_t feature_set_id_a; uint64_t feature_set_id_b; char matcher_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t matcher_version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; int result_status; uint32_t match_count; bool has_match_asset; unsigned char match_asset_sha256[LARDON3D_PROJECT_DB_SHA256_SIZE]; char match_asset_path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t match_asset_size_bytes; int64_t created_at; } Lardon3DProjectDbMatchResult; typedef enum { LARDON3D_GEOMETRIC_VERIFIER_FUNDAMENTAL = 1, } Lardon3DGeometricVerifierKind; typedef enum { LARDON3D_GEOMETRIC_REJECTED = 1, LARDON3D_GEOMETRIC_VERIFIED = 2, } Lardon3DGeometricVerificationStatus; typedef struct { uint64_t geometric_verification_result_id; uint64_t match_result_id; Lardon3DGeometricVerifierKind verifier_kind; uint32_t verifier_version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; Lardon3DGeometricVerificationStatus status; uint32_t inlier_count; size_t inlier_mask_size; unsigned char inlier_mask[LARDON3D_PROJECT_DB_INLIER_MASK_MAX]; bool has_model; double model[LARDON3D_PROJECT_DB_FUNDAMENTAL_COEFFICIENTS]; int64_t created_at; } Lardon3DProjectDbGeometricVerificationResult; typedef enum { LARDON3D_PROJECT_DB_IMAGE_REGISTERED = 0, LARDON3D_PROJECT_DB_IMAGE_ALREADY_PRESENT } Lardon3DProjectDbImageRegisterStatus; enum { LARDON3D_MATCH_RESULT_STATUS_NO_MATCH = 0, LARDON3D_MATCH_RESULT_STATUS_MATCHED = 1, }; typedef enum { LARDON3D_DB_FEATURE_ASSET_DURABLE = 0, LARDON3D_DB_FEATURE_ASSET_PUBLISHED_NOT_DURABLE = 1 } Lardon3DProjectDbFeatureDurability; typedef struct { uint64_t feature_asset_id; unsigned char sha256[32]; char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t size_bytes; Lardon3DProjectDbFeatureDurability durability; int64_t created_at; } Lardon3DProjectDbFeatureAsset; typedef struct { uint64_t feature_set_id; uint64_t image_id; uint64_t feature_asset_id; char extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t extractor_version; unsigned char parameter_fingerprint[32]; unsigned char source_image_sha256[32]; uint32_t feature_count; uint32_t descriptor_type; uint32_t descriptor_dimension; uint32_t occupied_cells; uint32_t total_cells; double coverage_ratio; double feature_density_per_megapixel; bool has_producer_task; uint64_t producer_task_id; int64_t created_at; Lardon3DProjectDbFeatureAsset asset; } Lardon3DProjectDbFeatureSet; typedef struct { uint64_t task_id; uint64_t image_id; char extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t extractor_version; uint32_t max_features; uint32_t pyramid_levels; uint32_t fast_threshold; unsigned char parameter_fingerprint[32]; } Lardon3DProjectDbFeatureExtractTask; typedef struct { uint64_t task_id; uint64_t selected_execution_id; /* Zero-based durable prefix in the immutable selected-execution order. */ uint32_t next_item_index; char extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t extractor_version; uint32_t max_features; uint32_t pyramid_levels; uint32_t fast_threshold; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; } Lardon3DProjectDbFeatureExtractBatchTask; typedef struct { uint64_t task_id; uint64_t image_id; char extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t extractor_version; uint32_t max_features; uint32_t octave_layers; double contrast_threshold; double edge_threshold; double sigma; uint32_t grid_rows; uint32_t grid_cols; uint32_t max_features_per_cell; unsigned char parameter_fingerprint[32]; } Lardon3DProjectDbSiftExtractTask; typedef struct { uint64_t feature_support_set_id; uint64_t image_id; uint64_t first_feature_set_id; uint64_t second_feature_set_id; double radius_pixels; unsigned char parameter_fingerprint[32]; uint32_t group_count; int64_t created_at; } Lardon3DProjectDbFeatureSupportSet; typedef struct { uint64_t feature_support_group_id; uint64_t feature_support_set_id; double x; double y; double distance_pixels; uint32_t support_count; bool first_member_from_second_set; uint32_t first_feature_index; bool has_second_feature; uint32_t second_feature_index; } Lardon3DProjectDbFeatureSupportGroup; typedef enum { LARDON3D_DB_VISUAL_INDEX_DURABLE = 0, LARDON3D_DB_VISUAL_INDEX_PUBLISHED_NOT_DURABLE = 1 } Lardon3DProjectDbVisualIndexDurability; typedef struct { uint64_t visual_index_id; char index_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t index_version; uint32_t descriptor_type; uint32_t descriptor_dimension; char extractor_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t extractor_version; unsigned char feature_parameter_fingerprint[32]; unsigned char index_parameter_fingerprint[32]; uint32_t table_count; uint32_t key_bits; uint32_t max_features_per_set; uint32_t max_bucket_postings; int64_t created_at; } Lardon3DProjectDbVisualIndex; typedef struct { uint64_t visual_index_segment_id; uint64_t visual_index_id; uint64_t generation; unsigned char sha256[32]; char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]; uint64_t size_bytes; uint64_t posting_count; uint32_t feature_set_count; Lardon3DProjectDbVisualIndexDurability durability; bool has_producer_task; uint64_t producer_task_id; int64_t created_at; } Lardon3DProjectDbVisualIndexSegment; typedef struct { uint64_t task_id; uint64_t visual_index_id; uint64_t after_feature_set_id; } Lardon3DProjectDbVisualIndexUpdateTask; typedef struct { uint64_t task_id; uint64_t visual_index_id; uint64_t after_feature_set_id; uint32_t top_k; uint32_t minimum_evidence_count; int scanset_filter; bool exclude_same_asset; } Lardon3DProjectDbCandidatePairGenerateTask; typedef struct { uint64_t feature_set_id; uint32_t feature_index; uint32_t position_in_track; } Lardon3DProjectDbTrackObservation; typedef struct { uint64_t track_id; uint64_t track_set_id; uint32_t observation_count; Lardon3DProjectDbTrackObservation *observations; } Lardon3DProjectDbTrack; typedef struct { uint64_t track_set_id; char builder_kind[LARDON3D_PROJECT_DB_KIND_CAPACITY]; uint32_t builder_version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; int verifier_kind; uint32_t verifier_version; unsigned char verifier_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; unsigned char input_scope_hash[LARDON3D_PROJECT_DB_SHA256_SIZE]; uint64_t gvr_count; uint64_t track_count; int64_t created_at; } Lardon3DProjectDbTrackSet; typedef struct { uint64_t task_id; uint64_t track_set_id; uint64_t calibration_scope_id; uint32_t sfm_kind; uint32_t sfm_version; Lardon3DSparseIncrementalParameters parameters; } Lardon3DProjectDbSparseSfmTask; typedef struct { uint64_t task_id; uint64_t base_reconstruction_id; uint64_t extension_track_set_id; uint64_t calibration_scope_id; uint32_t incremental_kind; uint32_t incremental_version; unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE]; } Lardon3DProjectDbIncrementalReconstructionTask; void lardon3d_project_db_free_track(Lardon3DProjectDbTrack *track); Lardon3DProjectDbResult lardon3d_project_db_create_track_set( Lardon3DProjectDb *database, const Lardon3DProjectDbTrackSet *configuration, const Lardon3DProjectDbTrack *tracks, size_t track_count, Lardon3DProjectDbTrackSet *published); Lardon3DProjectDbResult lardon3d_project_db_load_track_set( Lardon3DProjectDb *database, uint64_t track_set_id, Lardon3DProjectDbTrackSet *track_set); Lardon3DProjectDbResult lardon3d_project_db_find_track_set( Lardon3DProjectDb *database, const Lardon3DProjectDbTrackSet *identity, Lardon3DProjectDbTrackSet *track_set); Lardon3DProjectDbResult lardon3d_project_db_list_track_sets( Lardon3DProjectDb *database, uint64_t after_track_set_id, Lardon3DProjectDbTrackSet *track_sets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_load_track( Lardon3DProjectDb *database, uint64_t track_id, Lardon3DProjectDbTrack *track); Lardon3DProjectDbResult lardon3d_project_db_list_tracks( Lardon3DProjectDb *database, uint64_t track_set_id, uint64_t after_track_id, Lardon3DProjectDbTrack *tracks, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_find_track_by_observation( Lardon3DProjectDb *database, uint64_t track_set_id, uint64_t feature_set_id, uint32_t feature_index, Lardon3DProjectDbTrack *track); Lardon3DProjectDbResult lardon3d_project_db_open(const char *path, Lardon3DProjectDb **database, char error[LARDON3D_PROJECT_DB_ERROR_CAPACITY]); /* Copies the filename of the durable main database opened by this handle. * The caller owns `path`, whose capacity must be at least * LARDON3D_PROJECT_DB_PATH_CAPACITY. This identity lets private reader handles * reopen the selected database without inferring a project-relative basename. */ bool lardon3d_project_db_copy_path( Lardon3DProjectDb *database, char path[LARDON3D_PROJECT_DB_PATH_CAPACITY]); void lardon3d_project_db_close(Lardon3DProjectDb *database); bool lardon3d_project_db_last_error(Lardon3DProjectDb *database, char error[LARDON3D_PROJECT_DB_ERROR_CAPACITY]); Lardon3DProjectDbResult lardon3d_project_db_legacy_catalog_pending(Lardon3DProjectDb *database, bool *pending); unsigned int lardon3d_project_db_schema_version(Lardon3DProjectDb *database); Lardon3DProjectDbResult lardon3d_project_db_set_project(Lardon3DProjectDb *database, const Lardon3DProjectDbProject *project); Lardon3DProjectDbResult lardon3d_project_db_get_project(Lardon3DProjectDb *database, Lardon3DProjectDbProject *project); Lardon3DProjectDbResult lardon3d_project_db_record_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_record_image_import_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const char *source_path, uint64_t scanset_id, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_create_scanset(Lardon3DProjectDb *database, const char *name, Lardon3DProjectDbScanSet *scanset); Lardon3DProjectDbResult lardon3d_project_db_load_scanset(Lardon3DProjectDb *database, uint64_t scanset_id, Lardon3DProjectDbScanSet *scanset); Lardon3DProjectDbResult lardon3d_project_db_list_scansets(Lardon3DProjectDb *database, uint64_t after_scanset_id, Lardon3DProjectDbScanSet *scansets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_register_image( Lardon3DProjectDb *database, uint64_t scanset_id, const unsigned char sha256[LARDON3D_PROJECT_DB_SHA256_SIZE], const char *asset_path, uint64_t size_bytes, const char *original_name, const char *source_path, uint64_t producer_task_id, int64_t imported_at, Lardon3DProjectDbImageRegisterStatus *status, Lardon3DProjectDbImage *image); Lardon3DProjectDbResult lardon3d_project_db_register_image_asset( Lardon3DProjectDb *database, const unsigned char sha256[LARDON3D_PROJECT_DB_SHA256_SIZE], const char *asset_path, uint64_t size_bytes, int64_t created_at, Lardon3DProjectDbImageAsset *asset); /* Load one immutable managed asset by its explicit durable ID. The caller owns * output storage. The returned relative path is validated and NUL-terminated; * this API performs no Capture/source identity discovery. */ Lardon3DProjectDbResult lardon3d_project_db_load_image_asset( Lardon3DProjectDb *database, uint64_t asset_id, Lardon3DProjectDbImageAsset *asset); Lardon3DProjectDbResult lardon3d_project_db_publish_derived_capture_image( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t asset_id, const char *original_name, const char *source_path, uint64_t producer_task_id, int64_t imported_at, Lardon3DProjectDbImageRegisterStatus *status, Lardon3DProjectDbImage *image); Lardon3DProjectDbResult lardon3d_project_db_publish_source_capture_image( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t asset_id, const char *original_name, const char *source_path, uint64_t producer_task_id, int64_t imported_at, bool select_image, Lardon3DProjectDbImageRegisterStatus *status, Lardon3DProjectDbImage *image); Lardon3DProjectDbResult lardon3d_project_db_load_image(Lardon3DProjectDb *database, uint64_t image_id, Lardon3DProjectDbImage *image, Lardon3DProjectDbImageAsset *asset); Lardon3DProjectDbResult lardon3d_project_db_list_images(Lardon3DProjectDb *database, uint64_t scanset_id, uint64_t after_image_id, Lardon3DProjectDbImage *images, Lardon3DProjectDbImageAsset *assets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_count_images(Lardon3DProjectDb *database, uint64_t scanset_id, uint64_t *count); Lardon3DProjectDbResult lardon3d_project_db_create_capture( Lardon3DProjectDb *database, uint64_t scanset_id, int64_t created_at, Lardon3DProjectDbCapture *capture); Lardon3DProjectDbResult lardon3d_project_db_load_capture( Lardon3DProjectDb *database, uint64_t capture_id, Lardon3DProjectDbCapture *capture); Lardon3DProjectDbResult lardon3d_project_db_list_captures( Lardon3DProjectDb *database, uint64_t scanset_id, uint64_t after_capture_id, Lardon3DProjectDbCapture *captures, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_attach_capture_asset( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t asset_id, Lardon3DProjectDbCaptureAssetRole role); Lardon3DProjectDbResult lardon3d_project_db_attach_capture_source_asset( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t asset_id); /* Atomically attach an existing asset as SOURCE and retain the explicit source * kind observed by S3-E. Exact retry is idempotent; a different kind conflicts. * This provenance must never be synthesized from path, name, SHA-256, * attachment order, or image identity. */ Lardon3DProjectDbResult lardon3d_project_db_record_capture_source_asset( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t asset_id, Lardon3DProjectDbCaptureSourceKind source_kind); /* Lists only explicitly retained source-kind relations. Captures migrated from * v21 may truthfully return an empty page; absence is not permission to infer. */ Lardon3DProjectDbResult lardon3d_project_db_list_capture_source_assets( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t after_asset_id, Lardon3DProjectDbCaptureSourceAsset *assets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_list_capture_assets( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t after_asset_id, Lardon3DProjectDbCaptureAsset *assets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_attach_capture_image( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t image_id); Lardon3DProjectDbResult lardon3d_project_db_find_capture_for_image( Lardon3DProjectDb *database, uint64_t image_id, Lardon3DProjectDbCapture *capture); Lardon3DProjectDbResult lardon3d_project_db_record_asset_derivation( Lardon3DProjectDb *database, const Lardon3DProjectDbAssetDerivation *derivation); Lardon3DProjectDbResult lardon3d_project_db_load_asset_derivation( Lardon3DProjectDb *database, uint64_t child_asset_id, Lardon3DProjectDbAssetDerivation *derivation); Lardon3DProjectDbResult lardon3d_project_db_set_selected_capture_image( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t image_id); Lardon3DProjectDbResult lardon3d_project_db_get_selected_capture_image( Lardon3DProjectDb *database, uint64_t capture_id, uint64_t *image_id); Lardon3DProjectDbResult lardon3d_project_db_create_candidate_pair( Lardon3DProjectDb *database, uint64_t image_id_a, uint64_t image_id_b, int64_t created_at, Lardon3DProjectDbCandidatePair *pair); Lardon3DProjectDbResult lardon3d_project_db_load_candidate_pair( Lardon3DProjectDb *database, uint64_t candidate_pair_id, Lardon3DProjectDbCandidatePair *pair); Lardon3DProjectDbResult lardon3d_project_db_find_candidate_pair( Lardon3DProjectDb *database, uint64_t image_id_a, uint64_t image_id_b, Lardon3DProjectDbCandidatePair *pair); Lardon3DProjectDbResult lardon3d_project_db_list_candidate_pairs( Lardon3DProjectDb *database, uint64_t after_candidate_pair_id, Lardon3DProjectDbCandidatePair *pairs, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_load_image_import(Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbImageImport *parameters); /* Atomically record generic Task/checkpoint state and one immutable typed * campaign request for an existing ScanSet. All pointers are required except * checkpoint; request bytes are borrowed only for the call. task_kind/version * must exactly identify acquisition_campaign.run/v1. Exact replay is * idempotent, while a changed request or generic kind conflicts. The cursor is * the zero-based next-work position and never a Capture or scientific image * identity. */ Lardon3DProjectDbResult lardon3d_project_db_record_acquisition_campaign_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbAcquisitionCampaignTask *parameters, int64_t updated_at); /* Load and validate the typed campaign row and its exact generic kind/version. * With request==NULL and request_capacity==0, this is a size probe: metadata * and request_size are returned while parameters->request remains NULL. * Otherwise request is required caller-owned storage borrowed into parameters * on success. Insufficient capacity returns CONSTRAINT without truncation; * malformed SQLite types, signs, bounds, cursor relation, dispatch identity, or * a retained mapping set other than the exact one-based prefix 1..next_group_id * return CORRUPT. Every retained Capture must still exist in this campaign's * ScanSet; validation is bounded by the frozen 4096-group maximum. */ Lardon3DProjectDbResult lardon3d_project_db_load_acquisition_campaign_task( Lardon3DProjectDb *database, uint64_t task_id, unsigned char *request, size_t request_capacity, Lardon3DProjectDbAcquisitionCampaignTask *parameters); /* Retain the explicit one-based group_id -> capture_id mapping and advance the * zero-based next-work position atomically. next_group_id must equal group_id; * exact retry is idempotent, conflicting identity/order is rejected. Before * mutation, the generic kind/version, SQLite storage classes and complete * retained prefix are validated signed-wide; malformed durable state returns * CORRUPT, while a valid caller conflict returns CONSTRAINT. The Capture must * already exist in the campaign ScanSet. In v23, any explicit group optical * assignment is copied to Capture provenance in this same transaction before * cursor publication; an unassigned group remains honestly unresolved. Generic * Task progress may advance only after this call succeeds. */ Lardon3DProjectDbResult lardon3d_project_db_retain_acquisition_campaign_capture( Lardon3DProjectDb *database, uint64_t task_id, uint32_t group_id, uint64_t capture_id, uint32_t next_group_id); /* Load one explicit retained mapping into caller-owned output. task_id and * group_id must be positive; persisted SQLite types, bounds, Capture identity, * plan range, zero-based cursor, exact durable prefix, Capture ScanSet, and * generic campaign kind/version are validated before narrowing. A mapping ahead * of the cursor or across ScanSets is CORRUPT and never yields a resume ID. No * identity is inferred from request bytes or metadata. */ Lardon3DProjectDbResult lardon3d_project_db_load_acquisition_campaign_capture( Lardon3DProjectDb *database, uint64_t task_id, uint32_t group_id, Lardon3DProjectDbAcquisitionCampaignCapture *capture); /* Atomically record generic Task state and the immutable typed request for an * existing ScanSet. All pointers are required except checkpoint; request bytes * are borrowed only for the call. task_kind/version must exactly identify * photo_quality.triage/v1. The request identifies campaign groups operationally * and never creates or infers Capture/Asset/image identities. */ Lardon3DProjectDbResult lardon3d_project_db_record_photo_quality_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbPhotoQualityTask *parameters, int64_t updated_at); /* On success, parameters receives validated one-based cursor/count fields and * borrows caller-owned request storage containing the immutable request bytes. * The generic kind/version and existing ScanSet identity must match exactly. * For otherwise valid arguments, any non-OK result zeroes parameters and leaves * request storage untouched. A present typed row with a missing parent is * CORRUPT, not NOT_FOUND; insufficient capacity is also CORRUPT, never truncated. */ Lardon3DProjectDbResult lardon3d_project_db_load_photo_quality_task( Lardon3DProjectDb *database, uint64_t task_id, unsigned char *request, size_t request_capacity, Lardon3DProjectDbPhotoQualityTask *parameters); /* Atomically persist generic Task/checkpoint state with one immutable explicit * Capture/SOURCE RAW identity and its monotonic publication phase. The caller * must pass `task_kind` == `LARDON3D_RAW_DEVELOPMENT_TASK_KIND` and * `task_kind_version` == `LARDON3D_RAW_DEVELOPMENT_TASK_KIND_VERSION`. * Any mismatch is rejected with INVALID_ARGUMENT because generic Task dispatch and * typed durable payload must remain coherent across restart. PUBLISHED requires * the exact derived image retained by that Capture; exact retries are idempotent * and another identity or image conflicts. */ Lardon3DProjectDbResult lardon3d_project_db_record_raw_development_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbRawDevelopmentTask *parameters, int64_t updated_at); /* Load and validate one durable RAW Task. Persisted durable rows with * `task_kind`/`task_kind_version` not equal to * `LARDON3D_RAW_DEVELOPMENT_TASK_KIND`/`LARDON3D_RAW_DEVELOPMENT_TASK_KIND_VERSION` * are corrupted durable state and return CORRUPT, preserving the contract that * typed durable payload and generic Task identity never silently diverge. * Invalid phases, missing explicit RAW provenance, or a published image outside * the retained Capture are also reported as corrupt durable state; no source * identity is inferred. */ Lardon3DProjectDbResult lardon3d_project_db_load_raw_development_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbRawDevelopmentTask *parameters); /* Atomically record generic raw.develop.batch/1 state and its immutable link * to one selected execution. Exact retry is idempotent; rebinding either a * Task or selected execution conflicts. The selected execution cursor remains * the sole durable item-progress authority. */ Lardon3DProjectDbResult lardon3d_project_db_record_raw_development_batch_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbRawDevelopmentBatchTask *parameters, int64_t updated_at); /* Load the caller-owned immutable Task -> selected-execution association. * Malformed integer storage or a generic kind/version mismatch is corruption; * no item identity or cursor is inferred from other durable state. */ Lardon3DProjectDbResult lardon3d_project_db_load_raw_development_batch_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbRawDevelopmentBatchTask *parameters); /* Result publication and next_group_id advance are atomic. result->group_id is * the canonical plan ID in 1..N and must equal the task's current one-based * cursor; next_group_id must equal result->group_id+1 (N+1 after the last * group). Recovery must never checkpoint generic Task progress beyond a group * whose result is not durable. Retry converges through the retained result and * advanced cursor; neither ID is Capture, Asset, or image identity. */ Lardon3DProjectDbResult lardon3d_project_db_record_photo_quality_result( Lardon3DProjectDb *database, const Lardon3DProjectDbPhotoQualityResult *result, uint32_t next_group_id); /* Load one canonical group result into required caller-owned storage. SQLite * integer/enum/range/status relations are validated before public narrowing. */ Lardon3DProjectDbResult lardon3d_project_db_load_photo_quality_result( Lardon3DProjectDb *database, uint64_t task_id, uint32_t group_id, Lardon3DProjectDbPhotoQualityResult *result); /* Human override is deliberately separate from immutable measured metrics. * group_id is canonical and one-based; retrying the same value is idempotent. */ Lardon3DProjectDbResult lardon3d_project_db_set_photo_quality_override( Lardon3DProjectDb *database, uint64_t task_id, uint32_t group_id, Lardon3DPhotoQualityOverride override_value); /* Create an immutable, ordered QUALITY_SELECTED snapshot. Each item explicitly * bridges independent quality and campaign group namespaces to a retained * Capture; equal numeric group values never imply identity. Each item also * declares either an explicit Capture-owned SOURCE RAW asset or that its * representation is a source image and therefore has no RAW identity. The DB * validates RAW asset membership at creation and never recovers it from path, * SHA-256, basename, source index, or group number. The caller-owned item array * is borrowed only for the call. Every referenced quality result must be * effectively included and both tasks must belong to the same ScanSet. An * exact retry returns the existing execution; a changed mapping conflicts. */ Lardon3DProjectDbResult lardon3d_project_db_create_selected_execution( Lardon3DProjectDb *database, uint64_t quality_task_id, uint64_t campaign_task_id, const Lardon3DProjectDbSelectedExecutionItem *items, size_t item_count, int64_t created_at, Lardon3DProjectDbSelectedExecution *execution); /* Load durable stage/cursor state. Output is caller-owned and contains no * borrowed storage. Corrupt SQLite types, signs, bounds, or stage/cursor * relations are rejected before narrowing to the public C17 fields. */ Lardon3DProjectDbResult lardon3d_project_db_load_selected_execution( Lardon3DProjectDb *database, uint64_t execution_id, Lardon3DProjectDbSelectedExecution *execution); /* Load one immutable bridge item into caller-owned output. Required and * nullable identifiers must use SQLite INTEGER/NULL storage exactly; numeric * TEXT/REAL values are corruption even if SQLite could coerce them. */ Lardon3DProjectDbResult lardon3d_project_db_load_selected_execution_item( Lardon3DProjectDb *database, uint64_t execution_id, uint32_t item_index, Lardon3DProjectDbSelectedExecutionItem *item); /* Publish one representation mapping and advance the cursor atomically. The * image must already be explicitly associated with this item's Capture. * Retrying the exact mapping after cursor advance is idempotent; no SHA, path, * Asset, basename, or group number is used to recover identity. */ Lardon3DProjectDbResult lardon3d_project_db_record_selected_representation( Lardon3DProjectDb *database, uint64_t execution_id, uint32_t item_index, uint64_t image_id, uint32_t next_item_index); /* Attach an existing immutable calibration scope only after all selected * representations are durable and every selected image is a member. The * successful transition makes the snapshot scientifically executable; an * exact scope retry is idempotent and a different scope conflicts. */ Lardon3DProjectDbResult lardon3d_project_db_assign_selected_calibration_scope( Lardon3DProjectDb *database, uint64_t execution_id, uint64_t calibration_scope_id); Lardon3DProjectDbResult lardon3d_project_db_allocate_task_id(Lardon3DProjectDb *database, uint64_t *task_id); Lardon3DProjectDbResult lardon3d_project_db_load_task(Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbTask *task); Lardon3DProjectDbResult lardon3d_project_db_list_recoverable(Lardon3DProjectDb *database, uint64_t after_task_id, Lardon3DProjectDbTask *tasks, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_create_artifact(Lardon3DProjectDb *database, const Lardon3DProjectDbArtifact *artifact); Lardon3DProjectDbResult lardon3d_project_db_mark_artifact_ready(Lardon3DProjectDb *database, const char *artifact_id, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_artifact(Lardon3DProjectDb *database, const char *artifact_id, Lardon3DProjectDbArtifact *artifact); Lardon3DProjectDbResult lardon3d_project_db_record_feature_extract_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbFeatureExtractTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_feature_extract_task(Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbFeatureExtractTask *parameters); /* Atomically persist generic features.extract.batch/1 state and its typed * immutable selected-execution/ORB domain plus monotone cursor. A stale * generic checkpoint may repeat an older cursor but can never move it back. */ Lardon3DProjectDbResult lardon3d_project_db_record_feature_extract_batch_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbFeatureExtractBatchTask *parameters, int64_t updated_at); /* Load and validate the exact typed batch domain and generic dispatch. The * selected execution must be representation-complete and the cursor bounded by * its immutable item count; malformed durable state is CORRUPT. */ Lardon3DProjectDbResult lardon3d_project_db_load_feature_extract_batch_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbFeatureExtractBatchTask *parameters); /* Advance exactly one ordered item only after its selected image has a READY * Feature Set for the task's immutable ORB fingerprint. Exact retry after an * already committed advance converges; no image identity is inferred. */ Lardon3DProjectDbResult lardon3d_project_db_advance_feature_extract_batch_task( Lardon3DProjectDb *database, uint64_t task_id, uint32_t item_index, uint32_t next_item_index); Lardon3DProjectDbResult lardon3d_project_db_record_sift_extract_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbSiftExtractTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_sift_extract_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbSiftExtractTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_register_feature_set( Lardon3DProjectDb *database, uint64_t image_id, const char *extractor_kind, uint32_t extractor_version, const unsigned char parameter_fingerprint[32], const unsigned char source_image_sha256[32], uint32_t feature_count, uint32_t descriptor_type, uint32_t descriptor_dimension, const unsigned char asset_sha256[32], const char *asset_path, uint64_t asset_size_bytes, Lardon3DProjectDbFeatureDurability durability, uint64_t producer_task_id, int64_t created_at, Lardon3DProjectDbFeatureSet *feature_set); Lardon3DProjectDbResult lardon3d_project_db_register_feature_set_quality( Lardon3DProjectDb *database, uint64_t image_id, const char *extractor_kind, uint32_t extractor_version, const unsigned char parameter_fingerprint[32], const unsigned char source_image_sha256[32], uint32_t feature_count, uint32_t descriptor_type, uint32_t descriptor_dimension, uint32_t occupied_cells, uint32_t total_cells, double coverage_ratio, double feature_density_per_megapixel, const unsigned char asset_sha256[32], const char *asset_path, uint64_t asset_size_bytes, Lardon3DProjectDbFeatureDurability durability, uint64_t producer_task_id, int64_t created_at, Lardon3DProjectDbFeatureSet *feature_set); Lardon3DProjectDbResult lardon3d_project_db_find_feature_set(Lardon3DProjectDb *database, uint64_t image_id, const char *extractor_kind, uint32_t extractor_version, const unsigned char parameter_fingerprint[32], Lardon3DProjectDbFeatureSet *feature_set); Lardon3DProjectDbResult lardon3d_project_db_load_feature_set(Lardon3DProjectDb *database, uint64_t feature_set_id, Lardon3DProjectDbFeatureSet *feature_set); Lardon3DProjectDbResult lardon3d_project_db_list_feature_sets(Lardon3DProjectDb *database, uint64_t after_feature_set_id, Lardon3DProjectDbFeatureSet *feature_sets, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_publish_feature_support( Lardon3DProjectDb *database, const Lardon3DProjectDbFeatureSupportSet *configuration, const Lardon3DProjectDbFeatureSupportGroup *groups, size_t group_count, Lardon3DProjectDbFeatureSupportSet *published); Lardon3DProjectDbResult lardon3d_project_db_load_feature_support( Lardon3DProjectDb *database, uint64_t image_id, uint64_t first_feature_set_id, uint64_t second_feature_set_id, const unsigned char parameter_fingerprint[32], Lardon3DProjectDbFeatureSupportSet *support_set); Lardon3DProjectDbResult lardon3d_project_db_list_feature_support_groups( Lardon3DProjectDb *database, uint64_t feature_support_set_id, uint64_t after_feature_support_group_id, Lardon3DProjectDbFeatureSupportGroup *groups, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_create_visual_index( Lardon3DProjectDb *database, const Lardon3DProjectDbVisualIndex *configuration, Lardon3DProjectDbVisualIndex *visual_index); Lardon3DProjectDbResult lardon3d_project_db_load_visual_index( Lardon3DProjectDb *database, uint64_t visual_index_id, Lardon3DProjectDbVisualIndex *visual_index); Lardon3DProjectDbResult lardon3d_project_db_list_visual_index_segments( Lardon3DProjectDb *database, uint64_t visual_index_id, uint64_t after_generation, Lardon3DProjectDbVisualIndexSegment *segments, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_list_visual_index_pending( Lardon3DProjectDb *database, uint64_t visual_index_id, uint64_t after_feature_set_id, Lardon3DProjectDbFeatureSet *feature_sets, size_t capacity, size_t *count); /* Lists durable membership Feature Set IDs in ascending numeric order. The * cursor is an ID boundary, not a row count; sparse IDs are therefore valid. * `capacity` is bounded by the catalog page maximum and output storage remains * caller-owned for the duration of the call. A missing Visual Index returns * `LARDON3D_PROJECT_DB_NOT_FOUND`; malformed arguments reset `count` to zero * and return `LARDON3D_PROJECT_DB_INVALID_ARGUMENT`. */ Lardon3DProjectDbResult lardon3d_project_db_list_visual_index_memberships( Lardon3DProjectDb *database, uint64_t visual_index_id, uint64_t after_feature_set_id, uint64_t *feature_set_ids, size_t capacity, size_t *count); /* Returns the durable ordered membership rank at `after_feature_set_id` and * the total membership count. These are source-membership counts, never an * inference from the numeric Feature Set ID, and are safe for progress after * restart. Both outputs are reset to zero on entry. A missing Visual Index * returns `LARDON3D_PROJECT_DB_NOT_FOUND`. */ Lardon3DProjectDbResult lardon3d_project_db_visual_index_membership_progress( Lardon3DProjectDb *database, uint64_t visual_index_id, uint64_t after_feature_set_id, uint64_t *completed_count, uint64_t *total_count); Lardon3DProjectDbResult lardon3d_project_db_publish_visual_index_segment( Lardon3DProjectDb *database, const Lardon3DProjectDbVisualIndexSegment *segment, const uint64_t *feature_set_ids, size_t feature_set_count, Lardon3DProjectDbVisualIndexSegment *published); Lardon3DProjectDbResult lardon3d_project_db_record_visual_index_update_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbVisualIndexUpdateTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_visual_index_update_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbVisualIndexUpdateTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_candidate_pair_generate_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbCandidatePairGenerateTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_candidate_pair_generate_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbCandidatePairGenerateTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_matcher_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbMatcherTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_matcher_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbMatcherTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_geometric_verifier_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *task_kind, uint32_t task_kind_version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbGeometricVerifierTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_geometric_verifier_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbGeometricVerifierTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_track_builder_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *kind, uint32_t version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbTrackBuilderTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_track_builder_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbTrackBuilderTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_sparse_sfm_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *kind, uint32_t version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbSparseSfmTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_sparse_sfm_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbSparseSfmTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_record_incremental_reconstruction_task( Lardon3DProjectDb *database, const Lardon3DTaskDurableSnapshot *snapshot, const char *kind, uint32_t version, const Lardon3DProjectDbCheckpoint *checkpoint, const Lardon3DProjectDbIncrementalReconstructionTask *parameters, int64_t updated_at); Lardon3DProjectDbResult lardon3d_project_db_load_incremental_reconstruction_task( Lardon3DProjectDb *database, uint64_t task_id, Lardon3DProjectDbIncrementalReconstructionTask *parameters); Lardon3DProjectDbResult lardon3d_project_db_create_match_result( Lardon3DProjectDb *database, uint64_t candidate_pair_id, uint64_t feature_set_id_a, uint64_t feature_set_id_b, const char *matcher_kind, uint32_t matcher_version, const unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE], int result_status, uint32_t match_count, const unsigned char *match_asset_sha256, const char *match_asset_path, uint64_t match_asset_size_bytes, int64_t created_at, Lardon3DProjectDbMatchResult *result); Lardon3DProjectDbResult lardon3d_project_db_load_match_result( Lardon3DProjectDb *database, uint64_t match_result_id, Lardon3DProjectDbMatchResult *result); Lardon3DProjectDbResult lardon3d_project_db_repair_match_result( Lardon3DProjectDb *database, uint64_t match_result_id, int result_status, uint32_t match_count, const unsigned char *match_asset_sha256, const char *match_asset_path, uint64_t match_asset_size_bytes, Lardon3DProjectDbMatchResult *result); Lardon3DProjectDbResult lardon3d_project_db_find_match_result( Lardon3DProjectDb *database, uint64_t candidate_pair_id, uint64_t feature_set_id_a, uint64_t feature_set_id_b, const char *matcher_kind, uint32_t matcher_version, const unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE], Lardon3DProjectDbMatchResult *result); Lardon3DProjectDbResult lardon3d_project_db_list_match_results( Lardon3DProjectDb *database, uint64_t after_match_result_id, Lardon3DProjectDbMatchResult *results, size_t capacity, size_t *count); Lardon3DProjectDbResult lardon3d_project_db_create_geometric_verification_result( Lardon3DProjectDb *database, uint64_t match_result_id, Lardon3DGeometricVerifierKind verifier_kind, uint32_t verifier_version, const unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE], Lardon3DGeometricVerificationStatus status, uint32_t inlier_count, const unsigned char *inlier_mask, size_t inlier_mask_size, const double *model, int64_t created_at, Lardon3DProjectDbGeometricVerificationResult *result); Lardon3DProjectDbResult lardon3d_project_db_load_geometric_verification_result( Lardon3DProjectDb *database, uint64_t geometric_verification_result_id, Lardon3DProjectDbGeometricVerificationResult *result); Lardon3DProjectDbResult lardon3d_project_db_find_geometric_verification_result( Lardon3DProjectDb *database, uint64_t match_result_id, Lardon3DGeometricVerifierKind verifier_kind, uint32_t verifier_version, const unsigned char parameter_fingerprint[LARDON3D_PROJECT_DB_SHA256_SIZE], Lardon3DProjectDbGeometricVerificationResult *result); Lardon3DProjectDbResult lardon3d_project_db_list_geometric_verification_results( Lardon3DProjectDb *database, uint64_t match_result_id, uint64_t after_geometric_verification_result_id, Lardon3DProjectDbGeometricVerificationResult *results, size_t capacity, size_t *count); #endif