13 changed files with 539 additions and 2 deletions
-
2configure.ac
-
43include/storage.h
-
51include/user.h
-
7src/Makefile.am
-
7src/storage/Makefile.am
-
53src/storage/get.c
-
41src/storage/put.c
-
69src/storage/storage.c
-
7src/user/Makefile.am
-
64src/user/load.c
-
48src/user/save.c
-
90src/user/user.c
-
59src/usertest.c
@ -0,0 +1,43 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#ifndef __STORAGE_H__ |
|||
#define __STORAGE_H__ |
|||
|
|||
#include <gdbm.h> |
|||
#include <sys/types.h> |
|||
|
|||
#include "class.h" |
|||
|
|||
|
|||
CLASS(Storage) { |
|||
GDBM_FILE gdbm; |
|||
char * db_name; |
|||
}; |
|||
|
|||
void storagePut(Storage, char *, size_t, char *, size_t); |
|||
void storageGet(Storage, char *, size_t, char **, size_t *); |
|||
|
|||
#endif // __STORAGE_H__ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
|
|||
@ -0,0 +1,51 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#ifndef __USER_H__ |
|||
#define __USER_H__ |
|||
|
|||
#include <sys/types.h> |
|||
|
|||
#include "class.h" |
|||
#include "storage.h" |
|||
|
|||
|
|||
CLASS(User) { |
|||
char * email; |
|||
char * firstname; |
|||
char * surname; |
|||
|
|||
size_t * nemail; |
|||
size_t * nfirstname; |
|||
size_t * nsurname; |
|||
}; |
|||
|
|||
User userLoad(User, Storage); |
|||
void userSave(User, Storage); |
|||
|
|||
// void userSerialize(User, void **, size_t *); |
|||
// void userDeserialize(User, void *, size_t); |
|||
|
|||
#endif // __USER_H__ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
|
|||
@ -0,0 +1,7 @@ |
|||
ACLOCAL_AMFLAGS = -I m4 |
|||
AUTOMAKE_OPTIONS = subdir-objects |
|||
|
|||
noinst_LIBRARIES = libstorage.a |
|||
|
|||
libstorage_a_SOURCES = storage.c get.c put.c |
|||
libstorage_a_CFLAGS = $(CFLAGS) -Wall -I ../../include/ |
|||
@ -0,0 +1,53 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <gdbm.h> |
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
#include <sys/types.h> |
|||
|
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
void |
|||
storageGet( |
|||
Storage this, |
|||
char * _key, size_t nkey, |
|||
char ** data, size_t * ndata) |
|||
{ |
|||
datum key = {_key, nkey}; |
|||
datum value; |
|||
|
|||
value = gdbm_fetch(this->gdbm, key); |
|||
|
|||
if (NULL != value.dptr) { |
|||
*ndata = value.dsize; |
|||
*data = memMalloc(value.dsize); |
|||
memcpy(*data, value.dptr, value.dsize); |
|||
|
|||
free(value.dptr); |
|||
} |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,41 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <gdbm.h> |
|||
#include <string.h> |
|||
#include <sys/types.h> |
|||
|
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
void |
|||
storagePut(Storage this, char * _key, size_t nkey, char * data, size_t ndata) |
|||
{ |
|||
datum key = {_key, nkey}; |
|||
datum value = {data, ndata}; |
|||
|
|||
gdbm_store(this->gdbm, key, value, GDBM_REPLACE); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,69 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <gdbm.h> |
|||
#include <string.h> |
|||
#include <sys/stat.h> |
|||
|
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
static |
|||
int |
|||
storageCtor(void * _this, va_list * params) |
|||
{ |
|||
Storage this = _this; |
|||
char * db_name = va_arg(* params, void *); |
|||
|
|||
this->db_name = memMalloc(strlen(db_name) + 1); |
|||
strcpy(this->db_name, db_name); |
|||
|
|||
this->gdbm = gdbm_open( |
|||
this->db_name, |
|||
0, |
|||
GDBM_WRCREAT, |
|||
S_IRUSR | S_IWUSR, |
|||
NULL); |
|||
|
|||
if (NULL == this->gdbm) { |
|||
return -1; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
static |
|||
void |
|||
storageDtor(void * _this) |
|||
{ |
|||
Storage this = _this; |
|||
|
|||
if (NULL != this->db_name) MEM_FREE(this->db_name); |
|||
if (NULL != this->gdbm) gdbm_close(this->gdbm); |
|||
} |
|||
|
|||
INIT_IFACE(Class, storageCtor, storageDtor, NULL); |
|||
CREATE_CLASS(Storage, NULL, IFACE(Class)); |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,7 @@ |
|||
ACLOCAL_AMFLAGS = -I m4 |
|||
AUTOMAKE_OPTIONS = subdir-objects |
|||
|
|||
noinst_LIBRARIES = libuser.a |
|||
|
|||
libuser_a_SOURCES = user.c load.c save.c |
|||
libuser_a_CFLAGS = $(CFLAGS) -Wall -I ../../include/ |
|||
@ -0,0 +1,64 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <sys/types.h> |
|||
#include <string.h> |
|||
|
|||
#include "user.h" |
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
|
|||
User |
|||
userLoad(User this, Storage storage) |
|||
{ |
|||
char * storage_data; |
|||
size_t nstorage_data; |
|||
|
|||
size_t * user_data_sizes; |
|||
|
|||
storageGet( |
|||
storage, |
|||
this->email, *this->nemail, |
|||
&storage_data, &nstorage_data); |
|||
|
|||
if (NULL == storage_data) { |
|||
return NULL; |
|||
} |
|||
|
|||
user_data_sizes = |
|||
(size_t *)(storage_data + nstorage_data - 3 * sizeof(size_t)); |
|||
|
|||
this->nemail = user_data_sizes; |
|||
this->nfirstname = user_data_sizes + 1; |
|||
this->nsurname = user_data_sizes + 2; |
|||
|
|||
this->email = storage_data; |
|||
this->firstname = this->email + *this->nemail + 1; |
|||
this->surname = this->firstname + *this->nfirstname + 1; |
|||
|
|||
return this; |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,48 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <sys/types.h> |
|||
#include <string.h> |
|||
|
|||
#include "user.h" |
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
|
|||
void |
|||
userSave(User this, Storage storage) |
|||
{ |
|||
size_t storage_size = |
|||
*this->nemail + 1 + |
|||
*this->nfirstname + 1 + |
|||
*this->nsurname + 1 + |
|||
3 * sizeof(size_t); |
|||
|
|||
storagePut( |
|||
storage, |
|||
this->email, *this->nemail, |
|||
this->email, storage_size); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,90 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2012 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include "user.h" |
|||
#include "storage.h" |
|||
#include "class.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
|
|||
static |
|||
int |
|||
userCtor(void * _this, va_list * params) |
|||
{ |
|||
User this = _this; |
|||
|
|||
char * email = va_arg(* params, char *); |
|||
|
|||
if (NULL != email) { |
|||
size_t nemail = va_arg(* params, size_t); |
|||
char * firstname = va_arg(* params, char *); |
|||
size_t nfirstname = va_arg(* params, size_t); |
|||
char * surname = va_arg(* params, char *); |
|||
size_t nsurname = va_arg(* params, size_t); |
|||
|
|||
size_t storage_size = |
|||
nemail + 1 + |
|||
nfirstname + 1 + |
|||
nsurname + 1 + |
|||
3 * sizeof(size_t); |
|||
|
|||
this->email = memMalloc(storage_size); |
|||
memcpy(this->email, email, nemail); |
|||
this->email[nemail] = '\0'; |
|||
|
|||
this->firstname = this->email + nemail + 1; |
|||
memcpy(this->firstname, firstname, nfirstname); |
|||
this->firstname[nfirstname] = '\0'; |
|||
|
|||
this->surname = this->firstname + nfirstname + 1; |
|||
memcpy(this->surname, surname, nsurname); |
|||
this->surname[nsurname] = '\0'; |
|||
|
|||
this->nemail = (size_t *)(this->surname + nsurname + 1); |
|||
*this->nemail = nemail; |
|||
|
|||
this->nfirstname = this->nemail + 1; |
|||
*this->nfirstname = nfirstname; |
|||
|
|||
this->nsurname = this->nfirstname + 1; |
|||
*this->nsurname = nsurname; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
static |
|||
void |
|||
userDtor(void * _this) |
|||
{ |
|||
User this = _this; |
|||
|
|||
if (NULL != this->email) { |
|||
MEM_FREE(this->email); |
|||
} |
|||
} |
|||
|
|||
INIT_IFACE(Class, userCtor, userDtor, NULL); |
|||
CREATE_CLASS(User, NULL, IFACE(Class)); |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,59 @@ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <gdbm.h> |
|||
#include <errno.h> |
|||
#include <string.h> |
|||
|
|||
#include "class.h" |
|||
#include "commons.h" |
|||
#include "user.h" |
|||
#include "storage.h" |
|||
|
|||
#include "utils/memory.h" |
|||
|
|||
int |
|||
main(int argc, char * argv[]) |
|||
{ |
|||
Storage users = new(Storage, CSTRA("./users.db")); |
|||
User user; |
|||
User georg; |
|||
//User steffi; |
|||
size_t nuser; |
|||
|
|||
if (NULL == users) { |
|||
fprintf(stderr, "%s\n", gdbm_strerror(gdbm_errno)); |
|||
fprintf(stderr, "%s\n", strerror(errno)); |
|||
return 1; |
|||
} |
|||
|
|||
georg = new(User, |
|||
CSTRA("georg@steffers.org"), |
|||
CSTRA("Georg"), |
|||
CSTRA("Hopp")); |
|||
|
|||
userSave(georg, users); |
|||
delete(georg); |
|||
|
|||
user = new(User, NULL); |
|||
user->email = "georg@steffers.org"; |
|||
nuser = sizeof("georg@steffers.org") - 1; |
|||
user->nemail = &nuser; |
|||
|
|||
if (NULL == userLoad(user, users)) { |
|||
fprintf(stderr, "can't find user"); |
|||
} else { |
|||
puts("found user:"); |
|||
puts(user->email); |
|||
puts(user->firstname); |
|||
puts(user->surname); |
|||
} |
|||
|
|||
delete(user); |
|||
delete(users); |
|||
|
|||
memCleanup(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
// vim: set et ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue