dbutils/class.c

Thu, 27 Feb 2025 20:53:55 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 27 Feb 2025 20:53:55 +0100
changeset 19
55de75c839e8
parent 11
0aa8cbd7912e
permissions
-rw-r--r--

add dbuSimpleGetList* functions

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2024 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "class.h"
#include "field.h"

#include <string.h>
#include <stdlib.h>

#include <cx/hash_map.h>

static void field_destructor(DBUField *f) {
    if(f->destructor) {
        f->destructor(f);
    }
    free(f);
}

DBUClass* dbuClassCreate(const char *name) {
    DBUClass *cls = malloc(sizeof(DBUClass));
    memset(cls, 0, sizeof(DBUClass));
    
    cls->name = cx_strdup(cx_str(name));
    cls->fields = cxHashMapCreateSimple(CX_STORE_POINTERS);
    cls->fields->collection.simple_destructor = (cx_destructor_func)field_destructor;
    cls->obj_fields = cxHashMapCreateSimple(CX_STORE_POINTERS);
    cls->obj_fields->collection.simple_destructor = (cx_destructor_func)field_destructor;
    cls->foreign_keys = cxHashMapCreateSimple(sizeof(DBUForeignKeyField));
    
    return cls;
}

void dbuClassFree(DBUClass *cls) {
    cxMapFree(cls->fields);
    free(cls->name.ptr);
    free(cls->primary_key_column.ptr);
    free(cls);
}

void dbuClassAddField(DBUClass *cls, const char *name, DBUField *field) {
    free(field->name.ptr);
    field->name = cx_strdup(cx_str(name));
    cxMapPut(cls->fields, name, field);
}

void dbuClassAddFKField(DBUClass *cls, const char *name, DBUField *field, DBUClass *fkcls) {
    DBUForeignKeyField val;
    val.field = field;
    val.cls = fkcls;
    field->foreignKeyClass = fkcls;
    cxMapPut(cls->foreign_keys, name, &val);
    dbuClassAddField(cls, name, field);
}

void dbuClassAddObjField(DBUClass *cls, const char *name, DBUField *field, DBUClass *foreign_cls) {
    free(field->name.ptr);
    field->name = name ? cx_strdup(cx_str(name)) : (cxmutstr){NULL,0};
    cxMapPut(cls->obj_fields, foreign_cls->name, field);
}


void dbuClassSetPrimaryKeyInt32(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateInt32(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

void dbuClassSetPrimaryKeyUInt32(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateUInt32(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

void dbuClassSetPrimaryKeyInt64(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateInt64(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

void dbuClassSetPrimaryKeyUInt64(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateInt64(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

void dbuClassSetPrimaryKeyString(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateString(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

void dbuClassSetPrimaryKeyCxMutStr(DBUClass *cls, const char *column_name, off_t offset) {
    cls->primary_key_column = cx_strdup(cx_str(column_name));
    cls->primary_key = dbuFieldCreateCxMutStr(offset);
    dbuClassAddField(cls, column_name, cls->primary_key);
}

mercurial