diff --git a/uppsrc/Sql/Sqlexp.h b/uppsrc/Sql/Sqlexp.h index 8a7bd60aa..ea424ab7a 100644 --- a/uppsrc/Sql/Sqlexp.h +++ b/uppsrc/Sql/Sqlexp.h @@ -54,6 +54,8 @@ void td_array(SqlSet& set, const String& prefix, const char *x, int cnt); void td_var(SqlSet& set, const String& prefix, const char *x, SqlSet (*f)(const String&)); void td_shrink(String *array, int cnt); +bool EqualFields(Fields a, Fields b); + // ---------- class SqlCase { diff --git a/uppsrc/Sql/sch_header.h b/uppsrc/Sql/sch_header.h index c899c0a08..c09fa02d7 100644 --- a/uppsrc/Sql/sch_header.h +++ b/uppsrc/Sql/sch_header.h @@ -12,6 +12,8 @@ public:\ void FieldLayoutRaw(FieldOperator& f, const String& prefix = String()); \ void FieldLayout(FieldOperator& f); \ operator Fields() { return callback(this, &S_##Table::FieldLayout); } \ + bool operator==(const S_##Table& x) const { return EqualFields(const_cast(*this), const_cast(x)); } \ + bool operator!=(const S_##Table& x) const { return !EqualFields(const_cast(*this), const_cast(x)); } \ S_##Table(); #define TYPE(Table) CODETYPE(Table, __NIL) diff --git a/uppsrc/Sql/util_td.cpp b/uppsrc/Sql/util_td.cpp index d08db21fb..5551c667a 100644 --- a/uppsrc/Sql/util_td.cpp +++ b/uppsrc/Sql/util_td.cpp @@ -24,4 +24,20 @@ void td_shrink(String *array, int cnt) { } } +struct NfEqual : FieldOperator { + ValueArray va; + + virtual void Field(const char *name, Ref f) { + va.Add(f); + } +}; + +bool EqualFields(Fields a, Fields b) +{ + NfEqual fa, fb; + a(fa); + b(fb); + return fa.table == fb.table && fa.va == fb.va; +} + END_UPP_NAMESPACE