Skip to content

Instantly share code, notes, and snippets.

@lincerely
Last active April 9, 2020 06:20
Show Gist options
  • Save lincerely/15bc64051394a5b31c354da23af4d350 to your computer and use it in GitHub Desktop.
Save lincerely/15bc64051394a5b31c354da23af4d350 to your computer and use it in GitHub Desktop.
C by Example: GDBM
// gdbm_example.c
// CFLAGS = -Wall -Wextra -Werror -O2 -std=c99 -pedantic -lGDBM
#include <stdio.h>
#include <string.h>
#include <gdbm.h>
#include <stdlib.h>
GDBM_FILE dbf;
void read(char * keyStr) {
extern GDBM_FILE dbf;
datum key = {keyStr, strlen(keyStr)};
datum data = gdbm_fetch(dbf, key);
fprintf(stdout, "%s\n", data.dptr);
free(data.dptr);
}
void write(char * keyStr, char * valueStr) {
extern GDBM_FILE dbf;
datum key = {keyStr, strlen(keyStr)};
datum data = {valueStr, strlen(valueStr)};
gdbm_store(dbf, key, data, GDBM_REPLACE);
}
void delete(char * keyStr) {
extern GDBM_FILE dbf;
datum key = {keyStr, strlen(keyStr)};
int err = gdbm_delete(dbf, key);
if(err == -1) {
fprintf(stderr, "%s not present", keyStr);
}
}
int main (int argc, char *argv[])
{
extern GDBM_FILE gdf;
if(argc < 3) {
printf("Usage: %s DB_FILE [read|write|delete] [KEY] [VALUE]\n\n", argv[0]);
exit(1);
}
dbf = gdbm_open(argv[1], 0, GDBM_WRCREAT | GDBM_NOLOCK | GDBM_SYNC, 0664, 0);
if(!dbf){
fprintf(stderr, "Failed to create/read from %s", argv[1]);
exit(2);
}
if(argc == 4 && strcmp(argv[2], "read") == 0) {
read(argv[3]);
}else if(argc == 5 && strcmp(argv[2],"write") == 0) {
write(argv[3], argv[4]);
}else if(argc == 4 && strcmp(argv[2], "delete") == 0) {
delete(argv[3]);
}else{
printf("Usage: %s [read|write] [KEY] [VALUE]\n\n", argv[0]);
exit(1);
}
gdbm_close(dbf);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment