From e50ff53bdfb7c6a5ae02e8548ae19a96ec353012 Mon Sep 17 00:00:00 2001 From: elong Date: Mon, 12 Oct 2015 10:24:44 -0400 Subject: [PATCH] add table key and hashcode --- symmetric-client-clib/inc/db/model/Table.h | 2 ++ symmetric-client-clib/src/db/model/Table.c | 30 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/symmetric-client-clib/inc/db/model/Table.h b/symmetric-client-clib/inc/db/model/Table.h index 852afcf509..63a584d643 100644 --- a/symmetric-client-clib/inc/db/model/Table.h +++ b/symmetric-client-clib/inc/db/model/Table.h @@ -37,6 +37,8 @@ typedef struct SymTable { void (*copyColumnTypesFrom)(struct SymTable *this, struct SymTable *source); SymColumn * (*findColumn)(struct SymTable *this, char *name, unsigned short caseSensitive); char * (*toString)(struct SymTable *this); + int (*calculateTableHashcode)(struct SymTable *this); + char * (*getTableKey)(struct SymTable *this); void (*destroy)(struct SymTable *this); } SymTable; diff --git a/symmetric-client-clib/src/db/model/Table.c b/symmetric-client-clib/src/db/model/Table.c index 7506d775ef..dffa90b8d3 100644 --- a/symmetric-client-clib/src/db/model/Table.c +++ b/symmetric-client-clib/src/db/model/Table.c @@ -32,6 +32,34 @@ char * SymTable_getFullTableName(SymTable *this, char *delimiterToken, char *cat return sb->destroyAndReturn(sb); } +static int SymTable_calculateHashcodeForColumns(int prime, SymList *cols) { + int result = 1; + SymIterator *iter = cols->iterator(cols); + while (iter->hasNext(iter)) { + SymColumn *col = (SymColumn *) iter->next(iter); + result = prime * result + SymStringBuilder_hashCode(col->name); + result = prime * result + col->sqlType; + } + iter->destroy(iter); + return result; +} + +int SymTable_calculateTableHashcode(SymTable *this) { + int prime = 31; + int result = 1; + result = prime * result + SymStringBuilder_hashCode(this->name); + result = prime * result + SymTable_calculateHashcodeForColumns(prime, this->columns); + return result; +} + +char * SymTable_getTableKey(SymTable *this) { + char *name = SymTable_getFullTableName(this, "", ".", "."); + SymStringBuilder *sb = SymStringBuilder_newWithString(name); + sb->append(sb, "-")->appendf(sb, "%d", SymTable_calculateTableHashcode(this)); + free(name); + return sb->destroyAndReturn(sb); +} + SymColumn * SymTable_findColumn(SymTable *this, char *name, unsigned short caseSensitive) { SymColumn *column = NULL; SymIterator *iter = this->columns->iterator(this->columns); @@ -117,6 +145,8 @@ SymTable * SymTable_new(SymTable *this) { this->copyColumnTypesFrom = (void *) &SymTable_copyColumnTypesFrom; this->findColumn = (void *) &SymTable_findColumn; this->toString = (void *) &SymTable_toString; + this->calculateTableHashcode = (void *) &SymTable_calculateTableHashcode; + this->getTableKey = (void *) &SymTable_getTableKey; this->destroy = (void *) &SymTable_destroy; return this; }