📄 todo_record.c
字号:
/* * Copyright (C) 2000 EmSoft Limited (www.emsoftltd.com) * * <Description of the file> * */#include <stdlib.h>#include <string.h>#include <stdio.h>#include "todo_record.h"#define setLength(sum, array, size) \ array = size; \ sum += array;#define memcpy_with_offset(desc, src, size, ptr) \ memcpy(desc, src, size); \ ptr += size;#define memcpy_offset_desc(desc, src, size) memcpy_with_offset(desc, src, size, desc)#define memcpy_offset_src(desc, src, size) memcpy_with_offset(desc, src, size, src)static int memopad_record_size(Todo *todo, int *fieldSizes) { int sum = 0; setLength(sum, fieldSizes[0], sizeof(int)); setLength(sum, fieldSizes[1], sizeof(short)); setLength(sum, fieldSizes[2], sizeof(gboolean)); setLength(sum, fieldSizes[3], sizeof(long)); setLength(sum, fieldSizes[4], strlen(todo->title) + 1); return sum + sizeof(int) * NUM_OF_FIELDS + 1;}static int serialize(Todo *todo, char**raw_data) { int length; int sizes[NUM_OF_FIELDS]; char *ptr; length = memopad_record_size(todo, sizes); *raw_data = g_new0(char, length); ptr = *raw_data; memcpy_offset_desc(ptr, sizes, sizeof(int) * NUM_OF_FIELDS); memcpy_offset_desc(ptr, &(todo->todo_id), sizes[0]); memcpy_offset_desc(ptr, &(todo->priority), sizes[1]); memcpy_offset_desc(ptr, &(todo->completed), sizes[2]); memcpy_offset_desc(ptr, &(todo->dueDate), sizes[3]); memcpy_offset_desc(ptr, todo->title, sizes[4]); return length;}void deserialize(Todo **todo, char *raw_data) { int sizes[NUM_OF_FIELDS]; char *ptr; ptr = raw_data; *todo = g_new0(Todo, 1); memcpy_offset_src(sizes, ptr, sizeof(int) * NUM_OF_FIELDS); (*todo)->title = g_new0(char, sizes[4]); memcpy_offset_src(&((*todo)->todo_id), ptr, sizes[0]); memcpy_offset_src(&((*todo)->priority), ptr, sizes[1]); memcpy_offset_src(&((*todo)->completed), ptr, sizes[2]); memcpy_offset_src(&((*todo)->dueDate), ptr, sizes[3]); memcpy_offset_src((*todo)->title, ptr, sizes[4]);}int todo_record_db_open() { int context; //char *filename; //char *path; /* path = getenv("DATABASE_PATH"); if (path != NULL) { filename = g_strconcat(path, "/", TODO_DATABASE, NULL); } else { filename = g_strdup(TODO_DATABASE); }*/ //printf("%s: database file = %s\n", __FUNCTION__, filename); context = db_open(TODO_DATABASE, DB_WRITER | DB_CREATE_IF_NOT_EXIST); //g_free(filename); return context;}void todo_record_db_close(int context) { db_close(context);}void todo_record_close(int context, Todo *todo) { if (todo->dirty) todo_record_save(context, todo); g_free(todo);}Todo *todo_record_new() { Todo *todo; todo = g_new0(Todo, 1); todo->new = TRUE; return todo;}Todo *todo_record_load (int context, int key) { Todo *todo; char *raw_data; raw_data = db_fetch(context, key); g_return_val_if_fail(raw_data != NULL, NULL); deserialize(&todo, raw_data); todo->new = FALSE; todo->dirty = FALSE; free(raw_data); return todo;}int todo_record_save(int context, Todo *todo) { char *raw_data; int record_length = 0, result; if (todo->new) todo->todo_id = db_getNextKey(context); record_length = serialize(todo, &raw_data); result = db_store(context, raw_data, record_length, !(todo->new), &(todo->todo_id)); if (result == 0) { todo->dirty = FALSE; todo->new = FALSE; } free(raw_data); return result;}int todo_record_delete(int context, Todo *todo) { int result; g_return_val_if_fail(todo != NULL, -1); result = db_delete(context, todo->todo_id); return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -