#ifndef LARDON3D_PROJECT_DB_H #define LARDON3D_PROJECT_DB_H #include #include #include #include #include #include #include enum { LARDON3D_PROJECT_DB_SCHEMA_VERSION = 22, 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; 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; 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 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]); 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); 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); Lardon3DProjectDbResult lardon3d_project_db_load_acquisition_campaign_task( Lardon3DProjectDb *database, uint64_t task_id, unsigned char *request, size_t request_capacity, Lardon3DProjectDbAcquisitionCampaignTask *parameters); 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); 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. 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. * Insufficient capacity is reported as corrupt durable state, 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); /* 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); 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); 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); 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