Este repositório contém a implementação de um sistema em C para gerenciar arquivos de dados binários, executando operações análogas aos comandos SQL CREATE INDEX, SELECT (WHERE), DELETE, INSERT e UPDATE. O código segue rigorosamente as especificações didáticas da disciplina de Organização de Arquivos (SCC0215), garantindo consistência, performance e manutenibilidade.
Gerenciar eficientemente operações de consulta, inserção, remoção e atualização em arquivos de dados binários, com e sem o suporte de índices, assegurando:
- Consistência transacional: mecanismos de status para evitar corrupção de arquivos em caso de falhas (travamento, queda de energia).
- Modularidade: separação clara entre lógica de entrada/saída, manipulação de arquivos de dados e índices, e implementação das funcionalidades.
- Tratamento de valores nulos e reutilização de espaço de registros logicamente removidos.
- Melhorias de desempenho por meio de índices lineares quando disponíveis, e busca sequencial quando não.
A solução é organizada em módulos bem definidos:
- manipulacao: Biblioteca genérica para abstrair operações em arquivos de dados (
ArqDados) e índices (ArqIndex), incluindo alocação, leitura de cabeçalhos, manipulação de vetores de índices, ordenação e escrita em disco. - auxiliares: Funções utilitárias para leitura de parâmetros, tratamento de strings com aspas, exibição de erros e interface com a função
binarioNaTela()para saída binária automatizada. - funcionalidades: Implementação de cada operação (funções
create_index(),where(),delete_from(),insert_into(),update()) seguindo padrões:- Leitura e validação de parâmetros de entrada.
- Abertura de arquivos em modos apropriados (leitura, escrita, atualização).
- Verificação de consistência (
statusnos cabeçalhos). - Uso de callbacks (
FncAcao,FncFinaliza) para aplicar ações genéricas sobre registros. - Escrita de alterações e reescrita de índices conforme necessário.
- main.c: Ponto de entrada que seleciona a funcionalidade com base em código lido da entrada padrão.
- Leitura dos parâmetros obrigatórios (arquivos, campo indexado, tipo de dado, número de operações).
- Inicialização das estruturas via
alocar_arq_dados()ealocar_arq_index(). - Abertura dos arquivos de dados e índice nos modos corretos.
- Validação de consistência: aborta com mensagem de erro se algum arquivo estiver inconsistente.
- Processamento:
- Para consultas (
where): busca binária via índice ou busca sequencial. - Para modificações (insert/delete/update): atualização de registros e do vetor de índices em memória.
- Para consultas (
- Reescrita dos arquivos de índice e cabeçalhos, ajustando campos de status e contadores.
- Saída binária usando
binarioNaTela()para validação automática.
- Modularização em camadas: cada responsabilidade (I/O, lógica de negócios, estrutura de dados) em arquivos separados.
- Abstração: tipos opacos (
ArqDados_t,ArqIndex_t) e funções de alto nível escondem detalhes de implementação. - Flexibilidade: uso de callback functions para definir ações genéricas sobre registros, facilitando extensões futuras.
- Documentação: comentários em nível de funções, parâmetros e blocos, explicando fluxos internos.
- Tratamento robusto de erros: verificações após cada operação crítica, com saída padronizada.
- Reutilização de espaço: abordagem estática para reaproveitar registros logicamente removidos, reduzindo fragmentação.
- Compilar:
make all
2. **Executar** (exemplos):
```bash
./programaTrab 3 dados.bin id inteiro indice.bin # Criar índice
./programaTrab 4 dados.bin id inteiro indice.bin 2 # Consultar registros
./programaTrab 5 dados.bin id inteiro indice.bin 3 # Remover registros
./programaTrab 6 dados.bin id inteiro indice.bin 2 # Inserir registros
./programaTrab 7 dados.bin id inteiro indice.bin 1 # Atualizar registros
```
## Licença
Este projeto é parte das atividades da disciplina SCC0215 e está disponível para fins educacionais.
```
```