0.5.1-pre.002

This commit is contained in:
2026-08-09 19:34:08 +02:00
parent 816eee59a9
commit 6a680767ae
767 changed files with 12257 additions and 12195 deletions

163
ks-store/USAGE.md Normal file
View File

@@ -0,0 +1,163 @@
<!-- file: ks-store/USAGE.md -->
<!-- version: 4 -->
# Utilisation de ks-store
## Connexion PostgreSQL
```rust
let options = match ks_store::PostgresStoreOptions::new(
database_url,
10,
10_000,
true,
) {
Ok(value) => value,
Err(error) => return Err(error),
};
println!("postgres endpoint: {}", options.masked_dsn());
let store = match ks_store::PostgresStore::connect(options).await {
Ok(value) => value,
Err(error) => return Err(error),
};
```
`PostgresStoreOptions::new` valide le DSN, le nombre de connexions et le timeout. Lorsque `auto_initialize_schema` vaut `true`, la connexion applique les schémas idempotents. Utiliser `masked_dsn` ou `mask_postgres_dsn` dans les logs ; ne jamais journaliser le DSN brut.
## Diagnostics
```rust
let health = store.health_snapshot().await;
let migrations = store.migration_snapshot().await;
let backend = store.backend_diagnostics().await;
println!("health={:?}", health.status);
println!("migration={:?}", migrations.status);
println!("backend={:?}", backend.descriptor.backend);
```
Les diagnostics de tables raw, Core et decode/materialization sont également disponibles par les méthodes `*_table_diagnostics`.
```rust
let raw_tables = match store.raw_table_diagnostics().await {
Ok(value) => value,
Err(error) => return Err(error),
};
for table in raw_tables {
println!(
"table={} domain={} exists={}",
table.table_name,
table.domain,
table.exists
);
}
```
## Pagination bornée
```rust
let first_page = ks_store::PageRequest::first_page();
let next_page = match ks_store::PageRequest::new(250, 250) {
Ok(value) => value,
Err(error) => return Err(error),
};
assert_eq!(first_page.limit, ks_store::DEFAULT_PAGE_SIZE);
assert!(next_page.limit <= ks_store::MAX_PAGE_SIZE);
```
## Contrats de repositories
Les traits publics principaux sont :
- `StoreHealthStore` ;
- `RawTransactionStore` ;
- `CoreTransactionStore` ;
- `CoreExtractionStore` ;
- `DecodePipelineStore` ;
- `ProgramObservationStore` ;
- `DecodedEventStore` ;
- `MaterializedEventStore` ;
- `ProcessingLedgerStore`.
Ils permettent au pipeline de dépendre dun contrat async plutôt que dune requête SQL directe.
## Replay et requêtes bornées
```rust
let candidates = match store.replay_transaction_candidates(filter).await {
Ok(value) => value,
Err(error) => return Err(error),
};
for candidate in candidates {
println!(
"signature={} slot={}",
candidate.signature,
candidate.slot
);
}
```
```rust
let programs = match store.replay_program_summaries(program_filter).await {
Ok(value) => value,
Err(error) => return Err(error),
};
let entities = match store.replay_entity_summaries(entity_filter).await {
Ok(value) => value,
Err(error) => return Err(error),
};
println!("programs={}, entities={}", programs.len(), entities.len());
```
Les filtres refusent les limites nulles ou supérieures aux bornes publiques. `PageRequest` impose également `DEFAULT_PAGE_SIZE` et `MAX_PAGE_SIZE`.
## Transactions atomiques
Les bundles `CoreExtractionBundle`, `DecodePersistenceBundle` et `MaterializationPersistenceBundle` regroupent les écritures qui doivent réussir ou être annulées ensemble. Les consommateurs ne doivent pas reproduire manuellement ces transactions avec des écritures isolées.
## Validation des noms de tables
```rust
if let Err(error) = ks_store::validate_raw_store_table_names() {
return Err(error);
}
if let Err(error) = ks_store::validate_core_store_table_names() {
return Err(error);
}
if let Err(error) = ks_store::validate_decode_store_table_names() {
return Err(error);
}
assert!(ks_store::is_valid_solana_table_name(
ks_store::CORE_TRANSACTIONS_TABLE_NAME
));
```
## Schéma et tables
Les constantes `RAW_STORE_TABLE_NAMES`, `CORE_STORE_TABLE_NAMES` et `DECODE_STORE_TABLE_NAMES` exposent les noms canoniques. Les fonctions `validate_*_table_names` et `is_valid_solana_table_name` servent aux audits et outils dadministration.
## Erreurs et invariants
Toutes les APIs utilisent `ks_core::Result`. Les DTO valident notamment les signatures, chemins, Program IDs, clés, montants, états de traitement et identités de ledger. Les erreurs de contrat peuvent être construites avec `storage_contract_error`.
## Tests instructifs
- les tests `*_rejects_*` documentent les invariants des DTO et filtres ;
- `decoded_events_and_ledger_roll_back_together` vérifie latomicité ;
- `optional_postgres_*_from_env` couvre les parcours réels lorsque lenvironnement PostgreSQL est configuré ;
- les tests de schéma vérifient les noms, index, contraintes et migrations.
## Limites
- backend actif : PostgreSQL ;
- les tests réels sont optionnels sans DSN de test ;
- la crate ne prend aucune décision de décodage ou de matérialisation.