Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
heittpr committed Jul 11, 2021
0 parents commit 8488bfb
Show file tree
Hide file tree
Showing 3 changed files with 210 additions and 0 deletions.
111 changes: 111 additions & 0 deletions bd.c
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;
}
52 changes: 52 additions & 0 deletions main.c
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;
}
47 changes: 47 additions & 0 deletions utils.c
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);
}

0 comments on commit 8488bfb

Please sign in to comment.