-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 8488bfb
Showing
3 changed files
with
210 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
#include <sqlite3.h> | ||
sqlite3 *db; | ||
|
||
/* | ||
Wrapper para a função sqlite3_exec | ||
(sqlite.org/c3ref/exec.html) | ||
Executa uma query no banco e lida | ||
com os eventuais erros. | ||
*/ | ||
void executa_sql(char *sql, int (*callback)(void*,int,char**,char**), void *arg) { | ||
char *err; // mensagem de erro | ||
int cod; // código de retorno | ||
|
||
cod = sqlite3_exec(db, sql, callback, arg, &err); | ||
|
||
if (cod != SQLITE_OK) { | ||
fprintf(stderr, "%s\n", err); | ||
|
||
sqlite3_free(err); | ||
sqlite3_close(db); | ||
|
||
exit(1); | ||
} | ||
} | ||
|
||
// Inicializa o banco de dados | ||
void inicializa_banco() { | ||
sqlite3_open("bd.sqlite", &db); | ||
|
||
char *sql = " \ | ||
CREATE TABLE IF NOT EXISTS Produto ( \ | ||
Id INTEGER PRIMARY KEY, \ | ||
Nome TEXT NOT NULL, \ | ||
Preco NUMERIC NOT NULL \ | ||
); \ | ||
\ | ||
INSERT OR IGNORE INTO Produto \ | ||
(Id, Nome, Preco) \ | ||
VALUES \ | ||
(1, 'Arroz', 15.99), \ | ||
(2, 'Feijão', 4.5), \ | ||
(3, 'Óleo', 7.99), \ | ||
(4, 'Macarrão', 2.75), \ | ||
(5, 'Farinha de trigo', 4), \ | ||
(6, 'Leite', 3.2), \ | ||
(7, 'Café', 10.5), \ | ||
(8, 'Açúcar', 3.75), \ | ||
(9, 'Sal', 1.99), \ | ||
(10, 'Sabonete', 0.99); \ | ||
"; | ||
|
||
executa_sql(sql, 0, 0); | ||
} | ||
|
||
int cabecalho; | ||
|
||
// Callback para a função mostra produtos | ||
int _mostra_produtos(void *foo, int argc, char **argv, char **nomeColuna) { | ||
int tamanhoColuna[3] = {3, 18, 10}; | ||
|
||
// Imprime o cabeçalho | ||
if (!cabecalho) { | ||
for (int i = 0; i < argc; i++) | ||
imprime_tam(nomeColuna[i], tamanhoColuna[i]); | ||
|
||
printf("\n\n"); | ||
|
||
cabecalho = 1; | ||
} | ||
|
||
// Imprime a coluna | ||
for (int i = 0; i < argc; i++) | ||
imprime_tam(argv[i], tamanhoColuna[i]); | ||
|
||
printf("\n"); | ||
return 0; | ||
} | ||
|
||
// Imprime os conteúdos da tabela Produto | ||
void mostra_produtos() { | ||
cabecalho = 0; | ||
executa_sql("SELECT * FROM Produto", _mostra_produtos, 0); | ||
} | ||
|
||
// Altera o preço de um produto | ||
void altera_preco(int id, float p) { | ||
char sql[50]; | ||
sprintf(sql, "UPDATE Produto SET Preco=%f WHERE Id=%d", p, id); | ||
|
||
executa_sql(sql, 0, 0); | ||
} | ||
|
||
// Callback para a função preco | ||
int _preco(void *ponteiro, int argc, char **argv, char **nomeColuna) { | ||
// salva o resultado da query no endereço especificado | ||
float *ret = (float *)ponteiro; | ||
*ret = atof(argv[0]); | ||
|
||
return 0; | ||
} | ||
|
||
// Obtem o preço de um produto | ||
float preco(int id) { | ||
char sql[50]; | ||
sprintf(sql, "SELECT Preco FROM Produto WHERE Id=%d", id); | ||
|
||
float ret; | ||
executa_sql(sql, _preco, &ret); | ||
return ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
|
||
#include "utils.c" | ||
#include "bd.c" | ||
|
||
int main() { | ||
inicializa_banco(); | ||
|
||
while (1) { | ||
limpa_tela(); | ||
printf(" \n\ | ||
Menu \n\ | ||
\n\ | ||
(1) Alterar o valor de um produto \n\ | ||
(2) Visualizar a lista de produtos \n\ | ||
(3) Fazer pedido \n\ | ||
(4) Verificar o total vendido \n\ | ||
(5) Sair \n"); | ||
|
||
int escolha; | ||
scanf("%i", &escolha); | ||
|
||
switch (escolha) { | ||
case 1: | ||
break; | ||
|
||
case 2: | ||
limpa_tela(); | ||
mostra_produtos(); | ||
pausa(); | ||
break; | ||
|
||
case 3: | ||
break; | ||
|
||
case 4: | ||
break; | ||
|
||
case 5: | ||
limpa_tela(); | ||
exit(0); | ||
|
||
default: | ||
limpa_tela(); | ||
printf("Opção Inválida!\n"); | ||
pausa(); | ||
} | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// Limpa a tela | ||
void limpa_tela() { | ||
system("clear"); | ||
} | ||
|
||
// Limpa o buffer do teclado | ||
void limpa_buffer() { | ||
int c; | ||
|
||
do { c = getchar(); } | ||
while (c != '\n' && c != EOF); | ||
} | ||
|
||
// Espera que o usuário pressione alguma tecla | ||
void pausa() { | ||
limpa_buffer(); | ||
printf("\nPressione qualquer tecla para continuar...\n"); | ||
getchar(); | ||
} | ||
|
||
/* | ||
Conta o número de caracteres | ||
não-ASCII de uma string | ||
*/ | ||
int nao_ascii(const char *str) { | ||
int tam = 0; | ||
|
||
while (*str != '\0') { | ||
if ((*str & 0xc0) == 0x80) | ||
tam++; | ||
|
||
str++; | ||
} | ||
|
||
return tam; | ||
} | ||
|
||
/* | ||
Imprime exatamente tam caracteres | ||
de uma string adicionando espaços ou | ||
ignorando caracteres se necessário, | ||
seguida de um espaço | ||
*/ | ||
void imprime_tam(const char *str, int tam) { | ||
int k = tam + nao_ascii(str); | ||
printf("%*.*s ", -k, k, str); | ||
} |